1.JDBC 是数据库连接的底层基础-是不同的数据的规范
- JDBC生产环境基本不用

- 不同厂商都要符合JDBC接口的规范即可

- JDBC入门

- 建库建表
java
-- 创建数据库
create database web01;
-- 使用数据库
use web01;
-- 建表
create table user(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) comment '用户名',
password varchar(32) comment '密码',
name varchar(10) comment '姓名',
age tinyint unsigned comment '年龄'
) comment '用户表';
-- 插入数据
insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
(2, 'xiaoqiao', '123456', '小乔', 18),
(3, 'diaochan', '123456', '貂蝉', 24),
(4, 'lvbu', '123456', '吕布', 28),
- 准备依赖
java
<!-- MySQL数据库Java驱动,用于Java程序连接和操作MySQL数据库 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!-- JUnit 5核心依赖,用于编写和执行Java单元测试,仅在测试阶段生效 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
<!-- Lombok依赖,通过注解自动生成getter、setter、构造器等样板代码,简化Java开发 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
-案例代码
java
package com.itheima;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcTest {
/**
* JDBC入门程序
*/
@Test
public void testSelect() throws Exception {
// 1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/web01";
String user = "root";
String ps = "1234";
Connection connection = DriverManager.getConnection(url, user, ps);
// 3.获取SQL语句的执行对象
Statement statement = connection.createStatement();
// 4.定义并执行SQL语句
String sql = "select * from user";
boolean execute = statement.execute(sql);
if (execute) {
// 获取结果集
ResultSet rs = statement.getResultSet();
// 遍历结果集
while (rs.next()) {
// 根据字段名或索引获取值
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String name = rs.getString("name");
int age = rs.getInt("age");
// 输出结果
System.out.println("id: " + id + ", username: " + username + ", password: " + password + ", name: " + name + ", age: " + age);
}
// 关闭结果集
rs.close();
}
// 5. 释放资源
statement.close();
connection.close();
}
}

-
JDBC生产环境基本不用

2.预编译SQL

2.1 SQL注入
-
应用程序如果直接将用户输入的内容拼接到 SQL 语句 中,没有做任何过滤或转义,攻击者就能通过构造特殊输入,改变原 SQL 的逻辑。
-
由于'1'='1永远为真,这个 SQL 会查询出所有用户数据,攻击者无需正确账号密码就能登录。



3.MyBatis
-
JDBC太难用,MyBatis对JDBC进行封装,对其操作进行简化

-
3.1Mybatis简化JDBC操作

-
Mybatis对于JDBC的优化点(手动变自动)




3.2 Mybatis入门

-
1.导入依赖 pom.xml
-
在pom.xml中添加 Spring Boot 与 MyBatis 集成的依赖,以及数据库驱动依赖(以 MySQL 为例)
-
注意!!!注意!!!注意!!!
如果Spring Boot 3.x 与 MyBatis 依赖版本不兼容,就会一直报找不到UserMapper的Bean对象
java
<!-- MySQL数据库Java驱动,用于Java程序连接和操作MySQL数据库 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
注意!!!注意!!!注意!!!
如果Spring Boot 3.x 与 MyBatis 依赖版本不兼容,就会一直报找不到UserMapper的Bean对象
<!-- MyBatis 与 Spring Boot 集成依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
- 2.配置application.properties
java
spring.application.name=springboot-web-quickstart
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/web01
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234

- 3.建立pojo文件包,在其中创建User实体类
java
package com.itheima.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
}
- 4.建立mapper文件包,在其中创建UserMapper接口
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
//应用程序在运行时,会自动的为该接口创建一个实现类对象(代理对象),并且会自动将该实现类对象存入IOC容器 - bean
@Mapper
public interface UserMapper {
/**
* 查询所有用户
*/
@Select("select * from user")
public List<User> findAll();
}

3.3 IDEA中 让@Select注解里的SQL语句有提示


-Mybatis的日志输出

- 配置application.properties
java
#配置Mybatis的日志信息
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

-
JDBC 和 Mybatis 对比

4.数据库连接池

-
连接池的作用

-
怎么使用连接池


-
我非要用别的连接池怎么办?



-
删除操作

-
什么时候用$ - 什么时候用#



-
新增操作


-
修改用户

-
查询用户

-
其他方法不需要@Param而这里select使用@param的原因,多个参数时需要添加,若都用User作为参数传进来,则都可以不用@Param


-
只有基于官网骨架创建的springboot项目中,才可以省略@Param

-
若是自己创建的,非官方创建的springboot项目->改一下以下参数也可以不加@Param注解

-
对比


加了@Param注解后变正常

5.XML映射配置


5.1 XML文件的头信息到官网获取


java
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1. XML文档声明:指定版本为1.0,编码格式为UTF-8
2. DOCTYPE约束:定义当前XML是MyBatis的Mapper配置文件,遵循MyBatis 3.0的DTD规范
3. 约束地址用于验证XML标签的合法性(https://mybatis.org/dtd/mybatis-3-mapper.dtd)
-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper标签:MyBatis映射文件的根标签
namespace属性:必须指定对应的Mapper接口全类名(包名+类名)
作用:将当前XML文件与Mapper接口绑定,MyBatis通过该属性找到对应的接口方法
-->
<mapper namespace="com.itheima.mapper.UserMapper">
<!--
select标签:用于定义查询语句(对应Mapper接口中的查询方法)
id属性:必须与Mapper接口中的方法名完全一致(此处对应UserMapper的findAll()方法)
resultType属性:指定查询结果的返回类型(全类名),MyBatis会自动将结果集封装为该类型的对象
这里表示查询结果会被封装成com.itheima.pojo.User类的对象集合
-->
<select id="findAll" resultType="com.itheima.pojo.User">
<!-- SQL语句:查询user表中的所有数据 -->
select id,username,age from user
</select>
</mapper>



5.2 XML映射文件-辅助配置
- 前面要求XML文件名称宇Mapper接口一直且放置在相同包下(同包同名)
- 我非要不放在同包同名怎么办?自己指定XML映射文件的位置
