DBUtils 操作数据库学习

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,我们使用apache commons组件一个成员:DButils开发工具包进行开发。需要使用的技术:连接池(获得连接),sql语句。

DBUtils三大核心功能:

  1. QueryRunner中提供对SQL语句操作的API。
  2. ResultSetHandler接口,用于定义select操作后,怎么封装结果集。
  3. dbUtils类,它就是一个工具类,定义了关闭资源与事务处理方法。

QueryRunner核心类:

  1. new QueryRunner(DataSource ds)   提供数据源(连接池),dbutils底层自动维护连接connection。
  2. update(String sql,Object.....params),执行更新数据
  3. query(String sql ,ResultSetHandler rsh,Object.....params)  ,执行查询。

ResultSetHandler结果集处理类:

     DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把           ResultSet转换成你想要的类型。

     DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。

  1. MapHandler:单行处理器!把结果集转换成Map,其中列名为键!
  2. MapListHandler:多行处理器!把结果集转换成List>;
  3. BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
  4. BeanListHandler:多行处理器!把结果集转换成List
  5. ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
  6. ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
  7. DButils工具类:

    1. closeQuietly(Connection conn)关闭连接,如果有异常try后不抛。
    2. commitAndCloseQuietly(Connection conn) 提交并关闭连接。
    3. rollbackAndCloseQuietly(Connection conn)回滚并关闭连接。

    代码:

    这里使用C3P0连接池,

    导包:commons-dbutils-1.4包   , mysql-connector-java-5.0.4-bin 驱动包,c3p0-0.9.1.2连接池包

    准备c3p0-config.xml配置文件

    
    
    	
    	
    		com.mysql.jdbc.Driver
    		jdbc:mysql:///web08
    		root
    		root
    		5
    		20
    	
    	
    	
    	
    		com.mysql.jdbc.Driver
    		jdbc:mysql:///web08
    		root
    		root
    	
    
    
    

    准备 C3P0Utils 工具类

    package cn.itheima.jdbc.utils;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0Utils {
        //加载无参的配置
        //private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");
           //加载的是有名的配置
    	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");
    
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    
    	public static Connection getConnection() {
    		try {
    			return dataSource.getConnection();
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    }

    测试类:

    package cn.itheima.jdbc.test;
    
    import java.sql.SQLException;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.junit.Test;
    
    import cn.itheima.jdbc.utils.C3P0Utils;
    
    /**
     * 测试DBUtils工具类的增删改操作
     * 
     * @author Never Say Never
     * @date 2016年7月31日
     * @version V1.0
     */
    public class TestDBUtils1 {
    
    	/**
    	 * 添加所有用户方法
    	 */
    	@Test
    	public void testAddUser() {
    		try {
    			// 1.创建核心类QueryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写SQL语句
    			String sql = "insert into tbl_user values(null,?,?)";
    			// 3.为站位符设置值
    			Object[] params = { "余淮", "耿耿" };
    			// 4.执行添加操作
    			int rows = qr.update(sql, params);
    			if (rows > 0) {
    				System.out.println("添加成功!");
    			} else {
    				System.out.println("添加失败!");
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 根据id修改用户方法
    	 * 
    	 */
    	@Test
    	public void testUpdateUserById() {
    		try {
    			// 1.创建核心类QueryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写SQL语句
    			String sql = "update tbl_user set upassword=? where uid=?";
    			// 3.为站位符设置值
    			Object[] params = { "xxx", 21 };
    			// 4.执行添加操作
    			int rows = qr.update(sql, params);
    			if (rows > 0) {
    				System.out.println("修改成功!");
    			} else {
    				System.out.println("修改失败!");
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 根据id删除用户方法
    	 */
    	@Test
    	public void testDeleteUserById() {
    		try {
    			// 1.创建核心类QueryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写SQL语句
    			String sql = "delete from tbl_user where uid=?";
    			// 3.为站位符设置值
    			Object[] params = {19};
    			// 4.执行添加操作
    			int rows = qr.update(sql, params);
    			if (rows > 0) {
    				System.out.println("删除成功!");
    			} else {
    				System.out.println("删除失败!");
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    //---------------------------查询--------------------------------------------
    
        /*
    	 * 查询所有用户方法
    	 */
    	@Test
    	public void testQueryAll() {
    		try {
    			// 1.获取核心类queryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写sql语句
    			String sql = "select * from tbl_user";
    			// 3.执行查询操作
    			List users = qr.query(sql, new BeanListHandler(User.class));
    			// 4.对结果集集合进行遍历
    			for (User user : users) {
    				System.out.println(user.getUname() + " : " + user.getUpassword());
    			}
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    	
    	/*
    	 * 根据id查询用户方法
    	 */
    	@Test
    	public void testQueryUserById() {
    		try {
    			// 1.获取核心类queryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写sql语句
    			String sql = "select * from tbl_user where uid=?";
    			//3.为占位符设置值
    			Object[] params = {21};
    			// 4.执行查询操作
    			User user = qr.query(sql, new BeanHandler(User.class), params);
    			System.out.println(user.getUname() + " : " + user.getUpassword());
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    	
    	/*
    	 * 根据所有用户的总个数
    	 */
    	@Test
    	public void testQueryCount() {
    		try {
    			// 1.获取核心类queryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写sql语句
    			String sql = "select count(*) from tbl_user";
    			// 4.执行查询操作
    			Long count = (Long) qr.query(sql, new ScalarHandler());
    			System.out.println(count);
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    	
    	/*
    	 * 查询所有用户方法
    	 */
    	@Test
    	public void testQueryAll1() {
    		try {
    			// 1.获取核心类queryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写sql语句
    			String sql = "select * from tbl_user";
    			// 3.执行查询操作
    			List> list = qr.query(sql, new MapListHandler());
    			// 4.对结果集集合进行遍历
    			for (Map map : list) {
    				System.out.println(map);
    			}
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    	
    	/*
    	 * 查询所有用户方法
    	 */
    	@Test
    	public void testQueryAll2() {
    		try {
    			// 1.获取核心类queryRunner
    			QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    			// 2.编写sql语句
    			String sql = "select * from tbl_user";
    			// 3.执行查询操作
    			List list = qr.query(sql, new ColumnListHandler("uname"));
    			// 4.对结果集集合进行遍历
    			for (Object object : list) {
    				System.out.println(object);
    			}
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    
    }
     
      

     

    你可能感兴趣的:(JavaWeb开发)