JDBCUtils工具类的基础学习笔记

注:以下整理笔记来自自己的公众号,适合初学者一起探讨,我也是初学者!

创建一个实体类:

package com.zx.bean;

public class User {
  private int id;
  private String name;
  private String password;
  private String tel;
  private String email;
  
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getTel() {
    return tel;
  }
  public void setTel(String tel) {
    this.tel = tel;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", password=" + password + ", tel=" + tel + ", email=" + email
        + "]";
  }
}

1.初步使用jdbcutils,简单使用,直接在需要的地方使用

package com.zx.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import com.zx.bean.User;

public class DataSources {
  private static String driver="com.mysql.jdbc.Driver";
  private static String URL="jdbc:mysql://localhost:3306/data_gk";
  private static String USER="root";
  private static String PASSWORD="12345";
  private Connection connection=null;
  private PreparedStatement preparedStatement=null;
  private ResultSet resultSet=null;
  public static void main(String[] args) {
    new DataSources();

  }
  public DataSources() {
    this.query();
    this.insert();
    this.update();
    this.delete();
  }
  //查询数据
  public void query(){  
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      connection=DriverManager.getConnection(URL,USER,PASSWORD);
      System.out.println("恭喜!数据库连接成功!");
      
      String sql="select * from user";
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //得到查询结果,结果是一个数组
      resultSet=preparedStatement.executeQuery();
      //将结果放进集合中,方便读取
      ArrayList<User> list=new ArrayList<User>();
      while(resultSet.next()) {
        //将结果封装到user对象中
        User user=new User();
        user.setId(resultSet.getInt("id"));
        user.setName(resultSet.getString("name"));
        user.setPassword(resultSet.getString("password"));
        user.setTel(resultSet.getString("tel"));
        user.setEmail(resultSet.getString("email"));
        list.add(user);
      }
      //使用迭代器输出结果
      Iterator it=list.iterator();
      while(it.hasNext()) {
        System.out.println(it.next().toString());
      }
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      try {
        resultSet.close();
      }catch (SQLException e) {
        System.out.println("resultSet资源关闭失败!");
        e.printStackTrace();
      }
      try {
        preparedStatement.close();
      }catch (SQLException e) {
        System.out.println("preparedStatement资源关闭失败!");
        e.printStackTrace();
      }
      try {
        connection.close();
      }catch (SQLException e) {
        System.out.println("connection资源关闭失败!");
        e.printStackTrace();
      }
      System.out.println("数据库资源已关闭!");
      
    }
  }
  
  //添加数据
  public void insert(){  
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      connection=DriverManager.getConnection(URL,USER,PASSWORD);
      System.out.println("恭喜!数据库连接成功!");
      
      String sql="insert into user(name,password,tel,email) values('tom','12345','12345678900','[email protected]')";
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //返回添加结果,结果是一个整数
      int row =preparedStatement.executeUpdate();
      if(row>0) {
        System.out.println("数据添加成功!");
      }else {
        System.out.println("数据添加失败!");
      }
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      try {
        preparedStatement.close();
      }catch (SQLException e) {
        System.out.println("preparedStatement资源关闭失败!");
        e.printStackTrace();
      }
      try {
        connection.close();
      }catch (SQLException e) {
        System.out.println("connection资源关闭失败!");
        e.printStackTrace();
      }
      System.out.println("数据库资源已关闭!");
      
    }
  }
  
  //修改数据
  public void update(){  
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      connection=DriverManager.getConnection(URL,USER,PASSWORD);
      System.out.println("恭喜!数据库连接成功!");
      
      String sql="update user set name='lucy',password='55555' where id=3";
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //返回修改结果,结果是一个整数
      int row =preparedStatement.executeUpdate();
      if(row>0) {
        System.out.println("数据修改成功!");
      }else {
        System.out.println("数据修改失败!");
      }
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      try {
        preparedStatement.close();
      }catch (SQLException e) {
        System.out.println("preparedStatement资源关闭失败!");
        e.printStackTrace();
      }
      try {
        connection.close();
      }catch (SQLException e) {
        System.out.println("connection资源关闭失败!");
        e.printStackTrace();
      }
      System.out.println("数据库资源已关闭!");
      
    }
  }
  
  //删除数据
  public void delete(){  
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      connection=DriverManager.getConnection(URL,USER,PASSWORD);
      System.out.println("恭喜!数据库连接成功!");
      
      String sql="delete from user where id=3";
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //返回删除结果,结果是一个整数
      int row =preparedStatement.executeUpdate();
      if(row>0) {
        System.out.println("数据删除成功!");
      }else {
        System.out.println("数据删除失败!");
      }
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      try {
        preparedStatement.close();
      }catch (SQLException e) {
        System.out.println("preparedStatement资源关闭失败!");
        e.printStackTrace();
      }
      try {
        connection.close();
      }catch (SQLException e) {
        System.out.println("connection资源关闭失败!");
        e.printStackTrace();
      }
      System.out.println("数据库资源已关闭!");
      
    }
  }
}

