【JDBC】-- PreparedStatement实现数据库增删改操作

连接数据库后,可对数据库操作,java.sql包中有3个接口分别定义了对数据库的调用的不同方式:

Statement:用于执行静态SQL语句并返回它所生成结果的对象。

PreparedStatement:SQL语句被预编译并存储在此对象中,可使用此对象多次高效执行该语句。

CallableStatement:用于执行SQL存储过程。

下面使用PreparedStatement完成数据库增删改操作。

不使用Statement的原因:1、存在拼串操作,繁琐

                                          2、存在SQL注入问题


前提

准备配置文件jdbc.properties

此文件作用是保存连接数据库的基本信息如用户名、密码。

user=root
password=ad
url=jdbc:mysql://localhost:3306/jdbc
driverClass=com.mysql.cj.jdbc.Driver

 

一、“增”操作

1、实例化

后面需要将使用的资源关闭,先实例化并赋null,后面通过判断是否使用资源,再进行关闭。

    public static void testInsert(){
            Connection conn = null;//获取连接
            PreparedStatement ps = null;//预编译SQL实例
           

2、连接数据库

先读取配置文件连接数据库的基本信息;

然后创建一个Properties集合(保存配置文件内容),并加载配置文件;

用字符串将集合中相应的内容读取;

最后加载驱动,并使用前面实例化的对象conn获取连接。

 try {
                //读取配置文件基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");

                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");
                //加载驱动
                Class.forName(driverClass);
                //获取连接
                conn = DriverManager.getConnection(url,user,password);
               

3、预编译sql语句、填充占位符、执行

成功连接数据库后,用字符串保存sql语句(其中的?是占位符);

用前面实例化的对象ps保存预编译sql语句;

然后通过调用ps相关方法填充占位符,第一个参数表示第几个"?",第二个参数表示值;

最后执行execute。

 //预编译sql语句,返回实例
                String sql = "insert into customers(name,email,birth)values(?,?,?)";
                ps = conn.prepareStatement(sql);
                //填充占位符
                ps.setString(1,"张修宇");
                ps.setString(2,"940107148@qq.com");

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//日期格式
                Date date = sdf.parse("2002-4-30");
                ps.setDate(3, new java.sql.Date(date.getTime()));

                //执行操作
                ps.execute();
            }
catch (Exception e){
                e.printStackTrace();
            }

4、关闭资源

最后需要将所使用的资源关闭。

finally {
                //资源关闭
                try {
                    if(ps != null)
                        ps.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
                try {
                    if(conn != null)
                        conn.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
        }
    }

二、优化“增”操作

由于前面的连接数据库操作在“删改”操作也使用,频繁使用,所以将连接数据库操作封装,如需使用直接调用。

创建一个软件包util,软件包下创建类JDBCUtils

类下封装连接数据库方法和关闭资源方法。

package util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**封装数据库连接和关闭*/
public class JDBCUtils {
    public static Connection getConnection() throws Exception{
        //读取配置文件基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        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");
        //加载驱动
        Class.forName(driverClass);
        //获取连接
        Connection conn = DriverManager.getConnection(url,user,password);
        return conn;
    }
    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();
        }
    }
}

三、“删”操作

实现原理如上,修改操作也类似。

1、实例化

    /**修改一条记录*/
    public static void testUpdate(){
        Connection conn = null;
        PreparedStatement ps = null;
      

2、连接数据库

  try {
            //获取数据库连接
            conn = JDBCUtils.getConnection();
          

3、预编译、填充占位符、执行

            //预编译
            String sql = "update customers set name = ? where id = ?";
            ps = conn.prepareStatement(sql);
            //填充占位符
            ps.setObject(1,"莫扎特");
            ps.setObject(2,18);
            //执行
            ps.execute();
        }

4、关闭资源。

catch (Exception e){
            e.printStackTrace();
        }finally {
            //资源关闭
            JDBCUtils.closeResource(conn,ps);
        }
    }

四、“增删改”通用方法

可以通过一个方法实现“增删改”操作,在不同情况传入不同参数;

与前面不同的是,需要传入sql语句、值参数。

1、定义方法、设置参数

将所用sql语句、值传入,args为可变形参,传入值对应sql语句中的"?"占位符;

 /**通用增删改操作*/
    public static void update(String sql,Object ...args){//args可变形参,占位符长度
       

2、实例化

 Connection conn = null;
 PreparedStatement ps = null;
       

 3、连接数据库

 try {
            //获取连接
            conn = JDBCUtils.getConnection();
           

4、预编译、填充占位符、执行

 //预编译
            ps = conn.prepareStatement(sql);
            //填充占位符
            for(int i = 0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }
            //执行
            ps.execute();
        }

5、关闭资源

catch (Exception e){
            e.printStackTrace();
        }finally {
            //资源关闭
            JDBCUtils.closeResource(conn,ps);
        }
    }

 

使用示例

    public static void testCommonUpdate(){
        //删除
        String sql = "delete from customers where id = ?";
        update(sql,3);

        //修改
        String sql1 = "update `order` set order_name = ? where order_id = ?";
        update(sql1,"DD","2");
    }

“查询”操作比前面的操作稍复杂,将在下篇文章讲解。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天行健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值