概念
JDBC就是使用Java语言操作关系型数据库的一套API。其全称为Java DataBase Connectivity
。
本质
Java官方Sun公司开发了JDBC这样一套操作所有关系型数据库的规则,即标准接口。
各个数据库厂商去实现这套接口,即提供数据库驱动jar包。
我们可以使用这套接口JDBC来编程,真正执行的代码是驱动jar包中的实现类。
好处
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
按以下几个步骤即可完成安装。
(一)点击链接MySQL :: Download Connector/J
(二)查看版本
输入:select version();
我的版本太新了貌似。
下载后解压即可。
JDBC大体可以分为以下几个步骤:
1 创建工程,导入jar包
在工程中创建一个lib文件夹,将下图指的jar包拖入lib文件夹。
然后按下图步骤点击add as library,然后选定jar包作用的范围。
其余步骤体现在代码中:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws Exception{
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获取链接
String url = "jdbc:mysql://127.0.0.1:3306/cov22";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
//3 定义sql
String sql = "update acccount set money = 2000 where id = 1";
//4 获取执行对象
Statement stmt = conn.createStatement();
//5 执行sql
int count = stmt.executeUpdate(sql);
//6 处理结果
System.out.println(count);
//7 释放资源
stmt.close();
conn.close();
}
}
驱动管理类
用于注册驱动
在MySQL 5版本之后的驱动包中,JDBC注册驱动可以不写,系统会自动加载
调用getConnection获取链接
getConnection详解
url:
jdbc:mysql://127.0.0.1(本机):端口号/数据库
;如果连接的是本机mysql服务器,并且默认端口号是3306,则url可以简写为jdbc:mysql:数据库
,如果想禁用安全连接还可以写成jdbc:mysql:数据库?useSSL = false
user:用户名
password:密码名
连接对象
普通执行SQL对象
Statement createStatement()
预编译SQL的执行SQL对象,防止SQL注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
事务管理
JDBC对于事务管理在Connection接口中定义了3个对应的方法。
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
使用案例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Test { public static void main(String[] args) throws Exception{ //2 获取链接 String url = "jdbc:mysql://127.0.0.1:3306/cov22"; String username = "root"; String password = "943073123"; Connection conn = DriverManager.getConnection(url,username,password); //3 定义sql String sql1 = "update acccount set money = 2000 where id = 1"; String sql2 = "update acccount set money = 2000 where id = 2"; //4 获取执行对象 Statement stmt = conn.createStatement(); //5 执行sql try { //开启事务 conn.setAutoCommit(false); int count1 = stmt.executeUpdate(sql1); int count2 = stmt.executeUpdate(sql2); //6 处理结果 System.out.println(count1); System.out.println(count2); } catch (Exception e) { //回滚事务 conn.rollback(); e.printStackTrace(); } //7 释放资源 stmt.close(); conn.close(); } }
执行SQL语句
用于执行DML、DDL语句,返回值为影响的行数
int executeUpdate(sql)
用于执行DQL语句,返回值为结果集对象
ResultSet executeQuery(sql)
ResultSet结果集对象返回了DQL查询语句的结果,如果我们我们想要获取结果,需通过下面两个方法。
将光标从当前位置向下移动一行,并且判断当前行是否为有效行,返回值为布尔类型。
boolean next()
获取数据,返回值为对应类型,参数有两种写法,填int数字则表示选取的列编号,从1开始;填string则表示选取列的名称。
对应类型 get对应类型(参数)
一般来说,我们使用ResultSet应该使用如下写法:
while(rs.next()){
re.get对应类型(参数)
}
使用演示
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws Exception{
//2 获取链接
String url = "jdbc:mysql://127.0.0.1:3306/cov22";
String username = "root";
String password = "943073123";
Connection conn = DriverManager.getConnection(url,username,password);
//3 定义sql
String sql = "select * from hotsearch";
//4 获取执行对象
Statement stmt = conn.createStatement();
//5 执行sql
ResultSet resultSet = stmt.executeQuery(sql);
//6 处理结果
while(resultSet.next()){
int id = resultSet.getInt(1);
String hotSelect = resultSet.getString(3);
System.out.println(id);
System.out.println(hotSelect);
System.out.println("------------");
}
//7 释放资源
resultSet.close();
stmt.close();
conn.close();
}
}
out:
SQL注入
SQL注入是指通过操作输入一些特定的脚本到文本框中,从而让后台识别错误,被SQL注入者进行服务器攻击。
如:查询语句
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Test { public static void main(String[] args) throws Exception{ String name = "写啥都行"; String pwd = "'or'1' = '1"; String sql = "select * from tb_user where username = '"+name+"'and password = '"+pwd+"'"; System.out.println(sql); } }
当我们输出:
select * from tb_user where username = '写啥都行'and password = ''or'1' = '1'
这表明通过字符串拼接的SQL语句居然被人恰好利用了。where条件为真则查tb_user整张表数据,而or优先级比and低,故or最后执行,而1 = 1为真。
PreparedStatement可以解决SQL注入问题。
(一)获取PreparedStatement对象
将原先的未知变量用?来进行占位。如:
String sql = "select * from user where username = ? and password = ?";
PrepareStatement pstmt = conn.prepareStatement(sql);
(二)设置参数
调用PreparedStatement对象的set对应类型方法。用于给?赋值。其中该方法要填上两个参数,第一个参数表示第几个?,第二个参数表示该?对应的值。
(三)执行SQL
调用int executeUpdate(sql)或ResultSet executeQuery(sql)即可。
好处
预编译性能更高的原因是:在获取PreparedStatement对象时,将所有sql语句发送给mysql服务器进行检查,编译,这些步骤是十分耗时的,但是如果开启了预编译,那么就不用再进行这些步骤了,速度会很快,为何?因为sql的模板都是一样的,只有?处不一样,故对于sql模板只需进行一次检查、编译即可。
如果我们想开启预编译,并且想要在后台看到数据库的访问情况,可以按照如下的方式进行配置。
(一)连接url添加&useServerPrepStmts=true。
(二)前往mysql安装位置,然后打开my.ini,在文件末尾添加如下内容,添加完毕后要重启sql服务:
# 配置执行日志
log-output=FILE
general-log=1
general_log_file="C:\mysql\mysql-8.0.29-winx64\MysqlLog.log"
slow-query-log=1
slow_query_log_file = "C:\mysql\mysql-8.0.29-winx64\mysql_show.log"
long_query_time = 2
概述
数据库连接池是个容器,负责分配、管理数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
连接遗漏
当数据库连接池中的连接被用户所分配完,而新的用户需要连接却没有所需的连接可以给他,老用户则一直占用连接,这时候我们称这种情况为连接遗漏。
数据库连接池会在无可用连接时检查使用连接用户的连接情况,如果发现有些连接连上了却一直闲置,则连接池会强制关闭该用户的连接,这样,新用户就有连接可用了。
数据库连接池实现
官方提供了数据库连接池的标准接口DataSource,并由第三方组织实现此接口。其主要功能是获取连接,主要写法如下:
Connection getConnection()
常见的第三方数据库连接池有:
我们要使用的,便是由阿里巴巴开源的数据库连接池项目Druid,其功能强大,性能优秀,是Java语言最好的数据库连接池之一。
数据库连接池的使用如下:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class Test {
public static void main(String[] args) throws Exception {
//1 导入jar包
//2 定义配置文件
//3 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/main/java/druid.properties"));
//4 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5 获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
其中druid的配置文件如下:
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/cov22?userSSL=false&useServerPrepStmts = true
username = root
password = 943073123
# 初始化链接数量
initialSize = 5
# 最大连接数
maxActive = 10
# 最大等待时间
maxWait = 3000
除了以上的配置信息外,还有一些其他的配置信息,感兴趣的可以自己上网搜索。