封装一个泛型类的JDBC工具类

缺乏、安全感 2022-01-16 13:41 393阅读 0赞

封装一个泛型类的JDBC工具类

  • 预备知识
  • 源代码分析
    • 文件结构
    • 说明
    • 获取数据库连接对象
    • 插入一条数据
    • 获取数据库表所有记录
    • 删除一条记录
    • 修改记录
    • 获取单条记录
    • 关闭数据库对象

预备知识

利用java的反射机制可以获取到类的结构信息,动态调用属性和方法

  • 获取Class的实例的三种方法

    Class class=类名.class;
    Class class=Class.forName(“全类名”);
    Class class=对象.getClass();

  • 获取对象的类名

    String className=class.getName();//获取结果为全类名
    String className=class.getSimpleName();//获取简单类名

  • 获取Field

    Field field=class.getField(“属性名”);//通过属性名获取public的属性
    Field[] fields=class.getFields();//获取所有用public修饰的属性
    Field field=class.getDeclaredField(“属性名”);//获取的属性包括public和private
    Field[] field = c.getDeclaredFields();//获取所有属性包括public和private

  • 获取Field的信息

    String name=field.getName();//获取属性名
    Class<?> type=filed.getType();//获取属性类型
    Object value=field.get(obj);//获取obj对象field属性的值
    field.set(obj,value);//设置obj对象的field属性的值

  • 设置private修饰的属性为可访问

    field.setAccessible(true);//默认为false只能对public修饰的操作,设置为true可对private修饰的操作

源代码分析

文件结构

在eclipse一个项目中创建一个JDBCUtils.java文件,其所需要的包和类中的成员

  1. package step2;
  2. import java.lang.reflect.Field;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class JDBCUtils {
  11. private static Connection getConnection();
  12. public void insert(Object obj);
  13. public <T> List<T> selectAll(Class<T> c) ;
  14. public void delete(Object obj) ;
  15. public void update(Object obj) ;
  16. public static void close(ResultSet rs,PreparedStatement ps,Connection conn);
  17. public <T> Object selectById(Class<T> c,int id) ;
  18. }

说明

  • 注意Object对象属性名称要求和数据库中表结构字段名以及类型一致
  • 默认第一个属性为主键,更改时通过第一个属性进行更改

获取数据库连接对象

  1. private static Connection getConnection() {
  2. try {
  3. Class.forName("com.mysql.jdbc.Driver");
  4. } catch (ClassNotFoundException e) {
  5. e.printStackTrace();
  6. }
  7. String url="jdbc:mysql://localhost:3306/mysql_db";
  8. Connection conn=null;
  9. String user = "root";
  10. String password = "";//数据库密码
  11. try {
  12. conn = DriverManager.getConnection(url,user,password);
  13. } catch (SQLException e) {
  14. e.printStackTrace();
  15. }
  16. return conn;
  17. }

插入一条数据

  1. public void insert(Object obj) {
  2. Connection conn = getConnection(); //连接数据库
  3. PreparedStatement ps = null;
  4. Class<?> c = obj.getClass();
  5. StringBuffer sb= new StringBuffer("insert into "+c.getSimpleName()+"(");
  6. Field [] field = c.getDeclaredFields();
  7. for(int i=0;i<field.length;i++){
  8. if(i!=field.length-1){
  9. sb.append(field[i].getName()).append(",");
  10. }
  11. else{
  12. sb.append(field[i].getName()).append(") values(");
  13. }
  14. }
  15. for(int i=0;i<field.length;i++){
  16. if(i!=field.length-1){
  17. sb.append("?,");
  18. }
  19. else{
  20. sb.append("?);");
  21. }
  22. }
  23. String sql = sb.toString();
  24. try {
  25. ps = conn.prepareStatement(sb.toString());
  26. for(int i = 0; i < field.length; i++) {
  27. field[i].setAccessible(true);//设置可以访问私有属性
  28. ps.setObject(i+1,field[i].get(obj));
  29. }
  30. ps.execute();//执行sql语句
  31. }catch (Exception e) {
  32. e.printStackTrace();
  33. }finally {
  34. close(null,ps,conn);
  35. }
  36. }

