二、JDBC
1、概念 :
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
JDBC本质 : 其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
2、快速入门
使用步骤:
- 导入驱动 Jar 包.
- 注册驱动
- 获取数据库连接对象 Connection
- 定义Sql 语句
- 获取执行Sql语句的对象
- 执行Sql,接收结果
- 处理结果
- 释放资源
代码实现 :
public class Test01 {
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
//1、导入jar包
//2、注册驱动
try {
//把字节码文件加载进内存
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/springtest",
"root", "1314520");
//4、定义Sql语句
String sql = "select * from user";
//5、获取执行sql的对象
statement = conn.createStatement();
resultSet = statement.executeQuery(sql);
while (resultSet.next()){
Integer uid = resultSet.getInt("uid");
String uname = resultSet.getString("uname");
String usex = resultSet.getString("usex");
Integer pid = resultSet.getInt("pid");
System.out.println(uid+" "+uname+" "+usex+" "+pid);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (resultSet != null)
resultSet.close();
if (statement != null)
statement.close();
if (conn != null)
conn.close();
}
}
}
3、详解各个对象:
1.DriverManager : 驱动管理对象
- 注册驱动,告诉程序该使用哪一个驱动Jar包
static void registerDriver(Driver driver, DriverAction da) -->注册与给定的驱动程序 DriverManager 。
在Class.forName(“com.mysql.jdbc.Driver”); -->把字节码文件加载进内存
查看源码发现 :在com.mysql.jdbc.Driver类中存在静态代码块(类被加载就会执行)
static{
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch (SQLException E) {
throw new RuntimeException("can't register driver! ");
}
}
Mysql5之后的jar包可以省略 Class.forName(“com.mysql.jdbc.Driver”) 语句
原因:
mysql-connector-java-5.1.29-bin\META-INF\services中java.sql.Driver文件里面帮我们写了。
-
获取数据库连接
方法:static Connection getConnection(String url, String user, String password)
参数:- url 指定连接得路径。
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- user 数据库对应的用户名
- password 数据库对应的密码
- url 指定连接得路径。
2.Connection : 数据库连接对象
-
获取执行Sql的对象
Statement createStatement( )
PreparedStatement prepareStatement(String sql)
-
管理事务
事务: 一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
。1、开启事务 --在执行sql之前开启事务
void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
参数为 false 时,即开启事务。
2、提交事务 --当所有sql都执行完提交事务
void commit( )
使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。3、回滚事务 --在catch中回滚事务
void rollback( )
撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
3.statement : 执行sql的对象
-
执行Sql
1、boolean execute(String sql)
执行给定的SQL语句,这可能会返回多个结果
2、int executeUpdate(String sql)
执行给定的SQL语句,这可能是INSERT , UPDATE ,或 DELETE语句
,或者不返回任何内容, 返回值 :数据库表受到影响的行数
3、 ResultSet executeQuery(String sql)
执行给定的SQL语句,这可能是查询语句
。该语句返回单个 ResultSet 对象
。
4.Resultset : 结果集对象
- boolean next( ) 将光标从当前位置向前移动一行。
光标初始指向表头。
- getxxx( 要获取列名/或列的编号 ) xxx代表数据类型 如getString(“uname”),getInt(1)。
- 编号从 1 开始
5.Preparedstatement : 执行sql的对象(可对参数进行预处理)
-
SQL注入问题∶在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
- 输入用户随便,输入密码:a’ or ‘a’ = 'a
- sql : select * from user where username = ‘fhdsjkf’ and password ‘1’ or ‘1’ = ‘1’
-
解决sql注入问题 : 使用 Preparedstatement 对象来解决
-
预编译的sQL:参数使用
?
作为占位符
. -
定义 sql
-
注意 : sql的参数使用 ? 作为占位符。
如 : selectfrom user where username = ? and password = ? ;
-
-
获取执行sqi语句的对象 Preparedstatement
Connection.prepareStatement(String sql) -
给 ? 赋值∶
方法 : setxxx(参数1,参数2)
参教1 : ? 的位置编号 参数2∶?的值
注意 :编号从1开始
-
执行sql,接受返回结果,不需要传递sql语句
4、JDBCUtils
JDBCUtils将常用的数据库连接、释放资源等操作抽取出来,作为一个工具类使用。以此来简化代码,提升速度。同时将数据库相关信息的修改都以配置文件的方式来修改,使用更加灵活,不必频繁改动代码。
1、配置文件
--存放于项目目录下 src中,名称为 jdbc.properties
注意 :每个人的习惯不同,所以目录结构也不同,因此配置文件的命名、存放位置等可能不同。
配置文件目录结构 :
配置文件模板:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
user=用户名
password=密码
关于MySQL8.x 和 5.x 的URL和Driver的写法
1、MySQL 5.x
url = jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8 driver = com.mysql.jdbc.Driver
2、MySQL 8.x
url = jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false drive = com.mysql.cj.jdbc.Driver
Tip:
?useUnicode=true&characterEncoding=utf8
用于处理数据库中文变 ?.
serverTimezone=Asia/Shanghai
时区问题, 将时区设置为你所在的地方,这里以 亚洲上海为例。
2、JDBCUtils类
package com.lly.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* @ClassName:JDBCUtils
* @创建者: LLY
* @创建时间: 2021/5/31 11:42
* @version: 1.0
* @描述: JDBC工具类
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件读取,只会执行一次,使用静态代码块
*/
static {
//读取文件,获取值
try {
//1.创建Properties集合类
Properties pro = new Properties();
//获取src路径下的文件--->ClassLoader类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");;
String path = resource.getPath();
//2.加载文件
pro.load(new FileReader(path));
//3获取数据
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection() throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/**
* 释放资源
* @param rs
* @param st
* @param conn
*/
public static void close(ResultSet rs, Statement st,Connection conn){
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、使用示例
1、配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springtest
user=匿了
password=匿了
2、数据库表
3、查询类
package com.lly.test;
import com.lly.util.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @ClassName:JDBCUtilTest
* @创建者: LLY
* @创建时间: 2021/5/31 11:55
* @version: 1.0
* @描述:
*/
public class JDBCUtilTest {
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
try{
conn = JDBCUtils.getConnection();
String QuerySql = "select * from user";
statement = conn.createStatement();
resultSet = statement.executeQuery(QuerySql);
while (resultSet.next()){
Integer uid = resultSet.getInt("uid");
String uname = resultSet.getString("uname");
String usex = resultSet.getString("usex");
Integer pid = resultSet.getInt("pid");
System.out.println(uid+" "+uname+" "+usex+" "+pid);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtils.close(resultSet, statement, conn);
}
}
}
4、最后结果
E:\Program\JAVA\JDK1.8X64\bin\java.exe ...
1 李斯 男 9
2 武则天 雌 19
3 ggb 雄 3
41 屠呦呦 女 5
42 钟南山 男 4
45 吴天祥 男 1
46 聂海胜 男 1
48 钱学森 男 2
Process finished with exit code 0