JDBC的进阶使用使用

JDBC的进阶使用使用

  这篇文章是关于java中的JDBC,主要涉及JDBC的进阶使用方法中的DBUtis和DBCP数据库连接池。会有一些代码的实例。我的电脑环境是win10,JDK版本1.8,数据库为mysql 5.5,所使用的IDE为IDEA2020,我会使用maven创建项目。所以在看这篇文章之前,你最好巩固一下JDBC和maven的基础使用。

数据库连接池

  我们都知道,每当我们在使用JDBC连接到数据库执行SQL语句时,都会创建一个新的线程,如果短时间内,大量的创建连接和关闭连接,就会影响系统的性能,所以引入了数据库连接池的概念。数据库连接池有点像线程池,我们打个比方,现在一个公司有很多人要用车,如果每一个人要用车的时候都去汽车公司租车再还车,就会非常麻烦。这个时候公司的秘书想出了一个点子。我们在公司成立一个车库,公司存入十辆车,每当有人需要用车的时候,就从车库里借出一辆,用完还到车库或者直接交给下一个人。这样就大大减少了员工在这方面所花的时间和精力,从而把更多的时间投入到“工作”当中。

  为了节约时间,我们就不自己写一个数据库连接池了。我直接用了DPCP连接池。了解关于DPCP的更多信息,清访问Apache官网 https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

使用数据库连接池

  首先在maven配置文件中导入包依赖。

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.7.0</version>
    </dependency>

  在工程目录下新建数据库连接池配置文件 database.properties

driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/(填写连接的数据库名)?
useUnicode=useUnicode=true&characterEncoding=utf-8&useSSL=false
username = root  //用户名
password = admin //密码
initialSize=10   //初始连接池容量
maxActive=30    //连接池最大容量

  新建工具类DataSourceUtil , 获取连接池只需要调用 getDataSource() 方法

/**
 * 数据库连接池工具类
 */
public class DataSourceUtil {
    //新建连接池
    private static DataSource dataSource;

    //静态代码块,优先于构造方法执行
    static {
        try {
            //获得配置文件输入流
            InputStream in=DataSourceUtil.class.getClassLoader().getResourceAsStream("database.properties");
            Properties properties=new Properties();
            //加载配置文件流
            properties.load(in);
            //取得数据库连接池
            dataSource= BasicDataSourceFactory.createDataSource(properties);
        }catch (Exception e){
            e.printStackTrace();
            throw new ExceptionInInitializerError("初始化DBCP失败");
        }
    }

    /**
     * 获取连接池
     * @return 连接池
     */
    public static DataSource getDataSource(){
        return dataSource;
    }

}

 Apache DbUtils工具类

  dbutils工具类可以使我们开发JDBC更加的简单,更多信息请到Apache官网上查看 https://commons.apache.org/proper/commons-dbutils/index.html

dbutils工具类的两个核心接口是 QueryRunner  ResultHandler

QueryRunner

  QueryRunner用于执行sql执行语句,可以用于对数据库的query和update操作。

ResultHandler 

  ResultHandler用于对sql语句取得的结果集进行操作,返回的是对象。有点像JDBC基础中的ORM。

ResultHandle接口有一些实现类,常见的是BeanHandler, BeanListHandler 和 ScalarHandler 

一般在数据库中命名的方式为下划线命名法,而java中的命名为驼峰命名法,所以在使用之前,要先开启驼峰映射。

    private BeanProcessor beanProcessor=new GenerousBeanProcessor();
  //在执行query方法时传入processor
private RowProcessor processor=new BasicRowProcessor(beanProcessor);

1. BeanHandler 用于将ResultSet的第一行转化为JavaBean。使用方法

private QueryRunner queryRunner=new QueryRunner(DataSourceUtil.getDataSource());

    //开启驼峰映射
    private BeanProcessor beanProcessor=new GenerousBeanProcessor();
    private RowProcessor processor=new BasicRowProcessor(beanProcessor);

    /**
     * 通过id查找分类
     * @param id
     * @return
     */
    public Category findById(int id){
        String sql="select * from category where id=?";

        Category category=null;
        try {
            category=queryRunner.query(sql,new BeanHandler<>(Category.class,processor),id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return category;
    }

2.BeanListHandler 用于将ResultSet的每一行放入list,成为JavaBean的List

使用方法

    private QueryRunner queryRunner=new QueryRunner(DataSourceUtil.getDataSource());

    //开启驼峰映射
    private BeanProcessor beanProcessor=new GenerousBeanProcessor();
    private RowProcessor processor=new BasicRowProcessor(beanProcessor);
/**
     * 返回分类列表
     * @return
     */
    public List<Category> list(){
        String sql="select * from category ";

        List<Category> list=null;
        try {
            list=queryRunner.query(sql,new BeanListHandler<>(Category.class,processor));
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return list;
    }

3.ScalarHandler 通常用于查询一列的具体数值,例如查询一列的总数

    private QueryRunner queryRunner=new QueryRunner(DataSourceUtil.getDataSource());

    //开启驼峰映射
    private BeanProcessor beanProcessor=new GenerousBeanProcessor();
    private RowProcessor processor=new BasicRowProcessor(beanProcessor);

    /**
     * 查询Category下所有的主题数量
     * @param cId
     * @return
     */
    public int countTotalTopicByCid(int cId) {
        //查询分类下所有的主题数量
        String sql="select count(*) from topic where c_id=? and `delete`=0";
        Long count=null;

        try {
             count=(Long) queryRunner.query(sql,new ScalarHandler<>(),cId);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return count.intValue();
    }

 




posted @ 2020-07-27 11:22  CodeYongqi  阅读(218)  评论(0)    收藏  举报