文章目录

  • 三层架构
  • 什么是三层架构
  • 三层架构的优缺点
  • 三层架构实现
  • 目录说明
  • 连接池
  • 什么是连接池
  • 为什么要用连接池
  • 连接池的分类
  • 连接池的核心对象
  • hikaricp连接池的使用
  • 1. 导包
  • 2. 创建连接池对象
  • 3. 从连接池中获取连接
  • 4. 使用连接
  • 5. 回收连接
  • 6.报错处理
  • spring事务控制
  • 下载jar包并导入
  • 核心对象
  • Jdbc事务模板(JdbcTemplate)
  • 事务管理器(DataSourceTransactionManager)
  • 事务规则(TransactionDefinition)
  • 事务对象(TransactionStatus)
  • 事务的操作
  • 开启事务
  • 提交事务
  • 回滚事务
  • 具体案例



三层架构

什么是三层架构

三层架构是一种软件设计架构,是一种组织代码的手段和方式。
分为:

  • 表示层(UI):数据的显示或数据的录入,即显示给用户看的界面
  • 业务层(BLL):又叫业务逻辑层,业务的具体操作流程和约束,如转账、年龄是否为负
  • 持久层(DAL):又叫数据访问层,对表的CRUD

三层架构的优缺点

优点:

扩展性强,复用性高,可以降低层与层之间关联,降低后期维护成本、结构更加明确,易读性高
缺点:
步骤多、代码多、效率会变低,涉及到级联操作时,可能会出现一些错误,修复可能三层都要修改、开发成本变高

三层架构实现

目录说明

  • dao:持久层
  • entity:实体类(用来存放对象)
  • service:业务层
  • view:表示层
  • utils:工具类
  • Impl:对应的实现类

连接池

什么是连接池

一种存放数据库连接的容器,并且拥有动态新增连接、管理连接等功能于一体的容器
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

为什么要用连接池

  1. 加快连接的获取速度
  2. 合理的应用连接

连接池的分类

  • dbcp
  • c3p0
  • druid
  • hikaricp

  • 这里我们选择使用hikaricp连接池

连接池的核心对象

  • DataSource

hikaricp连接池的使用

1. 导包

  1. maven仓库加载需要的版本,我用的是4.0.3
  2. 选择view all下载jar包
  3. 去idea里面导包即可

2. 创建连接池对象

//无参
HikariDataSource hdb=new HikariDataSource();
hdb.setDriverClassName("com.mysql.cj.jdbc.Driver");
hdb.setJdbcUrl("jdbc:mysql:///jdbc?serverTimezone=UTC");
hdb.setUsername("root");
hdb.setPassword("root");
//有参
Properties pp=new Properties();
pp.load(test.class.getClassLoader().getResourceAsStream("jdbc.properties"));
HikariConfig hc=new HikariConfig(pp);
HikariDataSource db=new HikariDataSource(hc);

3. 从连接池中获取连接

Connection con=hdb.getConnection();

4. 使用连接

//使用jdbc工具类
ResultSet rs= DBUtils.executeQuery("select * from t_user",con);
while (rs.next()){
    System.out.println(rs.getString("name"));
}

5. 回收连接

hdb.evictConnection(con);

6.报错处理

执行后发现报错,是缺少slf4j的jar包,同样去maven仓库下载即可

三层两面 架构 二层三层架构是什么_开发语言


导包后再次运行即可

spring事务控制

下载jar包并导入

地址

核心对象

Jdbc事务模板(JdbcTemplate)

用处类似于之前写的JDBC工具类

  • update是CUD,类似我们写的execute
  • query则是查询,即executeQuery,返回的是一个list集合
  • queryOfObject则是select的结果为一条记录时使用,可以直接转换为实体类

语法:JdbcTemplate 变量名= new JdbcTemplate(连接池);

JdbcTemplate内需要传一个连接池对象,因为我这里就直接传上面的hikaricp连接池
具体案例:

//2.创建JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);

事务管理器(DataSourceTransactionManager)

用来管理事务的提交和回滚

语法:DataSourceTransactionManager 变量名= new DataSourceTransactionManager(连接池);

具体案例:

//3.创建事务管理器
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(hikariDataSource);

事务规则(TransactionDefinition)

用来定义事务的规则
一般用默认即可

语法:DefaultTransactionDefinition变量名= new DefaultTransactionDefinition();

具体案例:

//4.定义一个默认的事务规则
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();

事务对象(TransactionStatus)

用来开始事务

语法:TransactionStatus 变量名= new TransactionStatus (事务规则);

具体案例:

//5.获取一个事务对象(开启事务)
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);

事务的操作

开启事务

开始事务即创建一个事务对象
案例:

TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);

提交事务

提交事务需要用到事务管理器
语法: transactionManager.commit(事务对象);

回滚事务

回滚事务同样需要用到事务管理器
语法: transactionManager.rollback(事务对象);

具体案例

//1.获取配置
Properties properties = new Properties();
properties.load(Demo1.class.getClassLoader().getResourceAsStream("jdbc.properties"));
HikariConfig hikariConfig = new HikariConfig(properties);
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);

//2.创建JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);

//3.创建事务管理器
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(hikariDataSource);
//4.定义一个默认的事务规则
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
//5.获取一个事务对象(开启事务)
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);


try {
    jdbcTemplate.update("insert into t_user(name, pwd) values(?,?)", "333", "333");
    System.out.println(1/0);
    jdbcTemplate.update("insert into t_user(name, pwd) values(?,?)", "333", "333");
    //提交事务
    transactionManager.commit(transaction);
} catch (DataAccessException e) {
    e.printStackTrace();
    //回滚事务
    transactionManager.rollback(transaction);
}

由于中间有一个1/0所以肯定会报错,所以结果是并没有插入数据