- 浏览: 2148828 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
本篇主要介绍DButils工具类的使用跟Spring的JDBCTemplate框架非常类似,比我们纯手写JDBC的sql语句,会方便许多,如果加上了连接池的配置,那么效果就会更加完美,
首先我们来看下DButils的简介:
Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。它是对JDBC的一个轻量级的封装,简化了很多重复的一些操作。
Dbutils的一些注意事项:
1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。
比如:
person表中有个字段叫:address,那么对应的JavaBean的Person类中必须有getAddress和setAddress两个方法,而Person类中可以将address属性命名为add,这是没问题的。
3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。
对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定
4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
下面散仙介绍一下,本次例子中使用的技术:
连接池:dbcp,也是common家族里面的包
bean注入和管理: 使用的是spring
轻量级的工具库:dbutils
数据源是在,spring的配置文件配置的:
当然,上面的这个数据源,我们可以配置多个,也可配置不同的库,这样设计比较方便灵活,利于我们动态切换我们的库。
由于是java项目,并没有采用Web容器的方式启动,所以需要我们定义一个bean的加载器,来获取连接池,代码如下:
增删改查代码示例:
以上代码,就是简化了封装操作数据库增删改查的过程,当然我们也可以扩展它,使它成为一个轻量级的ORM框架,这样更方便操作,另外注意一点,如果注意数据库的编码问题,如果编码不一致,可能会导致,中文查询有问题,而且程序不会报异常,只是查询的结果为空或null,所以这一点需要格外注意,最好在连接数据库的配置里,加上指定的数据库编码,如散仙上面的xml的写法。
最后看一下DButils一些Handler的封装:
使用的主要jar包有:
首先我们来看下DButils的简介:
Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。它是对JDBC的一个轻量级的封装,简化了很多重复的一些操作。
Dbutils的一些注意事项:
1、DBUtils是JDBC的简单封装,可以和JDBC混合使用。
2、DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次Bean的getter与setter方法的名字与结果集的列名一一对应,而不要求JavaBean的私有成员与表结果集列名一一对应。
比如:
person表中有个字段叫:address,那么对应的JavaBean的Person类中必须有getAddress和setAddress两个方法,而Person类中可以将address属性命名为add,这是没问题的。
3、DBUtils可以将结果集封装为各种类型,主要有:Bean/List<Bean>,Map/List<Map>/Map<Map>,数组/List<数组>,列/List<列>,这些类型。
对于Map<Map>的类型使用KeyedHandler作为结果集处理器,内层的Map是“列名-值"对,外层的Map是“主键-内层Map的引用”,但此处的主键不一定就是数据库的主键,可以随意指定
4、DBUtils执行插入操作的时候,无法返回自增主键,这是一个很严重的问题,当然不能怪DBUtils,可以通过变通的方法来实现,比如在MySQL中,执行完了一个插入SQL后,接着执行SELECT LAST_INSERT_ID()语句,就可以获取到自增主键。
5、DBUtils的性能和JDBC性能是一样,测试过程中没发现性能损失,拥有了很高性能的同时,而不失JDBC的灵活性。
下面散仙介绍一下,本次例子中使用的技术:
连接池:dbcp,也是common家族里面的包
bean注入和管理: 使用的是spring
轻量级的工具库:dbutils
数据源是在,spring的配置文件配置的:
<bean id="local" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/person?characterEncoding=utf-8"></property> <property name="username" value="root"></property> <property name="password" value="qin"></property> <property name="maxActive" value="10"/> <property name="initialSize" value="5"/> <property name="defaultReadOnly" value="false"/> </bean>
当然,上面的这个数据源,我们可以配置多个,也可配置不同的库,这样设计比较方便灵活,利于我们动态切换我们的库。
由于是java项目,并没有采用Web容器的方式启动,所以需要我们定义一个bean的加载器,来获取连接池,代码如下:
package com.dhgate.dbutils.opera; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; /** * * 加载Spring的xml的bean配置 * */ public class XmlBeanLoad { /** * * 根据连接池的名 * 得到一个连接池对象 * * @param datasourceName 数据源名字 * @return 数据连接池对象 * */ public static BasicDataSource getDataSource(String datasourceName){ BeanFactory bean=new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader((BeanDefinitionRegistry)bean); reader.loadBeanDefinitions(new ClassPathResource("datasource.xml")); BasicDataSource data=(BasicDataSource) bean.getBean(datasourceName); return data; } /*** * 测试连接信息 * * **/ public static void main(String[] args) throws Exception{ BeanFactory bean=new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader((BeanDefinitionRegistry)bean); reader.loadBeanDefinitions(new ClassPathResource("datasource.xml")); // BasicDataSource data=(BasicDataSource) bean.getBean("common2"); BasicDataSource data=(BasicDataSource) bean.getBean("local"); System.out.println(data.getConnection()); } }
增删改查代码示例:
package com.dhgate.dbutils.opera; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dhgate.m2b.entity.Student; /** * * dbutils+datasource * 实现轻量级的增删改查 * @author qindongliang * * * */ public class DataQuery<T> { private static Logger logger = LoggerFactory.getLogger(DataQuery.class); private Class clazz; public DataQuery(Class clazz) { this.clazz=clazz; } public DataQuery() { // TODO Auto-generated constructor stub } public T query(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); System.out.println(datasource.getConnection().toString()); QueryRunner runner=new QueryRunner(datasource); System.out.println(runner); return (T) runner.query(sql, new BeanHandler(clazz),params); } /** * 查询集合 * @param sql 添加的sql语句 * @param params 数据的参数 * @param name 连接池的名字 * */ public List<T> queryList(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); QueryRunner runner=new QueryRunner(datasource); return (List<T>) runner.query(sql, new BeanListHandler(clazz),params); } /** * 添加一条数据 * @param sql 添加的sql语句 * @param params 数据的参数 * @param name 连接池的名字 * */ public void add(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); QueryRunner runner=new QueryRunner(datasource); int i=runner.update(datasource.getConnection(),sql, params); if(i>0){ System.out.println("添加成功!"); } } /** * 更新一条数据 * @param sql 添加的sql语句 * @param params 数据的参数 * @param name 连接池的名字 * */ public void update(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); QueryRunner runner=new QueryRunner(datasource); int i=runner.update(datasource.getConnection(),sql, params); if(i>0){ System.out.println("更新成功!"); } } /** * 删除一条数据 * @param sql 添加的sql语句 * @param params 数据的参数 * @param name 连接池的名字 * */ public void delete(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); QueryRunner runner=new QueryRunner(datasource); int i=runner.update(datasource.getConnection(),sql, params); if(i>0){ System.out.println("删除成功!"); } } /** * 统计某个表的count * @param sql sql语句 * @param params 条件参数 * @param name 数据源名字 * @return 返回检索的数量 * **/ public int count(String sql,Object[] params,String name)throws Exception{ log(sql, params, name); DataSource datasource=XmlBeanLoad.getDataSource(name); QueryRunner runner=new QueryRunner(datasource); int count=runner.query(sql, new ResultSetHandler<Integer>() { @Override public Integer handle(ResultSet rs) throws SQLException { if(rs.next()){ return rs.getInt(1); } return 0; } },params); return count; } private void log(String sql,Object[] params,String name){ logger.info("SQL语句:"+sql+" 检索参数: "+Arrays.toString(params)+" 连接池名字: "+name); } public static void main(String[] args)throws Exception { // String sql="select * from person where name like ? "; String datasourceName="local"; DataQuery<Student> sq=new DataQuery<Student>(Student.class); //添加测试 //sq.add("insert into person (name,sex) values(?,?)", new Object[]{"散仙","女"},datasourceName); //更新测试 //sq.update("update person set name=? , sex=? where id = ? ", new Object[]{"三劫散仙","男",5}, datasourceName); //删除测试 sq.delete("delete from person where id = ? ", new Object[]{1}, datasourceName); // //单条查询测试 // Student st= sq.query(sql, new Object[]{"王晶"}, datasourceName); // System.out.println(st); // System.out.println("================================"); //批量查询测试 // List<Student> queryList = sq.queryList(sql, new Object[]{"%天%"}, datasourceName); // System.out.println("查询数量: "+queryList.size()); // for(Student stt:queryList){ // System.out.println(stt); // } //System.out.println(st); // testLimit(); } public static void testLimit()throws Exception{ String sql="select * from person order by id desc limit ? , ? "; String datasourceName="local"; DataQuery<Student> sq=new DataQuery<Student>(Student.class); List<Student> queryList = sq.queryList(sql, new Object[]{2,3}, datasourceName); System.out.println("查询数量: "+queryList.size()); for(Student stt:queryList){ System.out.println(stt); } } }
以上代码,就是简化了封装操作数据库增删改查的过程,当然我们也可以扩展它,使它成为一个轻量级的ORM框架,这样更方便操作,另外注意一点,如果注意数据库的编码问题,如果编码不一致,可能会导致,中文查询有问题,而且程序不会报异常,只是查询的结果为空或null,所以这一点需要格外注意,最好在连接数据库的配置里,加上指定的数据库编码,如散仙上面的xml的写法。
最后看一下DButils一些Handler的封装:
ArrayHandler:把结果集中的第一行数据转成对象数组。 ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。 BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 ColumnListHandler:将结果集中某一列的数据存放到List中。 KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。 MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List。 ScalarHandler:将结果集中某一条记录的其中某一列的数据存成Object。
使用的主要jar包有:
commons-dbutils-1.6.jar dbutis的主要包 mysql的驱动包 spring的核心包
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1466### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1146如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1027我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2136高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 1999将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1593在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 990Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 5934之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 941长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2050计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3344### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1067# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3247# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1087# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1430# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1022### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1331# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1319# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 693### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1457前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
c3p0+dbUtils+Ajax+Json+Jquery实现【增删改查】Demo!不解释,我博客里有效果图!看了效果图再决定下不下,值不值!内含数据库备份文件!
完整的 JSP+SERVLET+MYSQL实现的增删改查javaweb小例子
1、包含示例war包、文件夹 2、示例所需要的SQL语句 3、dbutils开发包及其源码 4、eclipse + oracle 测试通过
数据库部分:创建表、增删改查语句的书写等。 前端部分:HTML、CSS、jQuery、JavaScript等。 编码顺序 添加项目需要使用的各种jar包 HTML 页面表单的编写 Apache方法的DBUtils编写 实体类的数据初始化(添加私有...
2.开发中的一些小技巧。 3.客户管理平台功能 * 添加客户 * 查询所有的客户的信息 * 修改客户信息 * 删除客户信息 * 按条件查询 * 分页查询数据 4.准备环境 5.Servlet + JSP +JavaBean + JDBC(DBUtils)+ ...
MVC设计模式,实现学生信息管理(增删改查)使用MYSQL、C3P0、DBUtils
apache commons dbutils实现增删改查功能
NULL 博文链接:https://yuanmengchong.iteye.com/blog/1704586
DBUtils是apache下的一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
1、一个完美struts2写成的小项目,实现了用户信息的增删改查。 2、采用的是分层结构,dao,service,action三层架构,结构清晰 3、完整的写出了文件上传,文件下载的具体操作。
jar:mysql5.0.8+dbcp1.2.2+dbutils1.2,亲测可用。如果嫌弃包低,可用直接访问commons.apache官网http://commons.apache.org/选择下载即可。
四个jar包commons-beanutils-1.8.3+commons-dbcp-1.4+commons-dbutils-1.4+commons-fileupload-1.2.2
dbutils+c3p0+ojdbc6
JDBC连接数据与增删改查操作_MVC基础上的客户管理系统
commons_beanutils+dbutils+fileupload+io.zip
数据库部分:创建表、增删改查语句的书写等。 前端部分:HTML、CSS、jQuery、JavaScript等。 编码顺序 添加项目需要使用的各种jar包 HTML 页面表单的编写 Apache方法的DBUtils编写 实体类的数据初始化(添加私有...
jsp,java web开发,毕业设计,课程设计作业,servlet框架,mysql数据库,源码资源
项目实战:Servlet+Druid+Mysql+dbutils+Thymeleaf完成的用户管理系统
客户管理系统---体验基于数据库javaweb的增删改查 添加客户 查询客户列表 修改客户信息 删除客户 条件查询客户信息 分页查询客户 javaee的经典三层架构--工厂类实现解耦 jsp+servlet+service+dao+jdbc...
c3p0+xml+jdbc.properties+DBUtils+mysql-connector