龙哥网

龙哥网

java中JDBC增删改查操作详解_java(java jdbc实现增删改查)
2022-03-01

目录
  • 前言
  • 一、增删改操作
    • 1.1 PreparedStatement介绍
    •  1.2 增删改操作
    •   1.3 测试
  • 二、查操作
    • 2.1 通用对不同表进行一条数据查询操作
    • 2.2 通用对不同表进行多条数据查询操作
  • 总结

    前言

            在上一篇博客我们介绍了JDBC的概念以及连接数据库的五种方式JDBC概述及数据库连接方式(数据库连接方式推荐使用第五种),那么我们既然连接上数据库了,那就要对数据进行操作了,那么这一篇我们就来介绍常规的增删改 查操作。

         

    我们先看一遍步骤:    

    这里不推荐使用Statement,两个原因:

                    1.存在拼串操作,繁琐。

                    2.存在sql注入问题。

            那我们使用谁来代替Statement呢?

    一、增删改操作

            操作前,我们先解决上面的问题,我们使用PreparedStatement来代替Statement。

    1.1 PreparedStatement介绍

    可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象

    PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

    PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

     优点:

    解决字符串拼串问题,防止sql注入提高性能       

     1.2 增删改操作

            这里给出一个针对不同表的通用增删改操作,拿着直接用就可以了。

    //通用增删改操作
        public boolean updateInfo(String sql,Object...args){
            Connection conn = null;
            PreparedStatement ps = null;
            boolean b = true;
            try {
                //1.建立连接
                conn = JDBCUtils.getConnection();
                //2.预编译sql语句
                ps = conn.prepareStatement(sql);
                //3.填充占位符
                for (int i = 0; i <args.length ; i++) {
                    ps.setObject(i+1,args[i]);
                }
                //4.执行操作
                b = ps.execute();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //5.关闭资源
                JDBCUtils.close(conn,ps);
            }
            return b;
        }

             是不是复制使用会报错,这是因为博主把数据库连接和关闭资源也封装成了一个类JDBCUtils

            下面给出这个类的具体代码:

            配置文件就自己写吧,毕竟每个人的数据库都不一样。以及该导入的包自己动动手就行了。

    public class JDBCUtils {
        //连接
        public static Connection getConnection(){
            Connection conn = null;
            try {
                //1.加载配置文件
                InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
                Properties prop = new Properties();
                prop.load(is);
     
                //2.读取配置文件
                String user = prop.getProperty("user");
                String password = prop.getProperty("password");
                String url = prop.getProperty("url");
                String driverClass = prop.getProperty("driverClass");
     
                //3.加载驱动
                Class.forName(driverClass);
     
                //4.建立连接
                conn = DriverManager.getConnection(url, user, password);
            } catch (Exception e) {
                e.printStackTrace();
            }
     
     
            return conn;
        }
     
        //关闭
        public static void close(Connection conn, PreparedStatement ps){
            try {
                if (conn != null){
                    conn.close();
                }
                if (ps != null){
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭带resultset
        public static void close(Connection conn, PreparedStatement ps , ResultSet rs){
            try {
                if (conn != null){
                    conn.close();
                }
                if (ps != null){
                    ps.close();
                }
                if (rs != null){
                    rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

      1.3 测试

            我们来测试一下上面的代码

            这里有一张order表,里面有初始数据:

            ​​​​​​​        

             然后我们通过上面提供的方法给他增加一条数据:

    public class Test {
        public static void main(String[] args) {
            Operation operation = new Operation();
            String insertSql = "INSERT INTO `order`(order_id,order_name,order_date) VALUES (?,?,?)";
            boolean b = operation.updateInfo(insertSql, 3, "CC", new Date(12312132));
            if (!b){
                System.out.println("操作成功!");
            }else {
                System.out.println("操作失败!");
            }
        }
    }

            控制台打印输出:

            

             那么是不是已经插入成功了呢,我们去数据库中看一下:

              我们 SELECT * FROM `order`;

            

            看来我们确实成功了!所以我们给出的方法还是没有问题。

    二、查操作

            接下来我们就是查操作了。

    2.1 通用对不同表进行一条数据查询操作

    public  <T> T doQuery(Class<T> clazz,String sql,Object...args) {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                //1.建立连接
                conn = JDBCUtils.getConnection();
                //2.预编译sql语句
                ps = conn.prepareStatement(sql);
                //3.填充占位符
                for (int i = 0; i <args.length ; i++) {
                    ps.setObject(i+1,args[i]);
                }
                //4.得到结果集ResultSet
                rs = ps.executeQuery();
                //5.得到结果集元数据
                ResultSetMetaData rsdm = rs.getMetaData();
     
                //6.通过rs得到列值,rsdm得到列名和列数
                //得到列数
                int columnCount = rsdm.getColumnCount();
                if (rs.next()){
                    T t = clazz.getDeclaredConstructor().newInstance();
                    for (int i = 0; i <columnCount ; i++) {
                        //得到列值
                        Object columnvalue = rs.getObject(i + 1);
                        //得到列的别名
                        String columnLabel = rsdm.getColumnLabel(i + 1);
     
                        //通过反射给对象赋值
                        Field field = clazz.getDeclaredField(columnLabel);
                        //暴力反射
                        field.setAccessible(true);
                        field.set(t,columnvalue);
                    }
                    return t;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭资源
                JDBCUtils.close(conn,ps,rs);
            }
            return null;
        }

            老样子,测试!

    public class Test {
        public static void main(String[] args) {
            Operation operation = new Operation();
            String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;";
            Order order = operation.doQuery(Order.class, sql, 2);
            System.out.println(order);
        }
    }

     控制台输出:

            

    2.2 通用对不同表进行多条数据查询操作

    public <T> List doQueryMore(Class<T> clazz,String sql,Object...args){
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                //1.建立连接
                conn = JDBCUtils.getConnection();
                //2.预编译sql语句
                ps = conn.prepareStatement(sql);
                //3.填充占位符
                for (int i = 0; i <args.length ; i++) {
                    ps.setObject(i+1,args[i]);
                }
                //4.得到结果集ResultSet
                rs = ps.executeQuery();
                //5.得到结果集元数据
                ResultSetMetaData rsdm = rs.getMetaData();
     
                //6.通过rs得到列值,rsdm得到列名和列数
                //得到列数
                int columnCount = rsdm.getColumnCount();
                //创建集合
                ArrayList<T> list = new ArrayList<>();
                while (rs.next()){
                    T t = clazz.getDeclaredConstructor().newInstance();
                    for (int i = 0; i <columnCount ; i++) {
                        //得到列值
                        Object columnvalue = rs.getObject(i + 1);
                        //得到列的别名
                        String columnLabel = rsdm.getColumnLabel(i + 1);
     
                        //通过反射给对象赋值
                        Field field = clazz.getDeclaredField(columnLabel);
                        //暴力反射
                        field.setAccessible(true);
                        field.set(t,columnvalue);
                    }
                    list.add(t);
                }
                return list;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭资源
                JDBCUtils.close(conn,ps,rs);
            }
            return null;
        }

             这一个测试就交给各位吧!

    总结

    免责声明
    本站部分资源来源于互联网 如有侵权 请联系站长删除
    龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。