目录
JDBC概念
JDBC就是使用Java语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity)Java数据库连接
JDBC本质
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
步骤
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/test";
String username="root";
String password="123456";
Connection cn= DriverManager.getConnection(url,username,password);
//3.定义sql
String sql="update account set money=1000 where id=1";
//4.获取执行sql的对象 statement
Statement sta= cn.createStatement();
//5.执行sql
int count=sta.executeUpdate(sql);//受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
sta.close();
cn.close();
JDBC API详解
一、DriverManager
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看Driver类源码
static{
try{
DriverManager. registerOriver (new Driver());
}
catch(SQLException var1){
throw new RuntimeException("Can't register driver!");
}
}
提示:
MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2.获取连接
static Connection getconnection(String url,string user,String password)
参数
1.url:连接路径
语法:jdbc:mysql:/ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例:jdbc:mysql://127.0.0.1:3306/db1细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysq://数据库名称?参数键值对
配置 useSSL=false参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码
二、Connection
1.获取执行SQL的对象
普通执行SQL对象
Statement createStatement()
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
2.事务管理
JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rolback()
三、Statement
Statement作用:
1.执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
|返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行DQL 语句
返回值:ResultSet 结果集对象
四、ResultSet
ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL 语句,返回ResultSet对象获取查询结果
boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行
返回值:
true:有效行,当前行有数据
false:无效行,当前行没有数据
xxx getxxx(参数):获取数据
xxx:数据类型;如:int getlnt(参数);String getString(参数)
参数:
int:列的编号,从1开始
String:列的名称
五、PreparedStatement
PreparedStatement作用:
1.预编译SQL语句并执行:预防SQL注入问题
SQL注入:
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
①获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql="Select * from user where username=?and password=?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt=conn.prepareStatement(sql);
②设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型;如setlnt(参数1,参数2)
参数:
口参数1:?的位置编号,从1开始
口参数2:?的值
③执行SQL
executeUpdate();/executeQuery();:不需要再传递sql
好处:
1.预编译SQL,性能更高
2.防止SQL注入:将敏感字符进行转义
②配置MySQL执行日志(重启mysql服务后生效)
set general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
原理:
1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了,速度更快
3.如果sql模板一样,则只需要进行一次检查、编译
数据库连接池
简介:
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
资源重用
提升系统响应速度
避免数据库连接遗漏
数据库连接池实现
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
功能:获取连接
Connection getConnection()
常见的数据库连接池:
DBCP·C3PO
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
druid.properties配置文件里的内容:
driverClassName=com.mysql.cj.jdbc.Driver
#URL连接数据库的URL,其中travel(以下面例子来说)为连接的数据库,后面的参数可不改但不删
url=jdbc:mysql://localhost:3306/travel?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
characterEncoding=utf-8
#安装mysql时候设置的用户与密码
username=root
password=root
#初始化物理连接的个数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接时最大等待时间
maxWait=3000
#用来检测连接是否有效的sql
validationQuery=SELECT 1
#保证安全性!
testWhileIdle=true
案例:添加数据
/**
* 添加数据
* @throws Exception
*/
@Test
public void Addition() throws Exception {
//接受页面传入的参数
String brandName="优乐美";
String companyName="达利园集团";
int ordered=2;
String description="温暖你的冬天";
int status=1;
//1.获取Connect对象
//3.加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:/JavaCode/jdbc-demo/src/druid.properties"));
//4.获取连接池对象
DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接Connection
Connection conn=dataSource.getConnection();
//2.定义sql语句
String sql="insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?)";
//3.获取pstmt对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//4.设置参数
pstmt.setString(1,brandName);
pstmt.setString(2,companyName);
pstmt.setInt(3,ordered);
pstmt.setString(4,description);
pstmt.setInt(5,status);
//5.执行sql
int count = pstmt.executeUpdate();
//6.处理结果
if(count>0){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
//7.释放资源
pstmt.close();
conn.close();
}