Javaweb核心技术之实战JDBC连接Mysql数据库
Java开发必备技术之JDBC相关概念介绍
什么是JDBC
- JDBC
- 全称Java DataBase Connectivity,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口
- 提供了一种接口基准,可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
- 应用程序代码一般不能直接访问数据库,需要通过相应的数据库驱动程序才行
- 什么是数据库驱动?通俗来说就是数据库厂商JDBC接口实现
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/917d0da454a26c01b53d3721c0731795.png)
JDBC连接MySQL相关概念
- 数据库驱动:不同数据库开发商(比如oracle mysql等)为了某一种开发语言能够实现统一的数据库调用而开发的一个程序,作用相当于一个翻译人员,将某个语言(比如java)中对数据库的调用通过这个翻译成各个种类的数据库自己的数据库语言
- Connection连接:特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果
- Statement 语句:创建执行SQL语句的statement,有好几种实现类,用于执行对应的sql
- ResultSet结果集:SQL查询返回的结果信息
使用Java连接Mysql的步骤
- 加载JDBC驱动程序
- 建立数据库连接Connection
- 创建执行SQL的语句Statement
- 处理执行结果ResultSet
- 释放连接资源
JDBC相关驱动包导入和数据库表准备
准备数据库
基础相关
- 自己搭建好Mysql数据库,推荐是Mysql5.7版本
- 注意如果连接不上数据库
- 检查防火墙-云服务器的网络安全组
- mysql有没开启允许远程连接
- 准备Mysql客户端软件
- Windows:navicat、mysqlworkbench
- amac:sequel pro
- 导入驱动包jar
- 建立数据库
开发第一个JDBC连接Mysql程序
简介:快速使用jdbc连接Mysql
使用Java连接Mysql的步骤
- 加载JDBC驱动程序
- 建立数据库连接Connection
- 创建执行SQL的语句Statement
- 处理执行结果ResultSet
- 释放连接资源
- resultSet.close();
- a statement.close();
- connection.close();
第一个jdbc程序
public static void main(String [] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String username = "root";
String password = "root";
String url = "jdbc:mysql://127.0.0.1:3306/web_test?
useUnicode=true&characterEncoding=utf-8&useSSL=false";
Connection connection =
DriverManager.getConnection(url,username,password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from user");
while (resultSet.next()){
System.out.println("⽤用户名称 name="+
resultSet.getString("username") + " 联系⽅方式 wechat="+
resultSet.getString("wechat"));
}
resultSet.close();
statement.close();
connection.close();
}
SQL注入攻击和Statement预编译语句
讲解SQL注入攻击Statement预编译语句
什么是SQL注入攻击
- 可以执行恶意SQL语句,将任意SQL代码插入数据库查询,使用SQL注入来添加,修改和删除数据库中的记录
PrepareStatement
- 字面可译为预声明,内部包含一个预编译的sql语句,参数采用占位符?进行填充
- 可以防注入的原因
- 第一次操作数据库之前,SQL语句已经被数据库分析和编译,对应的执行计划也会缓存下来,之后数据库就会以参数化的形式进行查询
- 传入的值始终都是会作为一个值,而不是sql指令
- 好处:维护性好、提高sql效率、增加安全性
JDBC新增记录和删除记录功能
新增记录
PreparedStatement preparedStatement =
connection.prepareStatement("insert into user(username,
pwd,sex,role,create_time) values(?,?,?,?,?) ");
preparedStatement.setString(1,"哈哈哈");
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();
删除记录
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();
JDBC控制Mysql事务控制
讲解JDBC控制Mysql事务
事务
- 一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务
- 例如银行账户转账业务,该业务就是一个最小的工作单元
四大特性
- 原子性(A):事务是最小单位,不可再分
- 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
- 隔离性(I):事务A和事务B之间具有隔离性
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
事务的一些术语
- 开启事务:Start Transaction
- 事务结束:End Transaction
- 提交事务:Commit Transaction
- 回滚事务:Rollback Transaction
JDBC实操
private static void testTransaction() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String username = "root";
String password = "xdclass.net";
String url = "jdbc:mysql://127.0.0.1:3306/xd_web?
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(?,?)
")) {
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");
ps1.execute();
int i = 1/0;
ps2.execute();
} catch (Exception e) {
e.printStackTrace();
connection.rollback();
} finally {
connection.commit();
connection.close();
}
}