上一篇我们介绍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/ 欢迎转载,一起技术交流吧!