2.第2版:创建工具类:把相同部分抽取优化


package com.zx.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import com.zx.bean.User;

public class DataSources {
  private static String driver="com.mysql.jdbc.Driver";
  private static String URL="jdbc:mysql://localhost:3306/data_gk";
  private static String USER="root";
  private static String PASSWORD="12345";
  private Connection connection=null;
  private PreparedStatement preparedStatement=null;
  private ResultSet resultSet=null;
  private String sql="";
  public void getConnection(){
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      connection=DriverManager.getConnection(URL,USER,PASSWORD);
      System.out.println("恭喜!数据库连接成功!");
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    } catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }
    
  }
  public static void main(String[] args) {
    new DataSources();

  }
  public DataSources() {
    this.query();
    sql="insert into user(name,password,tel,email) values('tom','12345','12345678900','[email protected]')";
    this.update(sql,"添加");
    sql="update user set name='lucy',password='55555' where id=5";
    this.update(sql,"修改");
    sql="delete from user where id=5";
    this.update(sql,"删除");
  }
  //查询数据
  public void query(){  
    try {
      this.getConnection();
      sql="select * from user";
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //得到查询结果,结果是一个数组
      resultSet=preparedStatement.executeQuery();
      //将结果放进集合中,方便读取
      ArrayList<User> list=new ArrayList<User>();
      while(resultSet.next()) {
        //将结果封装到user对象中
        User user=new User();
        user.setId(resultSet.getInt("id"));
        user.setName(resultSet.getString("name"));
        user.setPassword(resultSet.getString("password"));
        user.setTel(resultSet.getString("tel"));
        user.setEmail(resultSet.getString("email"));
        list.add(user);
      }
      //使用迭代器输出结果
      Iterator it=list.iterator();
      while(it.hasNext()) {
        System.out.println(it.next().toString());
      }
    }catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      this.close(connection, preparedStatement, resultSet);  
    }
  }
  
  //添加、修改、删除数据
  public void update(String sql,String action){  
    try {
      this.getConnection();
      //使用preparedStatement防止SQL注入
      preparedStatement=connection.prepareStatement(sql);
      //返回添加结果,结果是一个整数
      int row =preparedStatement.executeUpdate();
      if(row>0) {
        System.out.println("数据"+action+"成功!");
      }else {
        System.out.println("数据"+action+"失败!");
      }
    }catch (SQLException e) {
      System.out.println("数据"+action+"失败!");
      e.printStackTrace();
    }finally {
      //关闭数据资源
      this.close(connection, preparedStatement, resultSet);
    }
  }
  
  public static void close(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) {
    if(connection !=null) {
      try {
        connection.close();
      }catch (SQLException e) {
        System.out.println("connection资源关闭失败!");
        e.printStackTrace();
      }
    }
    
    if(preparedStatement !=null) {
      try {
        preparedStatement.close();
      }catch (SQLException e) {
        System.out.println("preparedStatement资源关闭失败!");
        e.printStackTrace();
      }
    }
    
    if(resultSet !=null) {
      try {
        resultSet.close();
      }catch (SQLException e) {
        System.out.println("resultSet资源关闭失败!");
        e.printStackTrace();
      }
    }
    System.out.println("数据库资源已关闭!");
  }

}

演示示例:

3.第3版

//db.properties文档
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/data_gk?useSSL=true
usrname=root
password=12345

package com.zx.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
//连接数据库
public class DataSources {
  private static String driver;
  private static String URL;
  private static String USER;
  private static String PASSWORD;

  static {  
    try {
      ClassLoader classLoader=DataSources.class.getClassLoader();
      //URL resources=classLoader.getResource ("db.properties");
      InputStream resources=classLoader.getResourceAsStream("db.properties");
      Properties properties=new Properties();
      properties.load(resources);
      //properties.load (new FileReader (resources.getPath ()));
      driver=properties.getProperty("driver");
      URL=properties.getProperty("url");
      USER=properties.getProperty("usrname");
      System.out.println(USER);
      PASSWORD=properties.getProperty("password");
    } catch (IOException e) {
      e.printStackTrace();
    }
    
  }
  
  public Connection getConnection(){
    Connection con=null;
    try {
      //注册驱动
      Class.forName(driver);
      //连接数据库
      con=DriverManager.getConnection(URL,USER,PASSWORD);
    } catch (ClassNotFoundException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    } catch (SQLException e) {
      System.out.println("数据库连接失败!");
      e.printStackTrace();
    }
    return con;  
  }
  
  public DataSources() {}
}

