MySQL之入门JDBC(版本2.0)#使用PerparedStatement利用占位符?处理sql拼接

上一篇我们介绍MySQL之入门JDBC(版本1.0)包括其概念总结、使用步骤、CURD代码实现,之前我们在使用步骤中使用的是Satement对象,再用Satement对象调用executeUdate(sql),为了优化sql拼接问题,我们使用Satement的一个子接口PerparedStatment进行操作。

使用Satement处理sql的拼接操作(添加)
package com.daxia.test02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Scanner;

public class InsertTest {
	public static void main(String[] args) throws Exception {
		//1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2.连接服务器
		Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/coding0110lindb", "root", "root");
		//3.从键盘输入
		Scanner input =new Scanner(System.in);
		System.out.print("请输入姓名:");
		String name = input.next();
		System.out.print("请输入性别:");
		String sex = input.next();
		System.out.print("请输入电话:");
		String tel = input.next();
		System.out.print("请输入薪水:");
		Double salary = input.nextDouble();
		//4.编写sql
		String sql = "INSERT INTO employee(ename,esex,etel,esalary) VALUES('"+name+"','"+sex+"','"+tel+"','"+salary+"')";
		//5.创建Statement
		Statement st = con.createStatement();
		int len = st.executeUpdate(sql);
		System.out.println(len);
		System.out.println(len > 0 ? "添加成功" : "添加失败");
		st.close();
		con.close();
		/**
		 *  请输入姓名:Satement测试
		 * 	请输入性别:男
		 *  请输入电话:1234566
		 * 	请输入薪水:20000
		 * 	1
			添加成功
		 */	
	}
}

测试表数据
mysql> use coding0110lindb;
Database changed
mysql> select * from employee;
Empty set (0.00 sec)
    
mysql> select * from employee;
+-----+-------+------+---------+---------+
| eid | ename | esex | etel    | esalary |
+-----+-------+------+---------+---------+
|   1 | Satement测试|| 1234566| 20000 |
+-----+-------+------+---------+---------+
1 row in set (0.00 sec)

mysql>

小结:

   在进行添加操作进行赋值VALUES(’"+name+"’,’"+sex+"’,’"+tel+"’,’"+salary+"’)",字符串的拼接受sql语法的限制,拼接显得很复杂,用PerparedStatment的占位符我们来比对下!

使用PerparedStatment处理sql的拼接操作,利用占位符?(添加)
package com.daxia.test02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Scanner;

public class InsertTest {
	public static void main(String[] args) throws Exception {
		//1.注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2.连接服务器
		Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/coding0110lindb", "root", "root");
		//3.从键盘输入
		Scanner input =new Scanner(System.in);
		System.out.print("请输入姓名:");
		String name = input.next();
		System.out.print("请输入性别:");
		String sex = input.next();
		System.out.print("请输入电话:");
		String tel = input.next();
		System.out.print("请输入薪水:");
		Double salary = input.nextDouble();
		//4.编写sql
		//String sql = "INSERT INTO employee(ename,esex,etel,esalary) VALUES('"+name+"','"+sex+"','"+tel+"','"+salary+"')";
		String sql = "INSERT INTO employee(ename,esex,etel,esalary) VALUES(?,?,?,?)";
		
		//5.创建PreparedStatement
		//Statement st = con.createStatement();
		 PreparedStatement ps = con.prepareStatement(sql);
		 //设置?的值
		 
		 /*=====优化======
		 ps.setString(1,name);//1代表第一个占位符?
		 ps.setString(2,sex);//2代表第二个占位符?
		 ps.setString(3,tel);//3代表第三个占位符?
		 ps.setDouble(4,salary);*///4代表第四个占位符?
        
         ps.setObject(1,name);
		 ps.setObject(2,sex);
		 ps.setObject(3,tel);
		 ps.setObject(4,salary);
		 
		 // int len = st.executeUpdate(sql);
		int len =ps.executeUpdate(); //()中不需要加入sql的对象参数
		System.out.println(len);
		System.out.println(len > 0 ? "添加成功" : "添加失败");
		ps.close();
		con.close();
		
	/*	请输入姓名:PreSatement测试  
		请输入性别:男
		请输入电话:15525854
		请输入薪水:25852
		1
		添加成功*/
	}
}

mysql> select * from employee;
+-----+-----------------+------+------------+---------+
| eid | ename           | esex | etel       | esalary |
+-----+-----------------+------+------------+---------+
|   1 | Satement测试        || 1234566    |   20000 |
|   2 | PreSatement测试     || 15525854 |   25852 |
|   3 | setObject测试       || 55522      |      12 |
+-----+-----------------+------+------------+---------+
3 rows in set (0.00 sec)

总结

   相比Statment,PerparedStatment的效率要高,支持批处理!PreparedStatement对象执行SQL命令时,命令被数据库进行编译和解析(即预编译的状态),被放到命令缓冲区。每当执行同一个PreparedStatement对象时,它会被再解析一次,但是不会被再次编译,在缓冲区中可以发现预编译的命令,并且可以重新使用。

   所以,我们一般使用PerparedStatment对象去对sql语句进行处理,用占位符取代传统的拼串操作。

#轻松一刻:

在这里插入图片描述


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值