javaweb开发(十一):JDBC连接MySQL
- jdbc简介
全称 Java DataBase Connectivity, 是Java语⾔中⽤来规范客户端程序如何来访问数据库的应
⽤程序接⼝
提供了⼀种接⼝基准,可以构建更⾼级的⼯具和接⼝,使数据库开发⼈员能够编写数据库应
⽤程序
应⽤程序代码⼀般不能直接访问数据库,需要通过相应的数据库驱动程序才⾏,通俗来说就是数据库⼚商的JDBC接⼝实现
- 相关概念
数据库驱动:不同数据库开发商(⽐如oracle mysql等)为了某⼀种开发语⾔能够实现统⼀的数
据库调⽤⽽开发的⼀个程序, 作⽤相当于⼀个翻译⼈员, 将某个语⾔(⽐如java)中对数据库
的调⽤通过这个翻译成各个种类的数据库 ⾃⼰的数据库语⾔
Connection连接:特定数据库的连接(会话),在连接上下⽂中执⾏sql语句并返回结果
Statement 语句: 创建执⾏SQL语句的statement, 有好⼏种实现类,⽤于执⾏对应的sql
ResultSet结果集:SQL查询返回的结果信息
- 连接步骤
加载JDBC驱动程序
建⽴数据库连接Connection
创建执⾏SQL的语句Statement
处理执⾏结果ResultSet
释放连接资源
-
构建web项目,配置tomcat,导入依赖
-
创建数据库表
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`phone` varchar(32) DEFAULT NULL,
`pwd` varchar(128) DEFAULT NULL,
`sex` int(2) DEFAULT NULL,
`img` varchar(128) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`role` int(11) DEFAULT NULL COMMENT '1是普通⽤户,2是管理员',
`username` varchar(128) DEFAULT NULL,
`wechat` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 添加数据
INSERT INTO `user` (`id`, `phone`, `pwd`, `sex`, `img`, `create_time`, `role`,
`username`,`wechat`)
VALUES
(1,'123','666',1,'xdclass.net','2021-09-09
00:00:00',1,'jack','xdclass6'),
(2,'2323432','794666918',1,'wwwww','2020-05-20 04:54:01',1,'⼩滴Anna姐
姐','xdclass-anna'),
(3,'2323432','xdclass-lw',1,'wwwww','2020-05-20 04:54:42',1,'⼆当家⼩
D','xdclass1'),
(4,'2323432','3232323',1,'wwwww','2020-05-20 04:55:07',1,'⽼
王','xdclass-lw');
- 编写测试类
public class JdbcTest {
public static void main(String [] args) throws Exception{
//加载JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接Connection
String username = "root";
String password = "123456";
//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2
String url = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection = DriverManager.getConnection(url,username,password);
//创建执行SQL的语句Statement
Statement statement = connection.createStatement();
//处理执行结果ResultSet
ResultSet resultSet = statement.executeQuery("select * from user");
while (resultSet.next()){
System.out.println("用户名称 name="+ resultSet.getString("username") + " 联系方式 wechat="+ resultSet.getString("wechat"));
}
//释放连接资源
statement.close();
connection.close();
}
}
- 控制台打印
用户名称 name=jack 联系方式 wechat=xdclass6
用户名称 name=⼩滴Anna姐
姐 联系方式 wechat=xdclass-anna
用户名称 name=⼆当家⼩
D 联系方式 wechat=xdclass1
用户名称 name=⽼
王 联系方式 wechat=xdclass-lw
Process finished with exit code 0
- 防止sql注入攻击
private static void testInjectSQL()throws Exception{
//加载JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接Connection
String username = "root";
String password = "123456";
//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2
String url = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection = DriverManager.getConnection(url,username,password);
// 查询条件
String name = "jack";
String pwd = "666";
//创建执行SQL的语句Statement
PreparedStatement preparedStatement = connection.prepareStatement("select * from user where username=? and pwd=?");
preparedStatement.setString(1,name);
preparedStatement.setString(2,pwd);
//处理执行结果ResultSet
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println("用户名称 name="+ resultSet.getString("username") + " 联系方式 wechat="+ resultSet.getString("wechat"));
}
//释放连接资源
preparedStatement.close();
connection.close();
}
- 测试结果
用户名称 name=jack 联系方式 wechat=xdclass6
Process finished with exit code 0
- 添加数据
private static void testAdd() throws Exception {
//加载JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接Connection
String username = "root";
String password = "123456";
//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2
String url = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement("insert into user(username, pwd,sex,role,create_time) values(?,?,?,?,?) ");
preparedStatement.setString(1,"二当家小D");
preparedStatement.setString(2,"123456");
preparedStatement.setInt(3,1);
preparedStatement.setInt(4,2);
preparedStatement.setTimestamp(5,new Timestamp(System.currentTimeMillis()));
//执行
preparedStatement.execute();
preparedStatement.close();
connection.close();
}
-
测试结果:添加成功
-
删除
private static void testDelete() throws Exception {
//加载JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接Connection
String username = "root";
String password = "123456";
//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2
String url = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement("delete from user where id=?");
preparedStatement.setInt(1,2);
//执行
preparedStatement.execute();
preparedStatement.close();
connection.close();
}
-
测试结果,删除id为2的数据
-
事务简介
⼀个最⼩的不可再分的⼯作单元,通常⼀个事务对应⼀个完整的业务
例如银⾏账户转账业务,该业务就是⼀个最⼩的⼯作单元
- 事务特性
原⼦性(A):事务是最⼩单位,不可再分
⼀致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
隔离性(I):事务A和事务B之间具有隔离性
持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘⽂件中
- 事务术语
开启事务:Start Transaction
事务结束:End Transaction
提交事务:Commit Transaction
回滚事务:Rollback Transaction
- 实践代码
private static void testTransaction() throws Exception {
//加载JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接Connection
String username = "root";
String password = "123456";
//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2
String url = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection = DriverManager.getConnection(url, username, password);
try (
PreparedStatement ps1 = connection.prepareStatement("insert into user(username, pwd) values(?,?) ");
PreparedStatement ps2 = connection.prepareStatement("insert into user(username, pwd) values(?,?) ")) {
//JDBC中默认事务是自动提交的,false就不会自动提交
connection.setAutoCommit(false);
// 要插入的数据
ps1.setString(1, "1111tranc ps 1二当家小D");
ps1.setString(2, "123456");
// 要插入的数据
ps2.setString(1, "2222tranc ps 2二当家小D");
ps2.setString(2, "123456");
// 插入第1条数据
ps1.execute();
//模拟异常
int i = 1/0;
// 插入第2条数据
ps2.execute();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
connection.rollback();
} finally {
//事务提交
connection.commit();
connection.close();
}
}
- 测试成功,数据库无变化,控制台打印如下
java.lang.ArithmeticException: / by zero
at com.ychen.web.dao.JdbcTest.testTransaction(JdbcTest.java:151)
at com.ychen.web.dao.JdbcTest.main(JdbcTest.java:45)
Process finished with exit code 0