黑马JAVAWeb-05 JDBC入门-预编译SQL-Mybatis入门-Mybatis日志输出-数据库连接池-增删改查-XML映射配置

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映射文件的位置
相关推荐
还算善良_2 小时前
XML签名
xml·java·开发语言
梅梅绵绵冰2 小时前
xml方式实现AOP
xml·java·开发语言
桦说编程3 小时前
Guava 迭代器增强类介绍
java·后端·设计模式
235163 小时前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
courtfu4 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
枫子有风4 小时前
Go语言流程控制
android·java·golang
小裕哥略帅4 小时前
订单管理--实时算出在途数量、收货数量、到货数量、已发货数量和未发货数量
java·开发语言
Dxxyyyy5 小时前
零基础学JAVA--Day27(注释+异常+异常处理方法)
java·开发语言
Craaaayon5 小时前
如何选择两种缓存更新策略(写缓存+异步写库;写数据库+异步更新缓存)
java·数据库·redis·后端·缓存·mybatis