2019年2月

DBUtils封装了对JDBC的操作,简化了JDBC的操作,是java编程中数据库操作的实用工具。

三个核心:

  • QueryRunner中提供了对sql语句操作的API。

    • QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层自动维护连接connection。
    • update(String sql,Object... params),执行更新数据。
    • query(String sql,ResultSetHandlerrsh,Object...params),执行查询。
  • ResultSetHandler接口,用于定义select操作后,封装结果集。(在下面的案例中有提现)。
  • DBUtils类,这是一个工具类,定义了关闭资源与事务处理的方法。

    • closeQuietly(Connection conn)关闭连接,如果有异常,使用try进行处理。
    • commitAndCloseQuietly(Connection conn)提交并关闭连接。
    • rollbackAndCloseQuietly(Connection conn)回滚并关闭连接。

基本步骤

1.创建核心类QueryRunner
2.编写SQL语句
3.为占位符设置值
4.执行操作

案例

注意:案例使用到了C3P0连接池,不会的小伙伴请参考小编以前的文章哦。

  • 添加操作

    public void testAddUser() {
          try {
              //1.创建核心类QueryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写SQL语句
              String sql = "insert into users values(null,?,?)";
              //3.为占位符设置值
              Object[] params = {"12","34"};
              //4.执行添加操作
              int rows = qr.update(sql,params);
              if (rows>0) {
                  System.out.println("添加成功");
              }else {
                  System.out.println("添加失败");
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
  • 修改操作

    public void testUpdateUserById() {
          try {
              //1.创建核心类QueryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写SQL语句
              String sql = "update users set upwd = ? where uid = ?";
              //3.为占位符设置值
              Object[] params = {"1212",1};
              //4.执行修改操作
              int rows = qr.update(sql,params);
              if(rows>0) {
                  System.out.println("修改成功");
              }else {
                  System.out.println("修改失败");
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
          
      }
  • 删除操作

    public void testDeleteUserById() {
          
          try {
              //1.创建核心类QueryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写SQL语句
              String sql = "delete from Users where uid = ?";
              //3.为占位符设置值
              Object[] params = {2};
              //4,执行删除操作
              int rows = qr.update(sql,params);
              if (rows>0) {
                  System.out.println("删除成功");
              }else {
                  System.out.println("删除失败");
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
          
      }
  • 查询操作(种类较多)

    public class TestDBUtils2{
      
      /**
       * 查询所有用户方法
       */
      @Test
      public void testQueryAll() {
          try {
              //1,获取核心类queryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写sql语句
              String sql = "select * from users";
              //3.执行结果查询
              List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
              //4.对结果集集合进行遍历
              for(User user : users) {
                  System.out.println(user.getUname()+"---"+user.getUpwd());
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
          
      }
      
      /**
       * 根据id查询用户
       */
      @Test
      public void testQueryUserById() {
          
          try {
              //1.获取核心类queryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写sql语句
              String sql = "select * from users where uid = ?";
              //3.为占位符设置值
              Object[] params = {1};
              //4.执行查询操作
              User user = qr.query(sql, new BeanHandler<User>(User.class),params);
              //5.输出结果
              System.out.println(user.getUname()+"---"+user.getUpwd());
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
      
      /**
       * 查询用户的数量
       */
      @Test
      public void testQueryCount() {
          
          try {
              //1.获取核心类queryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写sql语句
              String sql = "select count(*) from users";
              //3.执行查询语句
              Long count = (Long)qr.query(sql, new ScalarHandler());
              //4.输出结果
              System.out.println(count);
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
      /**
       * 查询所有用户
       */
      @Test
      public void testQueryAll1() {
          
          try {
              //1.获取核心类
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2.编写sql语句
              String sql = "select * from users";
              //3.执行查询操作
              List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
              //4.对结果集进行遍历
              for (Map<String, Object> map : list) {
                  System.out.println(map);
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
          
      }
      
      /**
       * 查询所有用户
       */
      @Test
      public void testQueryAll2() {
          
          try {
              //1.获取核心类queryRunner
              QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
              //2,编写sql
              String sql = "select * from users";
              //3.执行查询操作
              List<Object> List = qr.query(sql,new ColumnListHandler("uname"));
              //4.对结果集进行遍历
              for (Object object : List) {
                  System.out.println(object);
              }
          } catch (SQLException e) {
              e.printStackTrace();
          }
          
      }
     }

DBCP是tomcat内置的连接池。
使用方法:

  • 导入jar包
    1.png
  • 书写配置文件

    • 配置文件名称:*.properties(文件名任意,但是扩展名固定)。
    • 位置任意,一般放在src目录下。
    • 不能写中文。
    • 内容(其他配置也写在这里面):

       driver=com.mysql.jdbc.Driver
       url=jdbc:mysql://127.0.0.1:3306/ning
       username=root
       password=root
  • 工具类:

    package com.sunxiaoning.jdbc.utils;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp.BasicDataSourceFactory;
    
    /**
     * DBCP工具类
     * @author sunxiaoning
     *
     */
    public class DBCPUtils {
      private static DataSource dataSource;
      static {
          
          try {
              //1.加载找properties文件输入流
              InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
              //2.加载输入流
              Properties props = new Properties();
              props.load(is);
              //3.创建数据源
              dataSource = BasicDataSourceFactory.createDataSource(props);
              
          } catch (Exception e) {
              throw new RuntimeException();
          }
       }
      
      /**
       * 获取数据源(连接池)
       * @return
       */
      public static DataSource getDataSource() {
          return dataSource;
      }
      
      /**
       * 获得连接
       * @return
       */
      public static Connection getConnection() {
          try {
              return dataSource.getConnection();
          } catch (SQLException e) {
              throw new RuntimeException();
          }
      }
    }
    
  • 测试类

    package com.sunxiaoning.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import org.junit.jupiter.api.Test;
    
    import com.sunxiaoning.jdbc.utils.DBCPUtils;
    
    public class TestDBCP {
      
      @Test
      public void testUpdateByid() {
          Connection conn = null;
          PreparedStatement pstmt = null;
          try {
              conn = DBCPUtils.getConnection();
              String sql = "update users set upwd =? where uid =?";
              pstmt = conn.prepareStatement(sql);
              pstmt.setString(1, "222");
              pstmt.setInt(2, 1);
              int rows = pstmt.executeUpdate();
              if(rows>0) {
                  System.out.println("更新成功");
              }else {
                  System.out.println("更新失败");
              }
          } catch (Exception e) {
              throw new RuntimeException();
          }finally {
              if (conn!=null) {
                  try {
                      conn.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              
              if(pstmt!=null) {
                  try {
                      conn.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              
          }
          
      }
    }
    

C3P0是一款开源免费的连接池,连接池的主要作用就是提高性能。
使用方法:

  1. 导入jar包:c3p0的jar包和mysql的jar包(小编使用的是mysql数据库),这两个jar包可以自行百度下载。也可以给小编留言哦。
  2. 编写配置文件c3p0-config.xml

    • 配置文件的名称必须为:c3p0-config.xml;
    • 一般情况放在src目录里面。
    • 文件的配置(以下是主要配置,其他选项可以参考手册)

      <?xml version="1.0" encoding="UTF-8"?>
      <c3p0-config>
       <default-config>
      <!-- 连接数据库的参数 -->
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql:///ning</property>
      <property name="user">root</property>
      <property name="password">root</property>
      <!-- 初始化连接数 -->
      <property name="initialPoolSize">5</property>
      <!-- 最大连接数 -->
      <property name="maxPoolSize">20</property>
       </default-config>
       <named-config name="ning">
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql:///ning</property>
      <property name="user">root</property>
      <property name="password">root</property>
       </named-config>
      </c3p0-config>
  3. 工具类

    package com.sunxiaoning.jdbc.utils;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0Utils {
     private static ComboPooledDataSource dataSource = new ComboPooledDataSource("itheima");
     
     /**
      * 获得数据源(连接池)
      * @return
      */
     public static ComboPooledDataSource getDataSource() {
         return dataSource;
     }
     
     /**
      * 获得连接
      * @return
      */
     public static Connection getConnection() {
         try {
             return dataSource.getConnection();
         } catch (SQLException e) {
             throw new RuntimeException();
         }
     }
     
     /**
      * 归还连接
      * @param conn
      */
     public static void closeConn(Connection conn){
         try {
             if(conn!=null && conn.isClosed()){
                 conn.close();
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }
     }
    }
    

    附录:测试类

    package com.sunxiaoning.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import org.junit.jupiter.api.Test;
    
    import com.sunxiaoning.jdbc.utils.C3P0Utils;
    /**
     * 测试C3P0
     * @author sunxiaoning
     *
     */
    package com.sunxiaoning.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import org.junit.jupiter.api.Test;
    
    import com.sunxiaoning.jdbc.utils.C3P0Utils;
    /**
     * 测试C3P0
     * @author sunxiaoning
     *
     */
    public class TestC3P0 {
    
     @Test
     public void testAddUser() {
         Connection conn = null;
         PreparedStatement pstmt = null;
         
         try {
             conn = C3P0Utils.getConnection();
             String sql = "insert into users values(null,?,?)";
             pstmt = conn.prepareStatement(sql);
             pstmt.setString(1, "小宁");
             pstmt.setString(2, "qwe");
             int row = pstmt.executeUpdate();
             if(row>0) {
                 System.out.println("添加成功");
             }else {
                 System.out.println("添加失败");
             }
         } catch (SQLException e) {
             throw new RuntimeException();
         }finally {
             C3P0Utils.closeConn(conn);
             if (pstmt!=null) {
                 try {
                     pstmt.close();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
             }
         }
         
     }
    }
    

  1. 我们打开eclipse,选择window选项,再选择preferences。
    1.png
  2. 在左侧的菜单栏里面选择java,再选择editor选项,然后再其展开后的子菜单content assist选项。
  3. 在右侧的对话框中auto activation 下面的子选项auto activation triggers for java后的文本框中添加abcdefghijklmnopqrstuvwxyz(完整形式就是:.abcdefghijklmnopqrstuvwxyz)即可。
    2.png

delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。而且delete删除数据后,拥有自动增长约束的字段,将会自动增长,不会从1继续增长,而是继续以前的。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。而且truncate删除数据后,拥有自动增长约束的字段,将会从1自动增长。