JDBC预处理执行
预处理执行就是我先不执行它,在我需要的时候再执行它
我们先准备一个数据库
这个数据库是下面JDBC代码运行基础
只需要复制到你的mysql上执行下,刷新下就好
/*
SQLyog Ultimate v11.24 (32 bit)
MySQL - 5.6.39 : Database - af_school
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE IF NOT EXISTS `af_school` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `af_school`;
/*Table structure for table `exam` */
DROP TABLE IF EXISTS `exam`;
CREATE TABLE `exam` (
`id` int(11) NOT NULL COMMENT '学号',
`chinese` int(11) DEFAULT NULL COMMENT '语文成绩',
`english` int(11) DEFAULT NULL COMMENT '英语成绩',
`math` int(11) DEFAULT NULL COMMENT '数学成线',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `exam` */
insert into `exam`(`id`,`chinese`,`english`,`math`) values (20180001,89,90,98),(20180002,78,82,93),(20180003,90,73,95),(20180004,88,98,83),(20180005,96,79,75),(20180006,77,98,82);
/*Table structure for table `leave_event` */
DROP TABLE IF EXISTS `leave_event`;
CREATE TABLE `leave_event` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '请假记录ID',
`stuId` int(11) NOT NULL COMMENT '学生ID',
`daysFrom` date DEFAULT NULL COMMENT '哪天开始',
`daysTo` date DEFAULT NULL COMMENT '哪天结束',
`type` tinyint(4) DEFAULT NULL COMMENT '类型,0病假,1事假',
`reason` varchar(256) DEFAULT NULL COMMENT '事由',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
/*Data for the table `leave_event` */
insert into `leave_event`(`id`,`stuId`,`daysFrom`,`daysTo`,`type`,`reason`) values (1,20180001,'2018-01-02','2018-01-03',0,'感冒'),(2,20180001,'2018-03-06','2018-03-08',0,'发烧'),(3,20180003,'2018-03-01','2018-03-07',1,'出国旅游'),(4,20180005,'2018-03-07','2018-03-07',1,'家里有事'),(5,20180003,'2018-03-17','2018-03-18',0,'不舒服');
/*Table structure for table `student` */
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL COMMENT '学号',
`name` varchar(32) NOT NULL COMMENT '姓名',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别',
`phone` varchar(16) DEFAULT '13800000000' COMMENT '手机号',
`birthday` date DEFAULT NULL COMMENT '生日',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `student` */
insert into `student`(`id`,`name`,`sex`,`phone`,`birthday`) values (20180001,'盖聂',1,'1409900089','1982-03-09'),(20180002,'卫庄',1,'1282399999','1993-10-01'),(20180003,'张良',1,NULL,'1996-03-11'),(20180004,'伏念',1,NULL,'1982-09-24'),(20180005,'颜路',1,'13699292899','1983-11-21'),(20180006,'赤练',0,'13819289890','1998-03-12'),(20180007,'端木蓉',0,'13800000000','1978-05-12'),(20180008,'盗跖',1,'13410012908','1993-09-10'),(20180009,'白凤',1,'13509890090','1994-04-20'),(20180010,'天明',1,'18799891829','2002-04-19'),(20180011,'月儿',0,'13882938990','2003-06-10');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
代码实现预处理
我现在想插入一个学生到学生表里面,但是我还没有想好插入哪个学生
怎么办呢?我们用预处理技术
package com.company;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Main4 {
public static void linktest() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String username="root";
String password="";
String linkURL="jdbc:mysql://127.0.0.1:3306/af_school?useUnicode=true&characterEncodeing=UTF-8";
Connection conn= DriverManager.getConnection(linkURL,username,password);
//先写一个模板,里面有没有确定的未知参数
String sql="INSERT INTO student (id,name,birthday) VALUES (?, ?, ?)";
//创建预处理对象
PreparedStatement prestate=conn.prepareStatement(sql);
//填入参数
prestate.setInt(1,20180013);
prestate.setString(2,"李强");
prestate.setString(3,"2000-9-13");
prestate.execute();
}
public static void main(String[] args) {
try {
linktest();
} catch (Exception e) {
e.printStackTrace();
}
}
}
预处理的优点
如果sql语句相似,我们可以利用预处理技术进行批量插入
比如我现在要插入多个学生到数据库,那这个插入的sql语句相似度就很高,我们先写一个带?号(未知参数)的sql语句,然后我们把它作为模板进行操作,这样一来我们就事半功倍了
批量插入体现预处理模板优势
package com.company;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Main5 {
public static void testlink() throws Exception{
String username="root";
String password="";
String linkURL="jdbc:mysql://127.0.0.1:3306/af_school?useUnicode=true&characterEncodeing=UTF-8";
Connection conn= DriverManager.getConnection(linkURL,username,password);
System.out.println("连接成功");
//带有参数的sql语句
String sql="INSERT INTO student (id,name,birthday) VALUES (?, ?, ?)";
//数组对象
int[] id={20190001,20190002,20190003};
String[] name={"韩梅梅","李王","小孩"};
String[] birthday={"2001-9-10","2001-9-18","2001-8-15"};
//使用预处理技术进行批量插入操作
for(int i=0;i<3;i++){
PreparedStatement prestate=conn.prepareStatement(sql);
prestate.setInt(1,id[i]);
prestate.setString(2,name[i]);
prestate.setString(3,birthday[i]);
prestate.execute();
}
System.out.println("全部执行完毕");
}
public static void main(String[] args) {
try {
testlink();
} catch (Exception e) {
e.printStackTrace();
}
}
}