package com.zx.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.zx.bean.User;

//数据库处理
public class QueryRunnable {
  DataSources dataSources;
  public QueryRunnable(DataSources dataSources) {
    this.dataSources=dataSources;
  }
  //查询数据,将来使用泛型,这样就可以处理各种类了
  public ArrayList<User> query(String sql){
    ArrayList<User> list=new ArrayList<User>();
    try {
      Connection con=dataSources.getConnection();
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      ResultSet resultSet=preparedStatement.executeQuery();
      while(resultSet.next()) {
        //将结果封装到user对象中
        User user=new User();
        user.setId(resultSet.getInt("id"));
        user.setName(resultSet.getString("name"));
        user.setPassword(resultSet.getString("password"));
        user.setTel(resultSet.getString("tel"));
        user.setEmail(resultSet.getString("email"));
        list.add(user);
      }
      //关闭资源
      resultSet.close();
      preparedStatement.close();
      con.close();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return list;
  }
  
  //添加、修改、删除数据
  public int update(String sql) {
    int row=0;
    try {
      Connection con=dataSources.getConnection();
      //使用preparedStatement防止SQL注入
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      //返回添加结果,结果是一个整数
      row =preparedStatement.executeUpdate();
      //关闭资源
      preparedStatement.close();
      con.close();
    }catch (SQLException e) {
      e.printStackTrace();
    }
    return row;  
  }
}

package com.zx.utils;

import java.util.ArrayList;
import java.util.Iterator;
import com.zx.bean.User;
//测试代码
public class Test {
  private String sql = "";

  public static void main(String[] args) {
    new Test();
  }

  public Test() {
    this.query();
    sql = "insert into user(name,password,tel,email) values('tom','12345','12345678900','[email protected]')";
    this.update(sql, "添加");
    sql = "update user set name='lucy',password='55555' where id=4";
    this.update(sql, "修改");
    sql = "delete from user where id=7";
    this.update(sql, "删除");
  }

  // 查询数据
  public void query() {
    sql = "select * from user";
    DataSources dataSources = new DataSources();
    QueryRunnable queryRunnable = new QueryRunnable(dataSources);
    ArrayList<User> list = queryRunnable.query(sql);
    // 使用迭代器输出结果
    Iterator it = list.iterator();
    while (it.hasNext()) {
      System.out.println(it.next().toString());
    }

  }

  // 添加、修改、删除数据
  public void update(String sql, String action) {
    DataSources dataSources = new DataSources();
    QueryRunnable queryRunnable = new QueryRunnable(dataSources);
    int row = queryRunnable.update(sql);
    if (row > 0) {
      System.out.println("数据" + action + "成功!");
    } else {
      System.out.println("数据" + action + "失败!");
    }
  }
}

演示示例:

4.第4版

package com.zx.utils;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

//数据库处理
public class QueryRunnable {
  DataSources dataSources;
  public QueryRunnable(DataSources dataSources) {
    this.dataSources=dataSources;
  }
  //查询数据,将来使用泛型,这样就可以处理各种类了
  public ArrayList query(String sql,Generics generics){
    ArrayList list=new ArrayList();
    try {
      Connection con=dataSources.getConnection();
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      ResultSet resultSet=preparedStatement.executeQuery();
      while(resultSet.next()) {
        //需要set方法,属性类型,属性名称
        list.add(generics.reflectMethod(resultSet));
      }
      //关闭资源
      resultSet.close();
      preparedStatement.close();
      con.close();
    } catch (SQLException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return list;
  }
  
  //添加、修改、删除数据
  public int update(String sql) {
    int row=0;
    try {
      Connection con=dataSources.getConnection();
      //使用preparedStatement防止SQL注入
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      //返回添加结果,结果是一个整数
      row =preparedStatement.executeUpdate();
      //关闭资源
      preparedStatement.close();
      con.close();
    }catch (SQLException e) {
      e.printStackTrace();
    }
    return row;  
  }
}

class Generics<T>{
  Class obj;
  public Generics(Class obj) throws Exception {
    this.obj=obj;//获得类名  

  }
  //此方法不好之处是需要把sql中所有的基本类型都罗列一遍,而且很多方法是不确定的
  public T reflectMethod(ResultSet resultSet) throws Exception {
    T t=(T) obj.newInstance();//实例化对象
    Method[] mt=obj.getDeclaredMethods();//获取本类所有的方法
    for(Method e:mt) {
      if(e.getReturnType().equals(Void.TYPE)) {//获得所有set的方法
        Method met=obj.getDeclaredMethod(e.getName(), e.getParameterTypes()[0]);//获取指定类的方法
        String str=this.getMethodParameterName(e.getName());
        met.invoke(t, resultSet.getObject(str, e.getParameterTypes()[0]));//利用泛型处理resultSet的获取值
      }
      
    }
    return t;
  }
  public String getMethodParameterName(String ss) {
    return ss.substring(3,ss.length()).substring(0,1).toLowerCase()+ss.substring(4,ss.length());
    
  }
}

5.目前学习到的位置:

(1)继续优化


package com.gk.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

//数据库处理
public class QueryRunner {
  DataSources dataSources;
  public QueryRunner(DataSources dataSources) {
    this.dataSources=dataSources;
  }
  //查询数据,将来使用泛型,这样就可以处理各种类了
  public ArrayList query(String sql,Generics generics,Object...params){
    ArrayList list=new ArrayList();
    try {
      Connection con=dataSources.getConnection();
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      //使用不确定参数,解决参数类型和参数个数未定的问题
      for(int i=0;i<params.length;i++) {
        preparedStatement.setObject((i+1), params[i]);
      }
      ResultSet resultSet=preparedStatement.executeQuery();
      while(resultSet.next()) {
        //需要set方法,属性类型,属性名称
        list.add(generics.reflectMethod(resultSet));
      }
      //关闭资源
      resultSet.close();
      preparedStatement.close();
      con.close();
    } catch (SQLException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return list;
  }

  //添加、修改、删除数据
  public int update(String sql,Object...params) {
    int row=0;
    try {
      Connection con=dataSources.getConnection();
      //使用preparedStatement防止SQL注入
      PreparedStatement preparedStatement=con.prepareStatement(sql);
      //使用不确定参数,解决参数类型和参数个数未定的问题
      for(int i=0;i<params.length;i++) {
        preparedStatement.setObject((i+1), params[i]);
      }
      //返回添加结果,结果是一个整数
      row =preparedStatement.executeUpdate();
      //关闭资源
      preparedStatement.close();
      con.close();
    }catch (SQLException e) {
      e.printStackTrace();
    }
    return row;
  }
}

(2)创建一个实验类,处理从前端收到的提交数据


package com.gk.utils;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
//处理前端所获参数及其值的工具类
public class BeanUtils{

