1.JDBC的使用连接步骤:
a.导入驱动jar包
b.注册驱动
c.获取数据库连接对象 Connection
d.定义sql
注意: sql的参数使用 ? 作为占位符
?占位符需要赋值
方法: setxxx(参数1,参数2)
参数1: ? 的位置编号, 从1开始
参数2: ? 的值
e.获取执行sql语句的对象 PreparedStatement
f.执行sql,接收返回结果
g.处理结果
h.释放资源
2.详解各个对象
1)DriverManager: 驱动管理对象
作用:
a.注册驱动:告诉程序该使用哪一个数据库驱动jar
b.获取数据库连接
2)Connection对象: 数据库连接对象
作用:
a.获取执行sql 的对象
Statement createStatement()
b.管理事务:
手动开启事务:setAutoCommit(boolean)
方法参数设置成false.手动开启事务
提交事务:commit()
回滚事务:rollback()
3)Statement对象: 指定sql的对象
执行sql的三个方法:
(1).boolean execute(String str)
DDL/DML:返回fasle DQL:返回true
返回值: 指的是有没有结果
因为 DML 和 DQL都有专门的执行方法,
所以该方法通常用来指定DDL
(2).int executeUpdate(String str)
只能执行DML
返回值: 表示影响了几行
(3).ResultSet executeQuery(String str)
只能执行DQL
返回值: 查询出来的结果集
boolean next():游标向下移动一行
判断当前行是否是最后一行(是否有数据)
如果是,则返回false,如果不是则返回true
getxxx(参数): 获取数据
xxx:代表数据类型
参数:
1. int: 代表列的编号,从1开始 -> getString(1)
2. String: 代表列的名字. -> getDouble("name");
使用步骤:
a.将游标向下移动一行
b.判断是否有数据
c.获取数据
4)PreparedStatement对象: 执行sql的对象
a.sql注入的问题
输入用户名: 随意
输入的密码: a' or 'b'='b a' or '1' = '1 -> 恒成立
b.产生的原因:
因为在做sql拼接的时候,有一些sql的特殊关键字参与了字符串的拼接,会造成安全性问题
c.解决sql注入问题:
使用PreparedStatement对象来解决
d.预编译sql:参数使用? 作为占位符
比如:select * from user where
username = ? and password = ?;
?占位符需要赋值
方法: setxxx(参数1,参数2)
参数1: ? 的位置 编号, 从1开始
参数2: ? 的值
3.数据库连接池
概念:
其实就是一个容器,存放数据库连接的容器. 当系统初始化好后,这个容器就会被创建,在容器中会申请一些连接对象,
当用户来访问数据库时,就会从容器中获取连接对象 当用户访问完之后,会将连接对象归还给容器.
实现:
a.标准接口: DataSource -> javax.sql包
方法:
获取连接: getConnection()
归还连接: Connection.close()b.市面上常见的连接池 a.Apache - dbcp b.c3p0 c.阿里 - druid
C3P0连接池:
使用第三方连接池步骤:
a.导入jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
b.定义配置文件:
名称(固定形式): c3p0.properties 或者 c3p0-config.xml
driver = com.mysql.cj.jdbc.Driver
代码:
url = jdbc:mysql://localhost:3306/jdbc_2107
user = root
password = 123456
存放配置文件的路径: 必须在类路径的根目录下 - 可以理解成存在文件src目录下
c.创建数据库连接池对象: ComboPoolDtataSource
d.获取连接: getConnection
代码实例:
public class JDBCUtils {
//设置成静态成员变量
static String driver;
static String url;
static String user;
static String password;
/*
读取属性集(配置文件)
必须在程序一开始执行就读取到配置文件
*/
static{
Properties pro = new Properties();
try {
pro.load(JDBCUtils.class.getResourceAsStream("db.properties"));
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
//静态方法 - 获取数据库连接对象
//使用配置文件避免硬编码方式
public static Connection geConnection(){
Connection conn = null;
try {
//1.导入驱动jar包
//2.注册驱动
Class.forName(driver);
//3.获取数据库连接对象
conn = DriverManager.getConnection(
url,
user,
password
);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
//封装 - close()
public static void close(ResultSet rs, Statement stmt, Connection conn){
try {
//避免空指针
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
5.JDBC的连接 和 连接池连接的区别
a.通过连接池获取的连接关闭后,
连接对象返回给连接池,它的引用会设置为null
b.通过JDBC获取的连接关闭后,
连接对象还在,但是状态是'已关闭状态'是不能再使用的.
Druid连接池:
1.使用步骤:
a.导入jar包
b.定义配置文件:
是properties形式,可以是任意名称,可以放在任意目录下
(意味着不会自动加载,需要手动调用)
c.加载配置文件. xx.properties
d.获取数据库连接池对象:
通过工厂方式来获取: DruidDataSourceFactory
e.获取连接: getConnection
代码实例:
public class DruidUtils {
//定义静态成员变量
private static DataSource ds;
//对连接池进行初始化操作
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(DruidUtils.class.getClassLoader()
.getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*获取连接*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/* 获取连接池方法*/
public static DataSource getDataSource(){
return ds;
}
/*释放资源*/
public static void close(ResultSet rs, Statement stmt, Connection conn){
try {
//避免空指针
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/*释放资源 - 重载*/
public static void close(Statement stmt, Connection conn){
close(null,stmt,conn);
}
}
2.定义工具类
a.定义一个类(类名随意) DruidUtils
b.提供静态代码块加载配置文件,初始化连接池对象
c.提供方法
①.获取连接方法:通过数据库连接池获取连接
②.获取连接池的方法
③.释放资源
JDBCTemplate -> DBUtils(Apache)
1.Spring框架对JDBC的简单封装
提供了一个JDBCTemplate对象来简化JDBC的开发
2.使用步骤:
a.导入jar包
b.创建JDBCTemplate对象,依赖于DataSource
c.调用JDBCTemplat的方法来完成CRUD操作
3.常用方法:
update():DML语句 增删改操作
queryForMap():查询结果将结果集封装成map集合
queryForList():查询结果将结果集封装成list集合
query():查询结果将结果集封装成JavaBean对象
queryForObject():查询结果,将结果封装成对象
DAO:Data Access Object -> 数据访问对象
作用:数据库中拿到的数据将它封装成Java的对象
书写规范:
一张表对应一个实体类,再对应一个Dao
再对应一个测试类,测试dao中的所有方法
Dao有的方法:
a.增加一个对象
b.修改一个对象
c.根据id删除对象
d.根据id查询
e.查询全部 -> 分页查询,条件查询
f.查询总记录条数 -> 条件查询中