学习笔记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并调用方法即可。