三、基于JDBC规范进行开发
1、插入
package hom.wang.test;
import java.sql.*;
public class stu_01_推送插入命令 {
public static void main(String[] args) throws SQLException {
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法1)
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
// 2、通过JDBC规范中DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、在通道上建立一个空的交通工具
PreparedStatement preparedStatement = connection.prepareStatement("");
// 4、通过交通工具【PreparedStatement】将SQL命令从Java工程推送到MySql服务器上执行并带回执行结果
String innerSql = "insert into user(user_name, password) " +
"values('qianqian', 'qianqian123'),('meimei', 'meimei123')";
int i = preparedStatement.executeUpdate(innerSql);// 增删改都用executeUpdate
// 5、销毁相关资源
if(null != preparedStatement){
preparedStatement.close();
}
if(null != connection){
connection.close();
}
System.out.println("===插入结果:" + i);
}
}
2、更新
package hom.wang.test;
import java.sql.*;
public class stu_02_推送更新命令 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法2,常用)
Class.forName("com.mysql.jdbc.Driver");
// 2、通过JDBC规范中DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、在通道上建立一个空的交通工具
PreparedStatement preparedStatement = connection.prepareStatement("");
// 4、通过交通工具【PreparedStatement】将SQL命令从Java工程推送到MySql服务器上执行并带回执行结果
String innerSql = "update user set password='lili123' where user_name='lili'";
int i = preparedStatement.executeUpdate(innerSql);// 增删改都用executeUpdate
// 5、销毁相关资源
if(null != preparedStatement){
preparedStatement.close();
}
if(null != connection){
connection.close();
}
System.out.println("===更新结果:" + i);
}
}
3、删除
写法与上面的插入、更新别无二致,故省略
4、查询
package hom.wang.test;
import java.sql.*;
public class stu_03_推送查询命令 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法2,常用)
Class.forName("com.mysql.jdbc.Driver");
// 2、通过JDBC规范中 DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、在通道上建立一个空的交通工具
PreparedStatement preparedStatement = connection.prepareStatement("");
// 4、通过交通工具【PreparedStatement】将SQL命令从Java工程推送到MySql服务器上执行并带回执行结果
String selectSql = "select * from user";
ResultSet resultSet = preparedStatement.executeQuery(selectSql);// 查询用executeQuery
// 5、通过ResultSet对象将临时表里所有的数据行信息读取出来
while (resultSet.next()){
int userId = resultSet.getInt("user_id");
String userName = resultSet.getString("user_name");
String upassword = resultSet.getString("password");
System.out.println("编号:"+userId+"\t姓名:"+userName+"\t密码:"+upassword);
}
// 6、销毁相关资源(创建的时候从外向内,销毁的时候从内向外)
if (null != resultSet) {
resultSet.close();
}
if (null != preparedStatement) {
preparedStatement.close();
}
if (null != connection) {
connection.close();
}
}
}
5、预编译
1、原始批处理添加
package hom.wang.test;
import java.sql.*;
/**
* 问题:
* 1、SQL命令书写麻烦
* 为了确保每条SQL语句携带不同参数,采用字符串拼接方式
* 2、浪费时间
* preparedStatement对象每次只能推送一条SQL命令
* 为了推送100条SQL命令,它往返了100次,浪费大量时间
* 【超级烂的一段代码】
*/
public class 原始批处理添加 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法1)
Class.forName("com.mysql.jdbc.Driver");
// 2、通过JDBC规范中DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、在通道上建立一个空的交通工具
PreparedStatement preparedStatement = connection.prepareStatement("");
// 4、向MySql服务器推送100条数据进行插入
for(int i = 0; i < 100; i++){
String sql = "insert into user(user_name, password) " +
"values('user_" + i + "', 'pasword_" + i +"')";
preparedStatement.executeUpdate(sql);
}
// 5、销毁相关资源
if(null != preparedStatement){
preparedStatement.close();
}
if(null != connection){
connection.close();
}
}
}
2、预编译实现批处理
package hom.wang.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class 预编译实现批处理 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/**
* 预编译Sql命令
* "?"是占位符,一个“?”代替一个值
* 预编译相当于一个磨具,在后续开发时,只需要将数据填充到占位符,就可以得到一个全新SQL
*/
String sql = "insert into user(user_name, password) values(?,?)";
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法1)
Class.forName("com.mysql.jdbc.Driver");
// 2、通过JDBC规范中DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、【建立交通工具时,需要将预编译SQL命令注册到 PreparedStatement(可以进行预编译,效率高,防止sql注入)】
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 4、向MySql服务器推送100条数据进行插入
for(int i = 0; i < 100; i++){
// 通过向预编译SQL命令填充数据生成全新的SQL命令(序号从1开始)
preparedStatement.setString(1, "user_" + i);
preparedStatement.setString(2, "password_" + i);
// 在新的SQL语句生成之后,将SQL语句作为子弹添加到preparedStatement的弹夹中
preparedStatement.addBatch(); // [sql1, sql2...sql100] 把子弹一发一发压弹夹
}
// 5、【一次性】通过preparedStatement将100条SQL语句推送到MySql服务器执行
preparedStatement.executeBatch(); // 扣动扳机(推送100条SQL命令只需要往返一次),把弹夹里的子弹一下给老子全打过去
// 6、销毁相关资源
if(null != preparedStatement){
preparedStatement.close();
}
if(null != connection){
connection.close();
}
}
}
6、事务控制
- connection.setAutoCommit(false); 开启事务
- connection.commit(); 提交
- connection.rollback(); 回滚
package hom.wang.test;
import java.sql.*;
/**
* 需求:
* 删除user_id<200的用户
* Sql:
* delete from `user` where user_id<200;
* 规则:
* 在一个需求中,只要有任意一个50L命令无法执行的
* 此时应该将需求中所有SQL命令都判定为执行失效
*/
public class 事务管理 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1、将MySql服务器厂商提供的jar包中的Driver接口实现类注册到JVM(法1)
Class.forName("com.mysql.jdbc.Driver");
// 2、通过JDBC规范中DriverManager在Java工程与MySql服务器之间建立一个【连接通道(就是I/O流)】
String url = "jdbc:mysql://localhost:3306/my_jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
// 3、通过【连接通道】向 Mysql服务器发送命令:“start transaction”
connection.setAutoCommit(false); // 不自动提交事务,人工开启事务
// 4、建立交通工具
PreparedStatement preparedStatement = connection.prepareStatement("");
// 5、通过交通工具【PreparedStatement】将SQL命令从Java工程推送到MySql服务器上执行并带回执行结果
String deleteSql = "delete from `user` where user_id<200";
try {
preparedStatement.executeUpdate(deleteSql);
// 如果能走到这里说明推送的SqL命令都能正常执行,则通知MySql服务器将本次操作中表文件备份进行删除
connection.commit(); // 向MySql服务器推送 commit
}catch (SQLException e){
// 由connection通知MySql服务器将本次操作中所有表文件备份覆盖表文件,取消本次操作
connection.rollback(); // 向MySql服务器推送 rollback
}finally {
// 6、销毁相关资源
if(null != preparedStatement){
preparedStatement.close();
}
if(null != connection){
connection.close();
}
}
}
}