获取数据库表所有记录

  1. public <T> List<T> selectAll(Class<T> c) {
  2. Connection conn = getConnection();
  3. List<T> list = new ArrayList<T>();
  4. Field[] field = c.getDeclaredFields();
  5. PreparedStatement ps = null;
  6. ResultSet rs = null;
  7. String sql ="select * from "+ c.getSimpleName();
  8. try {
  9. ps = conn.prepareStatement(sql);
  10. rs = ps.executeQuery();
  11. while(rs.next()) {
  12. T obj = (T)c.newInstance();
  13. for(int i = 0; i < field.length; i++) {
  14. field[i].setAccessible(true);
  15. field[i].set(obj, rs.getObject(field[i].getName()));
  16. }
  17. list.add(obj);
  18. }
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }finally {
  22. close(rs,ps,conn);
  23. }
  24. return list;
  25. }

删除一条记录

  1. public void delete(Object obj) {
  2. Connection conn = getConnection();
  3. PreparedStatement ps = null;
  4. Class<?> c = obj.getClass();//获取obj的Class
  5. StringBuffer sb = new StringBuffer("delete from "+ c.getSimpleName() +" where ");//利用StringBuffer进行删除SQL语句的构造
  6. Field[] field = c.getDeclaredFields();//通过反射获取对象的属性数组
  7. sb.append(field[0].getName() + " = ?;");
  8. String sql = sb.toString();
  9. try {
  10. ps = conn.prepareStatement(sql);
  11. field[0].setAccessible(true);
  12. ps.setObject(1, field[0].get(obj));//对预编译的SQL语句中的 ? 进行赋值
  13. ps.execute();//执行sql语句
  14. }catch (Exception e) {
  15. e.printStackTrace();
  16. }finally {
  17. close(null,ps,conn);
  18. }
  19. }

修改记录

  1. public void update(Object obj) {
  2. Class<?> c = obj.getClass();//获取obj的Class
  3. StringBuffer sb = new StringBuffer("update "+ c.getSimpleName() +" set ");//利用StringBuffer进行修改SQL语句的构造
  4. Field[] field = c.getDeclaredFields();//通过反射获取对象的属性数组
  5. for(int i = 1; i < field.length; i++) {
  6. if(i != field.length-1) { //判断是否为最后一个属性,若不是则后增加逗号
  7. sb.append(field[i].getName()).append("=?,");
  8. }else { //若为最后一个属性则添加 where
  9. sb.append(field[i].getName()).append("=? where ");
  10. }
  11. }
  12. //默认第一个属性为主键,切更改时通过第一个属性进行更改
  13. sb.append(field[0].getName() + "=?");
  14. String sql = sb.toString()+";";
  15. Connection conn = getConnection();//获取连接对象
  16. PreparedStatement ps = null;
  17. try {
  18. ps = conn.prepareStatement(sql);
  19. for(int i = 1; i < field.length; i++) {
  20. field[i].setAccessible(true);//设置可以访问私有属性
  21. ps.setObject(i, field[i].get(obj));//对预编译的SQL语句中的 ? 进行赋值
  22. }
  23. field[0].setAccessible(true);
  24. ps.setObject(field.length, field[0].get(obj));
  25. ps.execute();//执行sql语句
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }finally {
  29. close(null,ps,conn);//关闭连接数据
  30. }
  31. }

获取单条记录

  1. public <T> Object selectById(Class<T> c,int id) {
  2. String sql = "select * from "+ c.getSimpleName()+" where id="+id;
  3. Field[] field = c.getDeclaredFields();
  4. Connection conn = getConnection();
  5. PreparedStatement ps = null;
  6. ResultSet rs = null;
  7. Object obj=null;
  8. try {
  9. ps = conn.prepareStatement(sql);
  10. rs = ps.executeQuery();
  11. obj = c.newInstance();
  12. while(rs.next()) {
  13. for(int i = 0; i < field.length; i++) {
  14. field[i].setAccessible(true);
  15. field[i].set(obj, rs.getObject(field[i].getName()));
  16. }
  17. }
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }finally {
  21. close(rs,ps,conn);
  22. }
  23. return obj;
  24. }

关闭数据库对象

  1. public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
  2. try {
  3. if(rs!=null) rs.close();
  4. if(ps!=null) ps.close();
  5. if(conn!=null) conn.close();
  6. } catch (SQLException e) {
  7. e.printStackTrace();
  8. }
  9. }

发表评论

表情:
评论列表 (有 0 条评论,393人围观)

还没有评论,来说两句吧...

相关阅读