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

全部评论

相关推荐

投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务