JDBC操作数据库通用操作(增,删,改,查)

JDBC操作数据库通用操作(增,删,改,查)

一、JDBC操作数据库基本步骤

  1. 获取数据库的连接
  2. 预编译sql语句,得到PreparedStatement对象
  3. 填充占位符
  4. 执行sql的相关操作(增,删,改,查)
  5. 关闭资源

二、JDBC(增,删,改,查)操作

配置db.properties(这里以test库为例 注意user password 输入你自己电脑mysql的用户和密码)

user=root
password=824008
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver

JDBCUtils工具类

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
    /**
     * @Description 获取数据库的连接
     */
    public static Connection getConnection() throws Exception { 
        
        //1.加载配置文件
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");

        //2.读取配置信息
        Properties pros = new Properties();
        pros.load(is);

        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");

        // 3.加载驱动
        Class.forName(driverClass);

        // 4.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }
    /**
     *
     * @Description 关闭连接和Statement的操作
     */
    public static void closeResource(Connection conn,Statement ps){
        try {
            if(ps != null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(conn != null)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     *
     * @Description 关闭资源操作 
     * ResultSet rs 结果集的元数据:ResultSetMetaData
     */
    public static void closeResource(Connection conn, Statement ps, ResultSet rs){
        try {
            if(ps != null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(conn != null)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

增删改通用方法

public void Update(String sql,Object ...args) {
    Connection conn = null;
    PreparedStatement pre = null;
    try {
        //1.获取数据库连接
        conn = JDBCUtils.getConnection();
        //2.预编译sql语句,返回PreparedStatement的实例
        pre = conn.prepareStatement(sql);
        //3.填充占位符
        for(int i = 0; i<args.length; i++){
            pre.setObject(i+1,args[i]);
        }
        //4.执行sql语句
        pre.execute();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //5.关闭资源
        JDBCUtils.closeResource(conn,pre);
    }

查查询通用方法

通用的针对于不同表的查询:返回一个对象

public <T> T getInstance(Class<T> clazz,String sql, Object... args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        // 1.获取数据库连接
        conn = JDBCUtils.getConnection();
        
        // 2.预编译sql语句,得到PreparedStatement对象
        ps = conn.prepareStatement(sql);
        
        //3.填充占位符
        for (int i = 0; i < args.length; i++) {
            //注意在数据库中索引是从1开始的
            ps.setObject(i + 1, args[i]);
        }
       // 4.执行executeQuery(),得到结果集:ResultSe 
        rs = ps.executeQuery();
        
        //5.获取结果集的元数据 :ResultSetMetaData
        ResultSetMetaData rsmd = rs.getMetaData();
        
        //6.通过ResultSetMetaData获取结果集中的列数
        int columnCount = rsmd.getColumnCount();
        
        if (rs.next()) {
            //例子:假如你有个Book类 这时你就 Book book = new book(); new 了一个 book 对象
            T t = clazz.newInstance();
            // 处理结果集一行数据中的每一个列
            for (int i = 0; i < columnCount; i++) {
                // 获取列值
                Object columValue = rs.getObject(i + 1);
                
                // 获取每个列的列名 columnName是获取表的列名 所有当我们起给列名取别名时就没用了 这时用ColumnLabel
                // String columnName = rsmd.getColumnName(i + 1); (注意在数据库中索引是从1开始的)
                String columnLabel = rsmd.getColumnLabel(i + 1);
                // 给t对象指定的columnName属性,赋值为columValue:通过反射
                Field field = clazz.getDeclaredField(columnLabel);
                field.setAccessible(true);
                field.set(t, columValue);
            }
            return t;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //7.关闭资源
        JDBCUtils.closeResource(conn, ps, rs);
    }
    return null;
}

通用的针对于不同表的查询:返回多个对象

public <T> List<T> getForList(Class<T> clazz, String sql, Object... args){
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        // 1.获取数据库连接
        conn = JDBCUtils.getConnection();
        
        // 2.预编译sql语句,得到PreparedStatement对象
        ps = conn.prepareStatement(sql);
        
        //3.填充占位符
        for (int i = 0; i < args.length; i++) {
            ps.setObject(i + 1, args[i]);
        }
        
        // 4.执行executeQuery(),得到结果集:ResultSet
        rs = ps.executeQuery();
        
        // 5.得到结果集的元数据:ResultSetMetaData
        ResultSetMetaData rsmd = rs.getMetaData();
        
        // 6. 通过ResultSetMetaData获取结果集中的列数
        int columnCount = rsmd.getColumnCount();
        
        ArrayList<T> list = new ArrayList<T>();
        while (rs.next()) {
            T t = clazz.newInstance();
            // 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
            for (int i = 0; i < columnCount; i++) {
                // 获取列值
                Object columValue = rs.getObject(i + 1);
                // 获取每个列的列名
                String columnLabel = rsmd.getColumnLabel(i + 1);
                // 给t对象指定的columnName属性,赋值为columValue:通过反射
                Field field = clazz.getDeclaredField(columnLabel);
                field.setAccessible(true);
                field.set(t, columValue);
            }
            list.add(t);
        }
        return list;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //7.关闭资源
        JDBCUtils.closeResource(conn, ps, rs);
    }
    return null;
}

三、JDBC API 小结

  • 两种思想

    • 面向接口编程的思想

    • ORM思想(object relational mapping)

      • 一个数据表对应一个java类
      • 表中的一条记录对应java类的一个对象
      • 表中的一个字段对应java类的一个属性

    sql是需要结合列名和表的属性名来写。注意起别名。

  • 两种技术

    • JDBC结果集的元数据:ResultSetMetaData
      • 获取列数:getColumnCount()
      • 获取列的别名:getColumnLabel()
    • 通过反射,创建指定类的对象,获取指定的属性并赋值

推荐视频 B站 尚硅谷宋红康老师JDBC视频 宋红康老师讲的非常好 也非常细 建议有时间可以去看看

你可能感兴趣的:(JDBC操作数据库通用操作(增,删,改,查))