三层架构是一种软件设计架构,是一种组织代码的手段和方式。
分为:
- 表示层(UI):数据的显示或数据的录入,即显示给用户看的界面
- 业务层(BLL):又叫业务逻辑层,业务的具体操作流程和约束,如转账、年龄是否为负
- 持久层(DAL):又叫数据访问层,对表的CRUD
优点:
扩展性强,复用性高,可以降低层与层之间关联,降低后期维护成本、结构更加明确,易读性高
缺点:
步骤多、代码多、效率会变低,涉及到级联操作时,可能会出现一些错误,修复可能三层都要修改、开发成本变高
一种存放数据库连接的容器,并且拥有动态新增连接、管理连接等功能于一体的容器
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
//无参
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);
Connection con=hdb.getConnection();
//使用jdbc工具类
ResultSet rs= DBUtils.executeQuery("select * from t_user",con);
while (rs.next()){
System.out.println(rs.getString("name"));
}
hdb.evictConnection(con);
执行后发现报错,是缺少slf4j的jar包,同样去maven仓库下载即可
导包后再次运行即可
地址
用处类似于之前写的JDBC工具类
语法:
JdbcTemplate 变量名= new JdbcTemplate(连接池);
JdbcTemplate内需要传一个连接池对象,因为我这里就直接传上面的hikaricp连接池
具体案例:
//2.创建JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);
用来管理事务的提交和回滚
语法:
DataSourceTransactionManager 变量名= new DataSourceTransactionManager(连接池);
具体案例:
//3.创建事务管理器
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(hikariDataSource);
用来定义事务的规则
一般用默认即可
语法:
DefaultTransactionDefinition变量名= new DefaultTransactionDefinition();
具体案例:
//4.定义一个默认的事务规则
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
用来开始事务
语法:
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所以肯定会报错,所以结果是并没有插入数据