c3p0和QueryRunner的结合使用,让开发更加简便
Posted --->别先生<---
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c3p0和QueryRunner的结合使用,让开发更加简便相关的知识,希望对你有一定的参考价值。
1:DBUtils中的QueryRunner的使用:
1.1:QueryRunner中提供了对SQL语句操作的api;
1.2:主要有三个方法:
1.2.1:query():用于执行select(查询);
1.2.2:update():用于执行insert(插入)/update(更新)/delete(删除);
1.2.3:batch():批处理;
2:c3p0和QueryRunner的结合使用:
2.1:首先导包,如下所示的包;
c3p0-0.9.1.2.jar
commons-dbutils-1.6.jar
mysql-connector-java-5.1.12-bin.jar
2.2:当然导包之前你需要创建好数据库和数据表哦!~~~
在src目录下面记住配置c3p0-config.xml文件
1 <c3p0-config> 2 3 <!-- c3p0默认配置,下面还可以配置多个数据库 --> 4 <default-config> 5 <property name="jdbcUrl">jdbc:mysql://localhost:3306/test 6 </property> 7 <property name="driverClass">com.mysql.jdbc.Driver</property> 8 <property name="user">root</property> 9 <property name="password">123456</property> 10 <property name="initialPoolSize">6</property> 11 <property name="maxPoolSize">50</property> 12 <property name="maxIdleTime">1000</property> 13 </default-config> 14 15 </c3p0-config>
2.3:创建实体类,如User.java,源码如下,
1 package com.bie.po; 2 /** 3 * @author BieHongLi 4 * @version 创建时间:2017年3月11日 下午12:55:21 5 * 6 */ 7 public class User { 8 9 private int id; 10 private String name; 11 private String password; 12 private String email; 13 private String phone; 14 public int getId() { 15 return id; 16 } 17 public void setId(int id) { 18 this.id = id; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public String getPassword() { 27 return password; 28 } 29 public void setPassword(String password) { 30 this.password = password; 31 } 32 public String getEmail() { 33 return email; 34 } 35 public void setEmail(String email) { 36 this.email = email; 37 } 38 public String getPhone() { 39 return phone; 40 } 41 public void setPhone(String phone) { 42 this.phone = phone; 43 } 44 @Override 45 public String toString() { 46 return "User [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", phone=" + phone 47 + "]"; 48 } 49 50 51 }
2.4:创建好实体类之后就可以根据MVC模式分层进行开发,这里只是模拟,所以创建dao层和servic层和test层。test层进行测试;
所以先创建dao层进行创建接口,再创建实现接口的类,当然实现c3p0和QueryRunner的关键代码就是dao层哦,切记;
当然了还有工具类utils层提取的公共的方法;
1 package com.bie.dao; 2 3 import java.util.List; 4 5 import com.bie.po.User; 6 7 /** 8 * @author BieHongLi 9 * @version 创建时间:2017年3月11日 下午5:46:38 10 * 11 */ 12 public interface UserDao { 13 14 /*** 15 * 查询所有的用户信息 16 * @return 17 */ 18 public List<User> selectUser(); 19 20 /*** 21 * 根据编号查询 22 * @param id 23 * @return 24 */ 25 public User selectUserId(int id); 26 27 28 /*** 29 * 根据条件查询信息 30 * @param user 31 * @return 32 */ 33 public List<User> select(String sql,List<Object> list); 34 35 36 }
1 package com.bie.dao.impl; 2 3 import java.util.List; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanHandler; 7 import org.apache.commons.dbutils.handlers.BeanListHandler; 8 9 import com.bie.dao.UserDao; 10 import com.bie.po.User; 11 import com.bie.util.BaseUtils; 12 13 /** 14 * @author BieHongLi 15 * @version 创建时间:2017年3月11日 下午5:47:35 16 * 17 */ 18 public class UserDaoImpl implements UserDao{ 19 20 @Override 21 public List<User> selectUser() { 22 //创建QueryRunner 23 //记住查询是BeanListHandler区别增删改的方法BeanHandler 24 QueryRunner qr=BaseUtils.getQueryRunner(); 25 try { 26 String sql="select * from user "; 27 //这句话就相当于之前写的下面这一长串代码,这就是QueryRunner的方便之处 28 /*** 29 *User user=new User(); 30 user.setId(rs.getInt("id")); 31 user.setName(rs.getString("name")); 32 user.setPassword(rs.getString("password")); 33 user.setEmail(rs.getString("email")); 34 user.setPhone(rs.getString("phone")); 35 */ 36 return qr.query(sql, new BeanListHandler<User>(User.class)); 37 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 return null; 42 } 43 44 @Override 45 public User selectUserId(int id) { 46 //创建QueryRunner 47 QueryRunner qr=BaseUtils.getQueryRunner(); 48 String sql="select * from user where id=? "; 49 try { 50 //使用QueryRunner的强大之处在于此处。 51 return qr.query(sql,new BeanHandler<User>(User.class), id); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 return null; 56 } 57 58 59 public List<User> select(String sql,List<Object> list) { 60 //创建QueryRunner 61 QueryRunner qr=BaseUtils.getQueryRunner(); 62 try { 63 //第一个参数是传来的sql,第二个是实现实体类的设置,第三个是集合转化为数组 64 return qr.query(sql, new BeanListHandler<User>(User.class), list.toArray()); 65 66 } catch (Exception e) { 67 e.printStackTrace(); 68 } 69 return null; 70 } 71 72 73 }
这里将BaseUtils类写到这里,因为这个也是c3p0和QueryRunner的核心啊!!!
1 package com.bie.util; 2 3 import java.sql.SQLException; 4 import java.util.List; 5 6 import javax.sql.DataSource; 7 8 import org.apache.commons.dbutils.QueryRunner; 9 10 import com.mchange.v2.c3p0.ComboPooledDataSource; 11 12 /** 13 * @author BieHongLi 14 * @version 创建时间:2017年3月11日 下午1:29:50 15 * 数据库连接工具类 16 */ 17 public class BaseUtils { 18 19 //初始化c3p0 20 private static DataSource dataSource=null; 21 22 static{ 23 //自动加载src目录下面的c3p0的配置文件,【c3p0-config.xml】 24 dataSource = new ComboPooledDataSource(); 25 } 26 27 public static QueryRunner getQueryRunner(){ 28 //第一步:创建QueryRunner对象,传入连接池对象 29 //在创建QueryRunner对象的时候,如果传入数据对象dataSource, 30 //那么在使用QueryRunner对象的方法时候,就不需要传入连接对象 31 QueryRunner query=new QueryRunner(dataSource); 32 //第二步:会自动从数据源中获取连接(不用关闭连接) 33 return query; 34 } 35 36 /*** 37 * 实现增删改的公共方法 38 * @param sql 39 * @param arr 40 * @return 41 */ 42 public static boolean addUpdateDelete(String sql,Object[] arr){ 43 QueryRunner qr=getQueryRunner(); 44 int count; 45 try { 46 count = qr.update(sql, arr); 47 if(count>0){ 48 return true; 49 }else{ 50 return false; 51 } 52 } catch (SQLException e) { 53 e.printStackTrace(); 54 } 55 return false; 56 } 57 58 }
2.5:完成dao层和BaseUtils层之后可以直接在service层进行增删改,dao层就不用写了;
1 package com.bie.service; 2 3 import java.util.List; 4 5 import com.bie.po.User; 6 7 /** 8 * @author BieHongLi 9 * @version 创建时间:2017年3月11日 下午7:10:32 10 * 11 */ 12 public interface UserService { 13 14 /*** 15 * 根据条件查询用户信息 16 * @param user 17 * @return 18 */ 19 public List<User> select(User user); 20 21 /*** 22 * 添加用户信息 23 * @param user 24 * @return 25 */ 26 public boolean insertUser(User user); 27 28 /*** 29 * 修改用户的信息 30 * @param user 31 * @return 32 */ 33 public boolean updateUser(User user); 34 35 /*** 36 * 删除用户信息 37 * @param id 38 * @return 39 */ 40 public boolean deleteUser(int id); 41 }
1 package com.bie.service.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.bie.dao.UserDao; 7 import com.bie.dao.impl.UserDaoImpl; 8 import com.bie.po.User; 9 import com.bie.service.UserService; 10 import com.bie.util.BaseUtils; 11 12 /** 13 * @author BieHongLi 14 * @version 创建时间:2017年3月11日 下午7:10:48 15 * 16 */ 17 public class UserServiceImpl implements UserService{ 18 19 private UserDao dao=new UserDaoImpl(); 20 21 @Override 22 public List<User> select(User user) { 23 StringBuilder sql=new StringBuilder("select * from user where 1=1 "); 24 List<Object> list=new ArrayList<Object>(); 25 if(user!=null){ 26 //根据编号查询 27 if(user.getId()!=0 && !"".equals(user.getId())){ 28 sql.append(" and id = ? "); 29 list.add(user.getId()); 30 } 31 32 //根据名称模糊查询,模糊查询"" %% "" ++ 33 if(user.getName()!=null && !"".equals(user.getName())){ 34 sql.append(" and name like ? "); 35 list.add("%"+user.getName()+"%"); 36 } 37 } 38 39 return dao.select(sql.toString(), list); 40 } 41 42 @Override 43 public boolean insertUser(User user) { 44 String sql="insert into user values(0,?,?,?,?)"; 45 List<Object> list=new ArrayList<>(); 46 if(user!=null){ 47 list.add(user.getName()); 48 list.add(user.getPassword()); 49 list.add(user.getEmail()); 50 list.add(user.getPhone()); 51 } 52 try { 53 return BaseUtils.addUpdateDelete(sql, list.toArray()); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 return false; 58 } 59 60 @Override 61 public boolean updateUser(User user) { 62 String sql="update user set name=?,password=?,email=?,phone=? where id=? "; 63 List<Object> list=new ArrayList<>(); 64 if(user!=null){ 65 list.add(user.getName()); 66 list.add(user.getPassword()); 67 list.add(user.getEmail()); 68 list.add(user.getPhone()); 69 70 //根据编号修改信息 71 list.add(user.getId()); 72 } 73 74 try { 75 return BaseUtils.addUpdateDelete(sql, list.toArray()); 76 } catch (Exception e) { 77 e.printStackTrace(); 78 } 79 return false; 80 } 81 82 @Override 83 public boolean deleteUser(int id) { 84 String sql="delete from user where id=? "; 85 List<Object> list=new ArrayList<>(); 86 if(id!=0){ 87 //根据编号修改信息 88 list.add(id); 89 } 90 91 try { 92 return BaseUtils.addUpdateDelete(sql, list.toArray()); 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } 96 return false; 97 } 98 99 100 }
2.6:使用junit测试,完成使用c3p0和QueryRunner的练习;
1 package com.bie.test; 2 3 import java.util.List; 4 5 import org.junit.Test; 6 7 import com.bie.dao.UserDao; 8 import com.bie.dao.impl.UserDaoImpl; 9 import com.bie.po.User; 10 import com.bie.service.UserService; 11 import com.bie.service.impl.UserServiceImpl; 12 13 /** 14 * @author BieHongLi 15 * @version 创建时间:2017年3月11日 下午5:57:25 16 * 17 */ 18 public class QueryRunnerTest { 19 20 private UserDao dao=new UserDaoImpl(); 21 private UserService service=new UserServiceImpl(); 22 23 //查询所有信息的测试 24 @Test 25 public void selectUser(){ 26 List<User> list=dao.selectUser(); 27 for(User u:list){ 28 System.out.println(u); 29 } 30 } 31 32 //根绝id查询的信息 33 @Test 34 publi以上是关于c3p0和QueryRunner的结合使用,让开发更加简便的主要内容,如果未能解决你的问题,请参考以下文章
在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用
转账示例:Dao层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)
转账示例:service层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)
转账示例:service层面实现(线程管理Connection)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
转账示例:service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)