  public static void populate(Object obj,Map<String,String[]> parameterMap) throws Exception {
    //根据得到的参数列表,对obj的所有属性的set方法进行赋值
    //使用反射获取所有set方法
    Class cls=obj.getClass ();//得到类名
    Method[] mt=cls.getDeclaredMethods();//获取本类所有的方法

    Set<String> keySet=parameterMap.keySet();//获取键的集合
    Iterator<String> it=keySet.iterator();//使用迭代器读取
    for(Method e:mt) {
      //用下面这个方法,前提如下:对象封装类的void方法只有set方法
      if(e.getReturnType().equals(Void.TYPE)) {
        Method met=cls.getDeclaredMethod(e.getName(), e.getParameterTypes()[0]);//获取指定类的方法
        String str=getMethodParameterName(e.getName());//获取set方法参数名
        while(it.hasNext()) {
          String key=it.next();//得到属性名
          String[] value=parameterMap.get(key);
          if (key.equals (str)) {
            met.invoke(obj,value[0] );//指定方法赋值,如果不是String类型?
            break;
          }
        }
      }
    }

//    //读取map集合所有元素的三种方法
//    /*方法1:通过keyset方法获取map中所有的键所在的set集合,再通过set的迭代器获取到每一个键
//     *   再对每一个键通过map集合的get方法获取其对应的值
//     */
//    Set<String> keySet=parameterMap.keySet();
//    Iterator<String> it=keySet.iterator();
//    while(it.hasNext()) {
//      String key=it.next();
//      String[] value=parameterMap.get(key);
//      System.out.println(key+":"+value[0]);
//    }

//    /*方法2:通过map转成set就可以迭代,找到另一个方法,entrySet
//     * 该方法将键和值得映射关系作为对象存储到set集合中,而这个映射关系的类型就是map.entry类型
//     */
//    Set<Map.Entry<String,String[]>> entrySet=parameterMap.entrySet();
//    Iterator<Map.Entry<String,String[]>> it1=entrySet.iterator();
//    while(it1.hasNext()) {
//      Map.Entry<String,String[]> me=it1.next();
//      String key1=me.getKey();
//      String[] value1=me.getValue();
//      System.out.println(key1+":"+value1[0]);
//    }
//
//    //取出map的values()方法取出其中所有的值,然后全部打印出来
//    Collection<String[]> values=parameterMap.values();
//
//    Iterator<String[]> it2=values.iterator();
//    while(it2.hasNext()) {
//      System.out.println(it2.next()[0]);
//    }
  }
  public static String getMethodParameterName(String ss) {
    return ss.substring(3,ss.length()).substring(0,1).toLowerCase()+ss.substring(4,ss.length());
  }

}

猜你喜欢

转载自blog.csdn.net/preston555/article/details/110069743