用户关系管理系统
1.架构搭建
1.1 DAO层
1.1.1 c3p0连接池
为什么用连接池
考虑到多线程连接的问题,需要使用连接池。连接池提供多个连接,不同请求可以复用空闲的连接,当没有空闲的连接,且连接数没有到达最大限制时,那么连接池就会创建一个新的连接。当访问请求结束后,连接池并没有真正的断开连接,而是将其放入空闲队列中,这样就节省了连接数据库所需要的资源。
怎么使用连接池
c3p0连接池依赖两个jar包:c3p0-0.9.2-pre1和mchange-commons-0.2和一个配置文件:c3p0-config.xml
1.1.2 TreadLocal
ThreadLocal是什么
用一张map来管理线程,每个线程都能赋值。**
1.1.3 DBUtilis
DBUtils是什么
JDBC(见1.1.4)的封装。
1.1.3.1 QueryRunner
QueryRunner是什么
用户提供连接,sql模板和参数,QueryRunner实现对数据库的操作。
1.1.3.2 TxQueryRunner
TxQueryRunner是什么
对QueryRunner的增强,一旦连接不是当前线程(一个线程对应一个事务)中的连接,TxQueryRunner能做到将线程返回连接池。
TxQueryRunner怎么实现
通过装饰者模式来实现。列如:
`public int[] batch(String sql, Object[][] params) throws SQLException {
Connection con = JdbcUtils.getConnection();
int[] result = super.batch(con, sql, params);
JdbcUtils.releaseConnection(con);
return result;
}`
1.1.4 JDBC
JDBC是什么
一种和数据库的连接, 用java语言来生成数据库语言来对数据库实现增删改查。
1.1.4.1 JDBC事务
用
try {
con.setAutoCommit(false); //开启事务
… …. …con.commit();//最后提交事务}
catch() {
con.rollback();//回滚事务
}
来处理事务,这样一旦事务抛出异常,立刻能回滚,保证了事务的原子性。
1.1.5 JDBCUtils
JDBCUtils是什么
自定义工具类,用连接池实现连接,用于管理事务和连接。
JDBCUtlis怎么实现
开启线程,将连接信息放到TreadLocal中。如果没有连接创建连接, 如果有连接,那么得到当前连接。一旦开启业务给连接设值,提交事务时,只有连接中有值才能提交。并且提供了release方法一旦连接中的值不同,并且该连接没有关闭,那么将其关闭。
1.1.6 handler
handler是什么
handler是一种结果结果集查询器,将数据库查询结果封装到类中
1.1.7 小结
因此我们需要准备:dbutils, 自定义工具类TxQueryRunner,c3p0相关jar包,配置文件,beanutils,connnection等。
先来实现add方法,对我来说已经是大工程。。
public class CustomerDao {
//实例化TxQueryRunner类,返回值是QueryRunner类,将其定义为私有类型
private QueryRunner qr=new TxQueryRunner();
//接下来 要实现添加用户的功能
@Test
public void add(Customer c){
//首先需要得到sql模板
try {
String sql="insert into t_customer values(?,?,?,?,?,?,?)";
//先创建Object数组来存储参数
Object[] params={c.getCid(),c.getCname(),c.getSex(),c.getBirthday(),c.getCellphone(),c.getMail(),c.getDescribe()};
//然后调用qr的update方法来对数据库进行更改
qr.update(sql, params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}在这里插入代码片