JDBC
- JDBC
* 概念:定义了一套操作所有关系型数据库的规则,即接口;
* 快速入门:
- 导入驱动jar包
- 注册驱动
- 获取数据库连接对象
- 定义sql
- 获取执行sql语句的对象Statement
- 执行sq,接受返回结果
- 处理结果
- 释放资源
1 | //1.导入驱动jar包 |
- 详解对象
DriverManager:驱动管理对象
- 功能:
- 注册驱动:static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager
- 获取数据库连接:static Connection getConnection(String url,String user,String password)
- url:jdbc:mysql://ip地址(域名):端口号/数据库名称
- user:登陆账户名,password:登陆密码
- 功能:
Connection:数据库连接对象
- 功能:
- 获取执行sql对象
- Statement createStatement()
- PreparedStatement prepareStatement(String sql);
- 管理事务:
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
- 获取执行sql对象
- 功能:
Statement:执行SQL的对象
- 功能:
- 执行sql
- boolean execute(String sql):可以执行任意的sql;
- int executeUpdate(String sql):执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句;通过返回值返回的行数是否大于0,判断语句是否执行成功
- ResultSet extcuteQuery():执行DQL(select)语句
- 执行sql
1
2
3
4
5
6
7
8# 创建资源加载的配置文件jdbc.properties
#驱动名
driverClassName=com.mysql.jdbc.Driver
#数据库地址
url=jdbc:mysql:///day17
#登录名和密码
username=root
password=1231
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83//创建数据库工具类JDBCUtils
import java.io.FileReader;
import java.io.IOException;
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 pro=new Properties();
//2.加载文件
pro.load(new FileReader("./jdbc.properties"));
//3.获取数据,赋值
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
*释放资源
*/
public static void close(Statement stmt,Connection conn){
if(stmt!=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
/**
*释放资源
*/
public static void close(Statement stmt, Connection conn, ResultSet rs){
if(stmt!=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(rs!=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}- 功能:
ResultSet:结果集对象
- 功能:
- next():游标向下移动一行
- getInt/getString(参数):获取数据
- int 代表编号,从1开始。如:getInt(1);获取当前行的第一列数据;
- String:代表列名称。如:getString(“id”);获取当前行的指定键值对应的数据;
- 功能:
PreparedStatement:执行sql的对象(解决sql注入问题)
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
- 如:用户随便输入账号,密码使用‘a’ or ‘a’=‘a’
- select * from user where username=‘sdsds’ and password=‘a’ or ‘a’=‘a’;
解决sql注入问题:使用PreparedStatement对象来解决
预编译的SQL:参数使用?作为占位符。如select * from username=? and password=?;
步骤:
导入驱动jar包
注册驱动
获取数据库连接对象Connection
定义sql:参数使用?作为占位符。如select * from username=? and password=?;
获取执行sql语句对象PreparedStatement Connection.prepareStatement(String sql)
给?赋值:setxxx(参数1,参数2)
执行sql,接受返回结果
处理结果
释放资源
- JDBC控制事务
* 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个步骤要么同时成功,要不同时失败。
* 操作:
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为flase,即开启事务
- 在执行sql之前开启事务
- 提交事务:commit()
- 当所有sql都执行完提交事务
- 回滚操作:rollback()
- 在catch中回滚事务
- 数据库连接池
* 概念:其实就是一个容器(集合),存放数据库连接的容器;当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器,达到对象复用的目的。
* 实现:
- 标准接口:DataSource javax.sql包下的
- 获取连接:getConnection()
- 归还连接:close()方法;
- 一般不自己去实现它,由数据库厂商实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供(最常用)
- C3P0实现数据库连接池
* 步骤:
- 导入jar包(两个)c3p0-0.9.5.0.jar machange-commons-java-0.2.12.jar
- 定义配置文件
- 名称:c3p0.properties或者c3p0-config.xml
- 路径:直接将文件放在src目录下即可
- 创建核心对象:数据库连接池对象 ComboPooledDataSource
- 获取连接:getConnection
- druid实现数据库连接池
* 步骤:
导入jar包 druid-1.0.9.jar
定义配置文件:
是properties形式的
1
2
3
4
5
6
7
8
9driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day17
username=root
#连接池初始化连接数
initialSize=5
#最大连接数
maxActive=10
#等待时间
maxWait=3000可以叫任意名称,可以放在任意目录下
加载配置文件。Properties
获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
获取连接:getConnection
* 定义工具类
- 定义一个类JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池对象获取
- 释放资源
- 获取连接池的方法
1 | package util; |
- Spring JDBC:JDBC Template
* 概念:Spring 框架对JDBC的简单封装
* 步骤:
导入jar包:
- commons-logging-1.1.1.jar
- spring-beans-4.2.4.RELEASE.jar
- spring-core-4.2.4.RELEASE.jar
- spring-jdbc-4.2.4.RELEASE.jar
- spring-tx-4.2.4.RELEASE.jar
创建JdbcTemplate对象,依赖于数据源DataSource
- JdbcTemplate template=new JdbcTemplate(ds)
调用JdbcTemplate的方法来完成CRUD的操作
- updata():执行DML语句。增,删,改语句
- queryForMap():查询结果集封装到map集合中,将列名作为key,将值作为value,将这条记录封装为一个map集合,这个方法查询到的结果集长度只能是1
- querForList():查询结果集封装到list集合中,将每一条记录封装为一个集合,再将Map集合装载到List集合中
- query():查询结果,将结果封装到JavaBean对象,
- 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
- new BeanPropertyRowMapper<类型>(Emp.class)
- queryForObject:查询结果,将结果封装成对象
- 一般用于聚合函数的查询