JDBC增删改 查操作

Posted Michelhjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC增删改 查操作相关的知识,希望对你有一定的参考价值。

目录

前言

一、增删改操作

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;
    

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

总结

        emmm...拜拜!

以上是关于JDBC增删改 查操作的主要内容,如果未能解决你的问题,请参考以下文章

JDBC增删改 查操作

MYBATIS01_概述及优缺点快速搭建工程Mybatis的增删改查操作总结

Java用jdbc连接实现对MySQL增删改查操作

JDBC实现Mysqual的增删改查

java连接mysql以及增删改查操作

DBUtils (增删改查)