首页 > 图灵资讯 > 技术篇>正文

Apache_DBUtils框架教程学习笔记(一)_CRUD

2023-04-16 09:27:47

  目前比较火的是“Mybatis”,但也有一些人也喜欢它“DbUtils”,因为它可以简化JDBC应用程序的开发,而且不会影响程序的性能,所以我将简要比较四个常用的持久层框架:JDBC: 原生访问数据库的方式, 其他三个都是对的 JDBC 不同程度的封装访问数据库比较麻烦, 代码重复度极高 DbUtils: 对JDBC进行了相对简单的封装, 主要是自动封装查询结果集, 需要在代码中写作 sql 语句 Mybatis: 进一步封装 JDBC, Sql 语句写在配置文件中, 面向对象操作, 有一 二级缓存功能 Hibernate: 对 JDBC 包装最彻底的框架, 纯面对对象, 可以不用写 SQL

  通过以上比较,我们发现Dbutils是最轻量级的,在这里分享Dbutils框架学习笔记,希望对大家有所帮助: 一、commons-dbutils简介

  commons-dbutils 是 Apache 组织提供的开源 JDBC工具库是JDBC的简单包装,学习成本极低,使用dbutils可以大大简化jdbc编码的工作量,不影响程序的性能。因此,dbutils已经成为许多不喜欢hibernate的公司的首选。

  commons-dbutilsAPI介绍: org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.ResultSetHandler

  工具类 org.apache.commons.dbutils.DbUtils 二、QueryRunner类使用说明

  这类SQL查询简化,与ResultSetHandler结合使用,可完成大部分数据库操作,可大大降低编码量。   QueryRunner类提供了两种结构方法: 默认结构方法 需要一个 javax.sql.DataSource 构造参数的方法。 2.1、QueryRunner类的主要方法

  public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:在此查询中执行查询操作,对象数组中的每个元素值被用作查询句的替换参数。该方法自行处理 PreparedStatement 和 ResultSet 创造和关闭。   public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎和第一种方法一样;唯一的区别是它不提供数据库连接的方法,而且从提供给构造方法的数据源开始(DataSource) 或者使用setdataSource 重新获得方法 Connection。   public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行不需要替换参数的查询操作。   public int update(Connection conn, String sql, Object[] params) throws SQLException:用于更新(插入、更新或删除)。   public int update(Connection conn, String sql) throws SQLException:用于执行不需要替换参数的更新操作。 2.2、使用QueryRunner实现CRUD package wkcto.com.test; import java.util.Date; import java.util.List; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.sql.SQLException; import javax.sql.rowset.serial.SerialClob; import wkcto.com.domain.User; import wkcto.com.util.JdbcUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.junit.Test; /** * @ClassName: DBUtilsCRUDTest * @Description:使用dbutils框架的QueryRunner类完成CRUD,以及批处理 * */ public class QueryRunnerCRUDTest { /* *---------Start测试表-------------------- create table users( id int primary key auto_increment, name varchar(40), password varchar(40), email varchar(60), birthday date ); *---------end测试表-------------------- */ @Test public void add() throws SQLException { ///将数据源传递给QueryRunner,通过数据源连接QueryRunner内部的数据库 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "insert into users(name,password,email,birthday) values(?,?,?,?,?)"; Object params[] = {蛙课网,“123”, "wkcto@163.com", new Date()}; //Object params[] = {蛙课,“123”, "wkcto@163.com", "1989-08-09"}; qr.update(sql, params); } @Test public void delete() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "delete from users where id=?"; qr.update(sql, 1); } @Test public void update() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "update users set name=? where id=?"; Object params[] = { "ccc", 5}; qr.update(sql, params); } @Test public void find() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users where id=?"; Object params[] = {2}; User user = (User) qr.query(sql, params, new BeanHandler(User.class)); System.out.println(user.getBirthday()); } @Test public void getAll() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = (List) qr.query(sql, new BeanListHandler(User.class)); System.out.println(list.size()); } /** * @Method: testBatch * @Description:批处理 * * @throws SQLException */ @Test public void testBatch() throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "insert into users(name,password,email,birthday) values(?,?,?,?,?)"; Object params[][] = new Object[10][]; for (int i = 0; i < 10; i++) { params[i] = new Object[] { "abc" + i, "123", "wk@sina.com", new Date() }; } qr.batch(sql, params); } ///用dbutils完成大数据(不推荐) /*************************************************************************** create table testclob ( id int primary key auto_increment, resume text ); **************************************************************************/ @Test public void testclob() throws SQLException, IOException{ QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); String sql = "insert into testclob(resume) values(?)"; //clob //以这种方式获得的路径,用“%20”代替空格 String path = QueryRunnerCRUDTest.class.getClassLoader().getResource("data.txt").getPath(); ///将“%20”替换回空间 path = path.replaceAll("%20", " "); FileReader in = new FileReader(path); char[] buffer = new char[(int) new File(path).length()]; in.read(buffer); SerialClob clob = new SerialClob(buffer); Object params[] = {clob}; runner.update(sql, params); } } 三、Resultsethandler接口使用说明

  该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。   ResultsetHandler接口提供了一种单独的方法:Object handle (java.sql.ResultSet .rs) 3.1、ResultsetHandler接口的实现类 ArrayHandler:将结果集中的第一行数据转换为对象数组。 ArrayListHandler:将结果集中的每一行数据转换为数组,然后存储在List中。 BeanHandler:将结果集中的第一行数据封装到相应的Javabean实例中。 BeanListHandler:将结果集中的每一行数据封装到相应的Javabean实例中,并存储在List中。 ColumnListHandler:将结果集中在List中。 KeyedHandler(name):将结果集中的每一行数据包装到一个Map中,然后将这些Map存储到一个Map中,其key是指定的key。 MapHandler:将结果集中的第一行数据封装到Map中,key是列名,value是相应的值。 MapListHandler:将结果集中的每一行数据包装到Map中,然后存储到Listt 3.2、测试各种类型的dbutils处理器 package wkcto.com.test; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.Map; import wkcto.com.util.JdbcUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.KeyedHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.junit.Test; /** * @ClassName: ResultSetHandlerTest * @Description:测试各种类型的dbutils处理器 * */ public class ResultSetHandlerTest { @Test public void testArrayHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; Object result[] = (Object[]) qr.query(sql, new ArrayHandler()); System.out.println(Arrays.asList(result)); //list ---> toString() } @Test public void testArrayListHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = (List) qr.query(sql, new ArrayListHandler()); for(Object[] o : list){ System.out.println(Arrays.asList(o)); } } @Test public void testColumnListHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = (List) qr.query(sql, new ColumnListHandler("id")); System.out.println(list); } @Test public void testKeyedHandler() throws Exception{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; Map map = (Map) qr.query(sql, new KeyedHandler("id")); for(Map.Entry me : map.entrySet()){ int id = me.getKey(); Map innermap = me.getValue(); for(Map.Entry innerme : innermap.entrySet()){ String columnName = innerme.getKey(); Object value = innerme.getValue(); System.out.println(columnName + "=" + value); } System.out.println("------test----------"); } } @Test public void testMapHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; Map map = (Map) qr.query(sql, new MapHandler()); for(Map.Entry me : map.entrySet()) { System.out.println(me.getKey() + "=" + me.getValue()); } } @Test public void testMapListHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select * from users"; List list = (List) qr.query(sql, new MapListHandler()); for(Map map :list){ for(Map.Entry me : map.entrySet()) { System.out.println(me.getKey() + "=" + me.getValue()); } } } @Test public void testScalarHandler() throws SQLException{ QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); String sql = "select count(*) from users"; //[13] list[13] int count = ((Long)qr.query(sql, new ScalarHandler(1))).intValue(); System.out.println(count); } }

  Apache_DBUTils框架教程学习笔记(2)_事务处理

  Apache_DBUTils框架教程学习笔记(3)_事务处理

  Apache_DBUTils框架教程学习笔记(4)_事务处理

  Apache_DBUTils框架教程学习笔记(5)_Filter处理事务

上一篇 Apache_DBUtils框架教程学习笔记(二)_事务处理
下一篇 ES(Elasticsearch)支持PB级全文搜索引擎入门教程

文章素材均来源于网络,如有侵权,请联系管理员删除。