目录
JDBC概述
JDBC:Java数据库连接(Java DataBase Connectivity) . 其作用是通过java于洋操作数据库, 本质上是定义了一套操作所有关系型数据库的规则(接口),然后各个数据库的厂商去实现这套接口,提供数据库驱动jar包,然后我们使用这个接口(JDBC)编程,驱动jar包中的实现类
JDBC的实现步骤
在进行JDBC的实现之前首先需要导入(mysql-connection-java-5.1.37-bin)jar包,然后开始开始执行JDBC的六步操作.
jar包链接:
链接:https://pan.baidu.com/s/1LsyTxuoDGrOh2cqNt9UfaQ
提取码:nfn8
- 注册驱动
- 获取数据库连接对象,connection
- 定义SQL
- 获取执行SQL语句的对象,statement
- 执行sql,接收返回结果
- 处理结果
- 释放资源
案例代码:
public void testSave() throws Exception {
//1.注册驱动
DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://localhost:3306/student";
String username = "root";
String password = "root";
//2.获得连接
Connection connection = DriverManager.getConnection(url, username, password);
//3.获得语句执行者
Statement st = connection.createStatement();
//4.执行语句
String sql = "INSERT INTO tab_account VALUES(NULL , 'rose' , '1000')";
int count = st.executeUpdate(sql);
//5.处理结果
System.out.println(count);
//6.释放资源
st.close();
connection.close();
}
}
JDBC中相关API介绍
DriverManager:驱动管理对象
作用:
- 注册驱动
static void registerDriver(Driver driver):
注册于给定的驱动程序 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包可以省略注册驱动的步骤
- 获取数据库的连接
方法:static Connection getConnection(String url,String user,String password)参数:url:指定连接的路径语法:jdbc:mysql://ip地址(域名):端口号/数据库名称细节:如果连接的是本地的mysql服务器,并且mysql服务器默认端口是3306,则url可以简写:jdbc:mysql://数据库名称user:数据库用户名password:数据库密码
Connection:数据库连接对象
作用:
- 获取执行的SQL对象
statement createStatement()
PreparedStatement prepareStatement(String sql)
- 管理事务
开启事务:setAutoCommit(boolean autoCommit)调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
Statement:执行SQL对象
boolean execute(String sql):可以执行任意SQL
int executeUpdate(String sql):执行DML(增删改)语句,返回值是影响的行数,通过这个判断DML语句是否执行成功.
ResultSet executeQuery(String SQL):执行DQL(查询)语句
ResultSet:结果集对象
boolean next():游标向下移动一行,判断当前是否最后一行末尾(是否有数据),如果有,则返回false,否则返回true getXxxx(参数):获取数据
Xxx:代表数据类型,, 如getInt(int/String), getString(int/String) 参数
int 代表列的编号,从 1 开始, String:代表列的名称 注意
使用步骤
游标向下移动一行 判断是否有数据 获取数据
PreparedStatement:执行SQL对象
{防止SQL注入 效率更高}
sql注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全性问题 解决SQL的注入问题,使用PreparedStatemet对象来解决 预编译SQL:参数使用?作为占位符 步骤
导入驱动jar包,mysql-connector-java-5.1.37-bin.jar 注册驱动 获取数据库连接对象 Connection 定义SQL
注意:SQL的参数使用?作为占位符,---->select * from user where username=? and password=? 给?赋值
方法--->setXxx(参数1,参数2)
参数1:?位置的编码 从1开始 参数2:?的值 执行SQL,接收返回结果,不需要传递参数 处理结果 释放资源
JDBC初封装案例代码:
配置文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
package com.james.Utils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
static{
//读取资源文件获取值
try {
//1 创建Properties集合类
Properties properties = new Properties();
//2 获取src路径下的文件的方式----->classLoader 类加载器
ClassLoader classLoader=JDBCUtils.class.getClassLoader();
URL res=classLoader.getResource("jdbc.properties");
// 获取配置文件路径
String path=res.getPath();
//3 加载文件
properties.load(new FileReader(path));
//4 获取数据
url=properties.getProperty("url");
user=properties.getProperty("user");
password=properties.getProperty("password");
//5 注册驱动
driver=properties.getProperty("driver");
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 获取连接对象的方法
* */
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
Druid连接池
连接池就是一个存放数据库容器,当系统初始化好之后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器.
优点:
- 节约资源,减轻服务器压力
- 提高连接复用性,用户访问高效
硬编码方式:
- 导入jar包链接:
https://pan.baidu.com/s/1lHnZJ-uPbEVwOuodV8poHA
提取码:n04c
- 创建对象
- 配置数据库连接的四个基本参数(驱动,url,username,password)
- 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
- 通过连接池对象获取连接
- 使用连接
- 调用连接,close()可以归还连接
public class DRUIDDemo {
@Test
//硬编码,所有的配置都写到java代码中
public void test1() throws SQLException {
//1. 创建对象
DruidDataSource ds = new DruidDataSource();
//2. 设置数据库连接的4个基本参数(驱动,url,username,password)
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///student");
ds.setUsername("root");
ds.setPassword("1234");
//3. 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
ds.setMaxActive(10);
ds.setMinIdle(2);
ds.setMaxWait(2000);
//获取11个连接 ,会出现重复的连接
for (int i = 1; i <12 ; i++) {
//4. 通过连接池对象获取连接
Connection conn = ds.getConnection();
//5. 使用连接
System.out.println(conn);
if (i%7==0){
//6. 调用连接close()就可以归还连接
conn.close();
}
}
}
}
抽取工具类,利用配置文件创建连接池
工具类:
package com.james.b_utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* 连接池的工具类
* 1.获得连接
* 2.释放资源(归还连接)
*/
public class DruidUtils {
//1.准备数据源
private static DataSource dataSource = null ;
//2.static静态代码块初始化连接池
static {
try {
//加载流
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("db.properties");
//创建properties
Properties properties = new Properties();
//加载数据
properties.load(is);
//实例化连接池
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从池中获得连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
xml配置文件(src文件夹下):
#此处的properties 的key不能瞎写
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
initialSize=3
maxActive=10
maxWait=3000
package com.james.b_utils;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDemo {
public static void main(String[] args) throws SQLException {
for(int i = 1 ; i <= 11 ; i++ ){
Connection connection = DruidUtils.getConnection();
System.out.println(i+"@@"+connection);
if(i==5){
//归还第五个连接
connection.close();//连接池对close方法都进行重写了
}
}
}
}