一、JDBC
1.概念
作用 : 程序代码通过 数据库 驱动 , 实现与数据库连接
JDBC : SUN公司为了简化 开发人员对数据库的统一操作 , 提供了一个Java操作数据库的规范 , 俗称JDBC

2.连接数据库
(1) 使用maven导入sql的相关依赖
<dependencies>
<!-- MySQL JDBC driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>(2) 加载驱动
Class.forName("com.mysql.jdbc.Driver");(3)配置用户信息
//Unicode是否支持中文编码 , characterEncoding字符编码 , SSL使用安全的连接 , serverTimezone时区时间
String url = "jdbc:mysql://localhost:3306/myemployees?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
String usernanme = "root";
String password = "password";(4)利用DriverManager连接数据库 , 返回Connection类型的数据库对象
Connection connection = DriverManager.getConnection(url,usernanme,password);(5)创建 执行SQL的对象Statement
Statement statement = connection.createStatement();(6)利用statement对象去执行SQL语句 , 执行完后返回 ResultSet类型的结果集
String sql = "SELECT * FROM jobs";
ResultSet resultSet = statement.executeQuery(sql);(7)释放连接
resultSet.close();
statement.close();
connection.close();3.常用方法
statement 或 PrepareStatement : 执行SQL的对象
statement.executeQuery(sql); //查询操作,并返回 resultSet结果集
statement.execute(sql); //可执行任何sql
statement.executeUpdate(sql); // 更新\插入\删除.ResultSet : 执行查询操作后 , 返回的结果集.
获取结果集的数据
resultSet.getobject();遍历结果集
resultSet.next(); //移动到下一个数据close : 释放资源
事务
1.利用关闭自动提交来开始事务
connect.setAutoCommit(false);2.一组业务执行完毕后 , 提交事务
connect.commit();3.若一组业务有1 , 2 , 3的 SQL语句 , 其中1执行成功 , 但2语句有错执行失败 , 那么1会默认回滚
4.封装工具类
(1)在src文件夹下 新建一个文件夹utils , 在其中新建文件JdbcUtils.java
(2)写入相关代码
package com.utils;
import java.sql.*;
public class JdbcUtils {
private static String driver = "com.mysql.jdbc.Driver";
//可根据不同需求改写数据库所用的表
private static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";;
private static String username = "root";
private static String password = "449964";
static {
try {
//1.加载驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 获取连接 方法
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
/*
* 释放连接 方法
*/
public static void release(Connection connection, Statement statement,ResultSet resultSet) {
//从下向上关闭,多加一个判断
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
二、SQL注入
sql存在漏洞,会被攻击导致数据泄露.
常用攻击方法 : 利用or来拼接
SELECT * FROM studentinof WHERE `id`=' ' or '1=1 ' AND `name`=' ' or ' 1=1';2.1 preparedStatement防止SQL注入
可以防止SQL注入的问题
与普通的statement方法的区别是:
1.写SQL时 , 需要先使用 ? 占位符来代替参数
2.然后用connect.prepareStatement(sql) 方法,传入sql进行预编译
3.然后再利用 statement.setObject(参数下标 , 参数值) , 手动给参数赋值
4.最后执行 即statement.execute();
package com.course.lesson4;
import com.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class prepareStatementMethod {
public static void main(String[] args) throws SQLException {
//连接数据库
Connection connection = JdbcUtils.getConnection();
//编写带参数的sql (参数用问号)
String sql = "insert into studentinof(`id`,`name`) values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql); //预编译,不执行
//传入参数
statement.setInt(1,4);
statement.setString(2,"man");
//执行
int i = statement.executeUpdate();//这里无需传sql
if(i >0){
System.out.println("插入成功!");
}
JdbcUtils.release(connection,statement,null);
}
}
三、MyBatis
官方文档 : https://mybatis.org/mybatis-3/zh_CN/index.html
3.1 开发步骤
1). 创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包、lombok。
Developer Tools/Lombok, SQL/MyBatis Framwork, SQL/MySQL Driver
2). 数据准备:创建用户表user,并创建对应的实体类User。
注意:实体类的属性名与表中的字段名需要一一对应
3). 配置Mybatis
在 application.properties 中配置数据库的连接信息。
#数据库访问的url地址
spring.datasource.url=jdbc:mysql://localhost:3306/XXX
#数据库驱动类类名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#访问数据库-用户名
spring.datasource.username=root
#访问数据库-密码
spring.datasource.password= XXX4). 编写Mybatis程序:编写Mybatis的持久层接口,定义SQL语句(注解)
创建一个文件夹 mapper 。在 mapper 包下创建一个接口 UserMapper ,这是一个持久层接口(Mybatis的持久层接口规范一般都叫 XxxMapper)
UserMapper接口的内容如下:
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
/**
* 查询全部
*/
@Select("select * from user")
public List<User> findAll();
}注解说明:
@Mapper注解:表示是mybatis中的Mapper接口
程序运行时,框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理
@Select注解:代表的就是select查询,用于书写select查询语句
3.2 实现增删改查
Mybatis的提供的符号,有两个,一个是
#{...},另一个是${...},区别如下:
需要传递多个参数时,注意使用@Param("name")声明每个参数,SQL才能识别到使用的哪个参数
@Update("update `employees` set first_name = #{employee.first_name}, last_name = #{employee.last_name}, email = #{employee.email}, phone_number = #{employee.phone_number}, job_id = #{employee.job_id}, salary = #{employee.salary}, commission_pct = #{employee.commission_pct}, manager_id = #{employee.manager_id}, department_id = #{employee.department_id}, hiredate = #{employee.hiredate} where employee_id = #{employeeId}")
public int updateById(@Param("employee") Employee employee, @Param("employeeId") Integer employeeId);3.3 XML映射配置
如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中.
在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace属性为Mapper接口全限定名一致
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
Mapper注解的方式:
@Select("select * from `employees`")
public List<Employee> findAll();XML映射的方式:
mapper接口只用@Mapper注解,内部的方法不再需要注解
@Mapper
public interface EmployeeMapper {
/**
* 查询全部
*/
public List<Employee> findAll();
}构建对应的xml映射文件:
1) 在resources文件夹下新建一个与mapper接口文件一致的文件路径
如mapper接口为java/cn/alchemylab/mapper/EmployeeMapper.java
则需要建立resources/ cn/alchemylab/mapper/EmployeeMapper.xml
2) 编写XML映射文件
<!-- 固定声明格式 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace要写是哪一个mapper接口要执行 -->
<mapper namespace="cn.alchemylab.mapper.EmployeeMapper">
<!-- id要写mapper接口中对应执行的方法 , resultType要写该方法返回的数据类型-->
<select id="findAll" resultType="cn.alchemylab.pojo.Employee">
<!-- 中间写SQL语句 -->
select * from `employees`
</select>
</mapper>四、数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象
客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)
数据库连接池的好处:
资源重用
提升系统响应速度
避免数据库连接遗漏
切换数据库连接池产品:
把默认的数据库连接池切换为Druid数据库连接池
①. 在pom.xml文件中引入依赖
<dependency>
<!-- Druid连接池依赖 -->
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.19</version>
</dependency>②. 在application.properties中引入数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/XXX
spring.datasource.druid.username=root
spring.datasource.druid.password=XXXXX

参与讨论
(Participate in the discussion)
参与讨论