`
qindongliang1922
  • 浏览: 2189317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117684
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126082
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60038
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71412
社区版块
存档分类
最新评论

DButils+dbcp数据源+spring实现增删改查小例子

    博客分类:
  • JAVA
阅读更多
本篇主要介绍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的配置文件配置的:



	<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的核心包


2
0
分享到:
评论
2 楼 qindongliang1922 2014-12-05  
zqh1986 写道
有工程代码吗

核心代码,都在博客里面
1 楼 zqh1986 2014-12-05  
有工程代码吗

相关推荐

    c3p0+dbUtils+Ajax+Json+Jquery实现【增删改查】Demo

    在本项目"C3P0+DBUtils+Ajax+Json+Jquery实现【增删改查】Demo"中,我们将探讨如何结合这些技术来构建一个功能完善的Web应用,用于执行基本的数据操作,即增(Add)、删(Delete)、改(Modify)和查(Query)。...

    dbutils + oracle 增删改查批量插入示例

    在IT行业中,数据库操作是日常开发中的重要环节,而`dbutils`是一个非常实用的Java数据库操作工具包,它简化了对数据库进行增删改查(CRUD)操作的过程。本示例着重介绍如何结合`dbutils`与Oracle数据库进行高效的...

    dbutils +dbcp 连接池构建dao层

    1. 接口:定义了对数据库进行操作的方法,如增删改查。 2. 实现类:实现了接口中的方法,具体执行SQL语句并处理结果。 3. 数据库连接:通过JDBC(Java Database Connectivity)来建立和管理数据库连接。 DBUtils是...

    JSP+SERVLET+MYSQL实现的增删改查javaweb小例子

    总结起来,"JSP+SERVLET+MYSQL实现的增删改查javaweb小例子"是一个基础的Web应用开发实例,它涵盖了从用户界面交互到后端数据处理的关键环节。开发者可以通过学习和实践这个项目,掌握如何使用JSP创建动态页面,使用...

    学生信息管理系统(实现增删改查操作)Java+Servlet+HTML+CSS+数据库

    数据库部分:创建表、增删改查语句的书写等。 前端部分:HTML、CSS、jQuery、JavaScript等。 编码顺序 添加项目需要使用的各种jar包 HTML 页面表单的编写 Apache方法的DBUtils编写 实体类的数据初始化(添加私有...

    jsp+servlet+javabean+jdbc+mysql实现增删改查和分页功能

    2.开发中的一些小技巧。 3.客户管理平台功能 * 添加客户 * 查询所有的客户的信息 * 修改客户信息 * 删除客户信息 * 按条件查询 * 分页查询数据 4.准备环境 5.Servlet + JSP +JavaBean + JDBC(DBUtils)+ ...

    学生信息管理系统、MVC设计模式,实现学生信息管理(增删改查)使用MYSQL、C3P0、DBUtils

    学生信息管理系统是一个典型的后台应用程序,它使用MVC(Model-View-Controller)设计模式来组织代码,实现对学生信息的高效管理。在这个系统中,我们主要关注三个核心组件:模型(Model)、视图(View)和控制器...

    Java+Servlet+HTML+CSS+数据库,实现的图书管理系统,完整的实现了增删改查的操作及页面之间跳转

    数据库部分:创建表、增删改查语句的书写等。 前端部分:HTML、CSS、jQuery、JavaScript等。 编码顺序 添加项目需要使用的各种jar包 HTML 页面表单的编写 Apache方法的DBUtils编写 实体类的数据初始化(添加私有...

    简易学生信息管理系统 使用Servlet+DButils+c3p0+MySQL等工具编写.zip

    通过SQL语句,Servlet可以与数据库进行交互,实现数据的增删改查。 5. **项目结构**: "project_demo"很可能是该项目的根目录,包含了项目的全部源码和配置文件。通常,一个Java Web项目会包含WEB-INF目录,其中...

    apache commons dbutils实现增删改查功能

    3. BasicDataSource 类:一个符合 JNDI 规范的数据源实现,用于管理和提供数据库连接。 下面是一个简单的示例,演示如何使用 DBUtils 进行 CRUD 操作: **创建(Create)** ```java public void insertEmployee...

    开源工具DbUtils的使用(数据库的增删改查)

    DBUtils是apache下的一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。

    Android xutils的数据库增删改查带数据库升级

    在Android开发中,数据存储是不可或缺的一部分,XUtils是一个强大的工具库,它为开发者提供了方便的数据操作接口,包括对SQLite数据库的增删改查以及数据库版本管理。本篇将详细介绍如何利用XUtils进行数据库操作...

    struts2+DBUtils实现的用户信息增删改查,包含文件上传下载

    以上是关于“struts2+DBUtils实现的用户信息增删改查,包含文件上传下载”这个项目的详细解析,涵盖了Struts2框架的使用、分层架构的设计、数据库操作、文件上传下载等多个核心知识点。这样的项目对于理解和掌握...

    jar:mysql5.0.8+dbcp1.2.2+dbutils1.2

    jar:mysql5.0.8+dbcp1.2.2+dbutils1.2,亲测可用。如果嫌弃包低,可用直接访问commons.apache官网http://commons.apache.org/选择下载即可。

    dbutils+c3p0

    总之,"dbutils+c3p0+ojdbc6"组合为Java开发者提供了一个强大、稳定的数据库访问方案,使得在处理Oracle数据库时能实现高效、可靠的连接管理和SQL操作。在实际项目中,根据具体需求调整和优化这些组件的配置,可以...

    SSM BASE增删改查

    SSM BASE增删改查是Java Web开发中的一项基本技能,主要涉及Spring、Spring MVC和MyBatis三个框架的整合应用。这三个框架分别是Spring(依赖注入和管理)、Spring MVC(模型视图控制器)和MyBatis(持久层框架)。...

    四个jar包commons-beanutils-1.8.3+dbcp+dbutils-1.4+commons-fileupload-1.2.2

    在Java开发中,库文件,特别是JAR(Java Archive)包,是不可或缺的资源,它们提供了各种功能,帮助开发者简化代码并实现特定任务。这里提到的四个JAR包分别是: 1. **Apache Commons BeanUtils 1.8.3**: Apache ...

    JDBC连接数据与增删改查操作_MVC基础上的客户管理系统

    ### JDBC连接数据与增删改查操作_MVC基础上的客户管理系统 #### 1. JDBC简介与连接数据库 Java Database Connectivity (JDBC) 是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和...

    Xutils 3.0+ 数据库操作 增删改查

    在Android 6.0+系统上,Xutils能很好地处理数据的增删改查(CRUD)任务,这使得开发者可以专注于业务逻辑,而不是底层的SQLite数据库操作。 首先,让我们深入了解Xutils 3.0+如何进行数据库操作: 1. **数据库初始...

    客户管理系统(对数据库增删改查)

    客户管理系统---体验基于数据库javaweb的增删改查 添加客户 查询客户列表 修改客户信息 删除客户 条件查询客户信息 分页查询客户 javaee的经典三层架构--工厂类实现解耦 jsp+servlet+service+dao+jdbc...

Global site tag (gtag.js) - Google Analytics