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(); }

浙公网安备 33010602011771号