学习笔记3-德鲁伊数据库连接池以及DAO-JDBC,SQL
1.JDBC
JDBC是sun公司规范的一套标准的接口,用于Java开发者用一套统一的接口去操作不同类型的数据库(MySQL,Oracle,DB2),用JDBC操作数据库时,操作哪种数据库需要相应的加载该数据库的驱动程序(Driver)。加载之后调用其Driver Manager的getConnection方法来获取一个连接。但这种方式需要自己手动的获取连接,在实际开发当中使用不多。一般在建立连接时会使用数据库连接池:
1.1数据库连接池:
类比于线程池的概念,数据库连接池就是不需要开发者手动的创建数据库连接,而是由连接池预先创建好一定数量的连接。当用户需要连接数据库时,从连接池当中取出,使用之后又将其重新放回连接池当中。常用的数据库连接池有:C3P0连接池,DBCP连接池以及Druid(德鲁伊)连接池(后称德鲁伊)。其中目前来看,德鲁伊的性能相较于C3P0,DBCP都较好些,所以当前实际开发中多用德鲁伊。
1.2德鲁伊连接池的基本使用方法:
使用之前需要先导入相应的jar包,jar包可以直接百度下载,下载之后在工程文件夹下创建一个文件夹,将jar包粘贴进文件夹,右键构建路径即可。
构建路径之后就可以使用德鲁伊的API了:
一般来说,我们会为JDBC操作数据库创建一个工具类JDBCUtils:
private static DataSource source;//静态的数据库连接池
static {//静态代码块在类加载时执行
try {
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);//读取配置文件,将配置写入druid.properties
//用德鲁伊工厂创建一个连接池
source = DruidDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {//获取连接
Connection conn = source.getConnection();
return conn;
}
public static void closeResource(Connection conn,Statement ps,ResultSet rs) {//归还连接
DbUtils.closeQuietly(conn, ps, rs);
}代码当中使用到的DbUtils也是第三方的API,其中封装了对数据库的CRUD操作。也可以百度下载jar包并导入工程当中。
druid.properties当中的配置信息填写可以参考德鲁伊的doc文档,这里贴出我的配置文件信息,仅供参考:
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true username=root password=****(不告诉你) driverClassName=com.mysql.jdbc.Driver initialSize=10 maxActive=20 maxWait=1000 filters=wall
这样配置之后德鲁伊就可以正常的使用了。
2.DAO(Data Access Object访问数据信息的类和接口)
常规开发当中,我们都会选择DAO的一种设计模式,创建一个普适性的抽象类BaseDAO,然后为每一条的记录创建一个类,即ORM编程思想:每种记录对应一个类,每条记录对应一个对象,记录当中的对应对象的属性。,而为每一种记录创建一个DAO接口,以及提供DAO接口相应的实现类。比如:查询出来的结果当中有用户信息User,那么就可以创建User类来承载用户的属性,如姓名电话等。再创建UserDAO接口当中声明对于User进行操作时的规范,再在具体的实现类UserDAOImpl当中实现相应的方法,下面以Customer类为例子上代码:
BaseDAO.java
public abstract class BaseDAO<T> {
private QueryRunner queryRunner = new QueryRunner();
private Class<T> type;
public BaseDAO() {
//获取子类的类型
Class clazz = this.getClass();
ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
Type[] types = parameterizedType.getActualTypeArguments();
this.type = (Class<T>) types[0];
}
public int update(Connection conn,String sql,Object...param) {
int count = 0;
try {
count = queryRunner.update(conn, sql, param);
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
public T getBean(Connection conn,String sql,Object...params) {
T t = null;
try {
t = queryRunner.query(conn, sql, new BeanHandler<T>(type), params);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
}
public List<T> getBeanList(Connection conn,String sql,Object...params){
List <T> list = null;
try {
list = queryRunner.query(conn, sql, new BeanListHandler<T>(type), params);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public Object getValues(Connection conn,String sql,Object...param) {
Object values = null;
try {
values = queryRunner.query(conn, sql,new ScalarHandler(),param);
} catch (SQLException e) {
e.printStackTrace();
}
return values;
}
}其中使用的QueryRunner也是DbUtils当中的类。
CustomerDAO.java,只用来规范具体方法的实现
public interface CustomerDAO {
/***
* 用来增加客户
* @author 丙醇
*/
public void add(Connection conn,customers cust);
/**
* 用来移除客户
* @author 丙醇
*/
public void removeByid(Connection conn,int id);
/**
* 用来查询一个客户的信息
* @author 丙醇
*/
public customers getCustomerByid(Connection conn,int id);
/**
* 用来获取所有客户的信息
* @author 丙醇
*/
public List<customers> getCustomers(Connection conn);
}CustomerDAOImpl.java 具体方法的实现
public class CustomerDAOImpl extends BaseDAO<customers> implements CustomerDAO{
@Override
public void add(Connection conn, customers cust) {
String sql = "insert into customers(name,email,birth) values(?,?,?)";
String name = cust.getName();
String email = cust.getEmail();
Date birth = cust.getBirth();
update(conn, sql, name,email,birth);
}
@Override
public void removeByid(Connection conn, int id) {
String sql = "delete from customers where id = ?";
update(conn, sql, id);
}
@Override
public customers getCustomerByid(Connection conn, int id) {
String sql = "select id,name,email,birth from customers where id = ?";
customers cust = (customers) getBean(conn,sql,id);
return cust;
}
@Override
public List<customers> getCustomers(Connection conn) {
String sql = "select id,name,email,birth from customers";
List<customers> cust = getBeanList(conn, sql, null);
return cust;
}
}往后的开发当中,用Java程序与数据库进行交互时应该用这样的方式。干净利落便捷,当有新的记录时,以DAO接口以及其具体的实现类为一组。一组一组的实现。当需要调用时,创建一个DAO具体实现类并调用方法即可。如上例当中创建一个CustomerDAOImpl并调用方法即可。
