文章目录
- 三层架构
- 什么是三层架构
- 三层架构的优缺点
- 三层架构实现
- 目录说明
- 连接池
- 什么是连接池
- 为什么要用连接池
- 连接池的分类
- 连接池的核心对象
- hikaricp连接池的使用
- 1. 导包
- 2. 创建连接池对象
- 3. 从连接池中获取连接
- 4. 使用连接
- 5. 回收连接
- 6.报错处理
- spring事务控制
- 下载jar包并导入
- 核心对象
- Jdbc事务模板(JdbcTemplate)
- 事务管理器(DataSourceTransactionManager)
- 事务规则(TransactionDefinition)
- 事务对象(TransactionStatus)
- 事务的操作
- 开启事务
- 提交事务
- 回滚事务
- 具体案例
三层架构
什么是三层架构
三层架构是一种软件设计架构,是一种组织代码的手段和方式。
分为:
- 表示层(UI):数据的显示或数据的录入,即显示给用户看的界面
- 业务层(BLL):又叫业务逻辑层,业务的具体操作流程和约束,如转账、年龄是否为负
- 持久层(DAL):又叫数据访问层,对表的CRUD
三层架构的优缺点
优点:
扩展性强,复用性高,可以降低层与层之间关联,降低后期维护成本、结构更加明确,易读性高
缺点:
步骤多、代码多、效率会变低,涉及到级联操作时,可能会出现一些错误,修复可能三层都要修改、开发成本变高
三层架构实现
目录说明
- dao:持久层
- entity:实体类(用来存放对象)
- service:业务层
- view:表示层
- utils:工具类
- Impl:对应的实现类
连接池
什么是连接池
一种存放数据库连接的容器,并且拥有动态新增连接、管理连接等功能于一体的容器
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
为什么要用连接池
- 加快连接的获取速度
- 合理的应用连接
连接池的分类
- dbcp
- c3p0
- druid
- hikaricp
- …
这里我们选择使用hikaricp连接池
连接池的核心对象
- DataSource
hikaricp连接池的使用
1. 导包
- 在maven仓库加载需要的版本,我用的是4.0.3
- 选择view all下载jar包
- 去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所以肯定会报错,所以结果是并没有插入数据