黑马JAVAWeb-05 JDBC入门-预编译SQL-Mybatis入门-Mybatis日志输出-数据库连接池-增删改查-XML映射配置
1.JDBC 是数据库连接的底层基础-是不同的数据的规范
- JDBC生产环境基本不用

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

- JDBC入门

- 建库建表
-- 创建数据库
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),
- 准备依赖
<!-- 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>
-案例代码
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入门程序*/@Testpublic 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对象
<!-- 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
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实体类
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接口
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
#配置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文件的头信息到官网获取


<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1. XML文档声明:指定版本为1.0,编码格式为UTF-82. DOCTYPE约束:定义当前XML是MyBatis的Mapper配置文件,遵循MyBatis 3.0的DTD规范3. 约束地址用于验证XML标签的合法性(https://mybatis.org/dtd/mybatis-3-mapper.dtd)
-->
<!DOCTYPE mapperPUBLIC "-//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映射文件的位置

