DBUtils的简单使用

一、DBUtils

1.简介:commons-dbutils是Apache组织提供的一个开源的JDBC工具类库,它是对JDBC的简单封装,学习成本极低,使用dbutils能够简化jdbc代码量,创建连接,封装结果集,释放资源,并且不影响程序的性能。

2.API介绍

org.apache.commons.dbutils.QueryRunner — 核心
org.apache.commons.dbutils.ResultSetHandler — 结果集封装器
org.apache.commons.dbutils.DbUtils — 工具类

3.QueryRunner类

  • 该类简化了sql查询,它与resultSetHandler组合在一起使用可以完成大部分的数据库操作
  • 默认的构造方法QueryRunner()
  • 需要传入一个连接池作为参数的构造:QueryRunner(DataSource ds),这里需要用到连接池

4.返回数据库连接池

     public static DataSource geDataSource(){
              return ds;
     }
         
     QueryRunner qr=new QueryRunner(DataSource ds);
     QueryRunner qr=new QueryRunner(JDBCUtils.getDatasource);
  1. QueryRunner类的常用方法
  • public Object update(String sql,Object…params)(增删改)(适用于多个参数)

                 @Override
      			public int insert(String username, String password) {
      				int row = 0;
      				try {
      					String sql = "insert into user values(null,?,?)";
      					//定义一个数组来存放可变参数,多个参数,也可以把参数依次往后罗列出来
      					Object[] params = { username, password };
      					row = qr.update(sql, params);
      				} catch (Exception e) {
      					e.printStackTrace();
      				}
      				return row;
      			}
    
  • public Object update(String sql,Object param)(适用于单个参数)

          @Override
      	public int delete(int id) {
      		int row = 0;
      		try {
      			String sql = "delete from user where id=?";
      			row = qr.update(sql, id);
      		} catch (Exception e) {
      		}
      		return row;
      	}
    
  • public Object query(String sql,ResultSetHandler,Object…params)(查)(适用于多个参数)

  • public Object query(String sql,ResultSetHandler)(查)(适用于单个参数)

6.ResultSetHandler接口的实现类(直接使用框架写好的类)

  • BeanHandler(Class type):将结果集里面的的数据封装到一个对象里面

      	    @Override
      		public User selectOne(int id) {
      			User user = null;
      			try {
      				String sql = "select * from user where id=?";
      				// 把查询的字段信息封装到对象上,再把对装到集合里面
      				// qr.query(sql, rsh)
      				//返回的是单个对象
      				user = qr.query(sql, new BeanHandler<User>(User.class),id);		
      			} catch (Exception e) {
      				e.printStackTrace();
      			}
      			return user;
      		}
    
  • BeanListHandler(Class type):将结果集里面的每一行数据封装到一个对象里面,把多个对象存放到集合里面

            @Override
      	public void selectAll() {
      		try {
      			String sql = "select * from user";
      			// 把查询的字段信息封装到对象上,再把对装到集合里面
      			// qr.query(sql, rsh)
      			//返回的是封装对象的集合
      			List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
      			for (User u : list) {
      				System.out.println(u.getId() + "-" + u.getUsername() + "-" + u.getPassword());
      			}
      		  } catch (Exception e) {
      			  e.printStackTrace();
      		}
      	}
    
  • ScalarHandler(int columnIndex):通常用来保存一行一列的结果集,通常用于聚合函数的SQL查询

      	@Override
      		public void select(String xing) {
      			try {
      				String sql = "select count(*) from user where username like ?";
      				// 把查询的字段信息封装到对象上,再把对装到集合里面
      				// 这里只能用long类型来接收,不能使用int类型
      				long count = qr.query(sql, new ScalarHandler<>(), xing + "%");
      				System.out.println(count);
      			} catch (Exception e) {
      				e.printStackTrace();
      			}
      		}
    

7.直接new接口的匿名实现类

		User user =  queryRunner.query("select * from account where id = ?", new ResultSetHandler<	User>(){
		
				@Override
				public 	User handle(ResultSet rs) throws SQLException {
					User user  =  newUser();
					while(rs.next()){
						String name = rs.getString("name");
						int money = rs.getInt("money");
						
						user.setName(name);
						user.setMoney(money);
					}
					return user;
				}
				 
			 }, id);
			
			System.out.println(account.toString());

二、使用dbutils+c3p0连接池完成简单增删改查(用到外界连接池)

1.将DBUtils的jar包加入到项目工程的build path中。
2.导入c3p0连接池jar包
3.配置c3p0-config.xml文件

  • c3p0-config.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <c3p0-config>
      	<named-config  name="c3p0">
      		<property name="driverClass">com.mysql.jdbc.Driver</property>
      		<property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
      		<property name="user">root</property>
      		<property name="password">root</property>	
      		<property name="initialPoolSize">5</property>
      		<property name="maxPoolSize">10</property>	
      	</named-config>
      </c3p0-config>
    
  • DAO接口

      package com.qf.edu.dao;		
      import com.qf.edu.entity.User;	
      public interface JdbcDao {
      
      	/**
      	 * 数据库增删改查方法
      	 * @param username
      	 * @param password
      	 * @return row 插入成功时影响的行数
      	 */
      	int insert(String username,String password);
      	int delete(int id);
      	int update(int id ,String username);
      	//查询所有人
      	void selectAll();
      	//查单个人
      	User selectOne(int id);
      	//数据库里面带有聚合函数的查询
      	void select(String xing);
      	
      }
    
  • DAOImpl

      package com.qf.edu.dao.impl;	
      import java.util.List;
      import org.apache.commons.dbutils.QueryRunner;
      import org.apache.commons.dbutils.handlers.BeanHandler;
      import org.apache.commons.dbutils.handlers.BeanListHandler;
      import org.apache.commons.dbutils.handlers.ScalarHandler;
      import com.qf.edu.dao.JdbcDao;
      import com.qf.edu.entity.User;
      import com.qf.edu.utils.JDBCUtils;
      
      public class JdbcDaoImpl implements JdbcDao {
      
      	public static QueryRunner qr = new QueryRunner(JDBCUtils.getDatasource());	
      	//增
      	@Override
      	public int insert(String username, String password) {
      		int row = 0;
      		try {
      			String sql = "insert into user values(null,?,?)";
      			Object[] params = { username, password };
      			row = qr.update(sql, params);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      		return row;
      	}
      //删
      	@Override
      	public int delete(int id) {
      		int row = 0;
      		try {
      			String sql = "delete from user where id=?";
      			row = qr.update(sql, id);
      		} catch (Exception e) {
      		}
      		return row;
      	}
      //改
      	@Override
      	public int update(int id,String username) {
      		int row = 0;
      		try {
      			String sql = "update user set username= ? where id=?";
      			Object[] params = { username, id };
      			row = qr.update(sql, params);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      		return row;
      	}
      //查
      	@Override
      	public void selectAll() {
      		try {
      			String sql = "select * from user";
      			// 把查询的字段信息封装到对象上,再把对装到集合里面
      			// qr.query(sql, rsh)
      			//返回的是封装对象的集合
      			List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
      			for (User u : list) {
      				System.out.println(u.getId() + "-" + u.getUsername() + "-" + u.getPassword());
      			}
      		  } catch (Exception e) {
      			  e.printStackTrace();
      		}
      	}
      	@Override
      	public User selectOne(int id) {
      		User user = null;
      		try {
      			String sql = "select * from user where id=?";
      			// 把查询的字段信息封装到对象上,再把对装到集合里面
      			// qr.query(sql, rsh)
      			//返回的是单个对象
      			user = qr.query(sql, new BeanHandler<User>(User.class),id);		
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      		return user;
      	}
      
      	@Override
      	public void select(String xing) {
      		try {
      			String sql = "select count(*) from user where username like ?";
      			// 把查询的字段信息封装到对象上,再把对装到集合里面
      			// qr.query(sql, rsh)
      			// 这里只能用long类型来接收,不能使用int类型
      			long count = qr.query(sql, new ScalarHandler<>(), xing + "%");
      			System.out.println(count);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      	}
      }
    
    • User实体类

        package com.qf.edu.entity;		
        public class User {		
        	private int id;
        	private String username;
        	private String password;
        	public User() {
        	}
        	public User(int id, String username, String password) {
        		super();
        		this.id = id;
        		this.username = username;
        		this.password = password;
        	}
        	public int getId() {
        		return id;
        	}
        	public void setId(int id) {
        		this.id = id;
        	}
        	public String getUsername() {
        		return username;
        	}
        	public void setUsername(String username) {
        		this.username = username;
        	}
        	public String getPassword() {
        		return password;
        	}
        	public void setPassword(String password) {
        		this.password = password;
        	}
        	
        	
        }
      
  • JDBCUtils

      package com.qf.edu.utils;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;		
      import javax.sql.DataSource;		
      import com.mchange.v2.c3p0.ComboPooledDataSource;
      
      public class JDBCUtils {
      
      	// 1.获取连接池
      	public static DataSource ds = null;
      	static {
      		ds = new ComboPooledDataSource("c3p0");
      	}
      
      	// 2.把连接池对象返回出去,外部需要传入一个连接池
      	public static DataSource getDatasource() {
      		return ds;
      	}
      
      	// 3.建立连接
      	public static Connection getConnection() throws SQLException {
      		Connection conn = ds.getConnection();
      		return conn;
      	}
      
      	// 4.关闭资源
      	public static void close(PreparedStatement ps, Connection conn) {
      		if (ps != null) {
      			try {
      				ps.close();
      			} catch (SQLException e) {
      				e.printStackTrace();
      			}
      		}
      		if (conn != null) {
      			try {
      				conn.close();
      			} catch (SQLException e) {
      				e.printStackTrace();
      			}
      		}
      	}
      
      	public static void close(PreparedStatement ps, Connection conn, ResultSet rs) {
      		close(ps, conn);
      		if (rs != null) {
      			try {
      				rs.close();
      			} catch (SQLException e) {
      				e.printStackTrace();
      			}
      		}
      	}
      }
    
  • 测试类

     package com.qf.edu.test;	
     import java.util.Scanner;
     import com.qf.edu.dao.JdbcDao;
     import com.qf.edu.dao.impl.JdbcDaoImpl;
     import com.qf.edu.entity.User;
     
     public class JdbcTest {
     
     	public static void main(String[] args) {
     		Scanner scanner=new Scanner(System.in);	
     		JdbcDao jd=new JdbcDaoImpl();
     		while (true) {
     			System.out.println("请输入  1.添加   2.修改   3.删除  4.查询所有人  5.查询个人信息   6.查询姓X的人");
     			switch (scanner.next()) {
     			case "1":
     				System.out.println("请输入用户名:");
     				String username=scanner.next();
     				System.out.println("请输入密码:");
     				String password=scanner.next();
     				int insertRow = jd.insert(username, password);
     				if (insertRow>0) {
     					System.out.println("插入成功");
     				}else {
     					System.out.println("插入失败");
     				}
     				break;
     			case "2":
     				System.out.println("请输入id:");
     				int updateId=scanner.nextInt();
     				System.out.println("请输入修改的用户名:");
     				String updateUsername=scanner.next();			
     				int updateRow = jd.update(updateId, updateUsername);
     				if (updateRow>0) {
     					System.out.println("修改成功");
     				}else {
     					System.out.println("修改失败");
     				}
     				break;
     			case "3":
     				System.out.println("请输入id:");
     				int deleteId=scanner.nextInt();		
     				int deleteRow = jd.delete(deleteId);
     				if (deleteRow>0) {
     					System.out.println("删除成功");
     				}else {
     					System.out.println("删除失败");
     				}
     				break;
     			case "4":
     				jd.selectAll();
     				break;
     			case "5":
     				System.out.println("请输入要查的id:");
     				int selectOneId=scanner.nextInt();		
     				User user = jd.selectOne(selectOneId);
     				System.out.println(user.getId() + "-" + user.getUsername() + "-" + user.getPassword());
     				break;
     			case "6":
     				System.out.println("请输入姓X:");
     				String xing=scanner.next();
     				jd.select(xing);
     				break;
     			}
     		}
     	}
     }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值