myBatis

一. MyBatis 简介

(一) 什么是MyBatis?


(二) 持久层

  • 持久层负责将数据到保存到数据库的那一层代码
  • JavaEE 三层架构:表现层(前端代码)、业务层(后端业务代码)、持久层

(三) 框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

(四) JDBC 缺点

在这里插入图片描述


(五)MyBatis 简化

在这里插入图片描述
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作



二. MyBatis 快速入门

  • 步骤 查询 user 表中所有数据
    1. 创建 user 表,添加数据
CREATE DATABASE mybatis;  -- 创建一个数据库,名为mybatis
USE mybatis;  -- 使用 mybaits

DROP TABLE if EXISTS tb_user;  -- 若 tb_user 表存在,删除该表

-- 创建 tb_user 表
CREATE TABLE tb_user {
	id int PRIMARY KEY auto_increment,
	username VARCHAR(20),
	password VARCHAR(20),
	gender CHAR(1),
	addr VARCHAR(30)
);

-- 添加数据
INSERT INTO tb_user VALUES(1, '张三', '123', '男', '北京');
INSERT INTO tb_user VALUES(2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES(3, '王五', '11', '男', '西安');
    1. 创建模块,导入坐标
      1 )创建新项目
      2 )添加依赖
      在 pom.xml 配置文件中添加依赖
 <dependencies>
    <dependency>
<!--      junit 单元测试-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

<!--    mybatis 依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.0</version>
    </dependency>

<!--    mysql 驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>

<!--   添加slf4j日记api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.5.6</version>
    </dependency>

<!--    添加logback-class依赖-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

<!--    添加logback-core依赖-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
    1. 编写MyBatis核心配置文件 – > 替换连接信息,解决硬编码问题
      1 )新建 mybatis-config.xml核心配置文件
      在这里插入图片描述
      2 )编写mybatis-config.xml核心配置文件,替换连接信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                数据库的连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
    1. 编写SQL映射文件 – > 统一管理sq|语句,解决硬编码问题
      1 )新建UserMapper.xml映射文件
      在这里插入图片描述
      2 )编写UserMapper.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:名称空间
    id:sql语句的唯一标识
    resultType:返回结果类型
-->
<mapper namespace="test">
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>

映射文件取名讲究 表名Mapper.xml

    1. 编码
      1 )定义POJO类
      2 )加载核心配置文件,获取SqlSessionFactory对象
      3 )获取SqlSession对象,执行SQL语句
      4 )释放资源
      在这里插入图片描述

定义user类

package com.itheima.pojo;
// alt + 鼠标左键 整列编辑
public class User {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String addr;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

编写核心测试类 MyBatisDemo.java

package com.itheima;

import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        // 1. 加载mybatis 的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";	 // MyBatis核心配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


        // 2. 获取SqlSession 对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 3. 执行sql
        List<User> users = sqlSession.selectList("test.selectAll");   // 用空间名称和sql 语句的 id ,对sql语句进行辨别

        System.out.println(users);
        /* 
	        [User{id=1, username='张三', password='123', gender='男', addr='北京'}, 
	        User{id=2, username='李四', password='234', gender='女', addr='天津'}, 
        	User{id=3, username='王五', password='11', gender='男', addr='西安'}]
		*/
		
        // 4. 释放资源
        sqlSession.close();
    }
}



三. MyBatis 代理开发

目的:

  • 解决原生方式中的硬编码
  • 简化后期执行SQL

原来的:
在这里插入图片描述
代理开发:
在这里插入图片描述

  • 步骤 使用 Mapper 代理方式完成入门案例
    1. 定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一个目录下
      在这里插入图片描述

记得改mybatis 核心配置文件中的sql映射文件的路径
在这里插入图片描述

    1. 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名
      在这里插入图片描述
    1. 在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致
      在这里插入图片描述
    1. 编码
      1 )通过 SqlSessiion 的 getMapper 方法获取 Mapper 接口的代理对象
      2 )调用对应方法完成 sql 的执行
      在这里插入图片描述

细节:如果 Mapper 接口名称和 SQL 映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化 SQL 映射文件的加载
在这里插入图片描述



四. MyBatis 核心配置文件

  • 配置各个标签时,需要遵守前后顺序
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--  设置别名  -->
    <typeAliases>
        <package name="com.itheima.pojo"/>
    </typeAliases>
    
    <!--
    environments:配置数据库链接环境信息,可以配置多个environment,
    通过default属性切换不同都的environment
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                数据库的连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
<!--        <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
        <package name="com.itheima.mapper"/>

    </mappers>
</configuration>

自定义别名
1)myBatis 核心配置文件中设置别名
在这里插入图片描述
2)***Mapper.xml 文件中使用别名
在这里插入图片描述



五. 配置文件完成增删改查

在这里插入图片描述

MyBatisX 插件
在这里插入图片描述

MyBatisX是一款基于IDEA的快速开发插件,为效率而生。
主要功能:

  • XML 和 接口方法 相互跳转
  • 根据接口方法生成 statement
    在这里插入图片描述

1. 查询

1) 查询所有数据

在这里插入图片描述
在这里插入图片描述

(一) 实体类属性和数据库列名不一致

实体类属性和数据库表列名不一致,不能自动封装数据
在这里插入图片描述
1)起别名:在sql语句中,对不一样的列名起别名,别名和实体类属性名一样
在这里插入图片描述
2)resultMap:定义<resultMap>完成不一致的属性名和列名的映射
在这里插入图片描述

2) 查询详情

在这里插入图片描述
在这里插入图片描述

(二) 参数占位符

参数占位符

  1. #{}:会将其替换为?,为了防止SQL注入
    在这里插入图片描述
  2. ${}:拼sql,会存在SQL注入问题
    在这里插入图片描述
  3. 使用时机:
  • 参数传递的时候:#{}
  • 表名或列名不固定的情况下:${},会存在SQL注入问题
(三) 参数类型

参数类型:
在这里插入图片描述
parameterType 可以省略

(四) 特殊字符处理

特殊字符处理:

  1. 转义字符
    在这里插入图片描述
  2. CDATA
    <![CDATA[内容]]>
    在这里插入图片描述

3) 条件查询

(1) 查询-多条件查询

在这里插入图片描述 在这里插入图片描述

  • SQL语句设置多个参数的三种方式:

  • 1)散装参数需要使用 @Param("SQL参数占位符名称")
    在这里插入图片描述

  • 2)对象参数:只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
    在这里插入图片描述

  • 3)map集合参数:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
    在这里插入图片描述

<!--多条件查询-->
    <select id="selectByCondition0" resultMap="brandResultMap">
        select *
        from tb_brand
        where status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName};
    </select>
(2) 查询-多条件-动态条件查询
  • SQL语句会随着用户的输入或外部条件的变化而变化,我们称之为动态SQL*
    在这里插入图片描述
(五) 动态SQL查询

在这里插入图片描述

  • if:用于判断参数是否有值,使用test属性进行判断
    • 存在问题:第一个条件不需要逻辑运算符
    • 解决方案:
      1)使用恒等式让所有条件各式都一样
      在这里插入图片描述
      2)<where>标签替换where关键字
      在这里插入图片描述
<!--多条件动态查询-->
    <select id="selectByCondition1" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="companyName != null and companyName != ''">
                and company_name like #{companyName}
            </if>
            <if test="brandName != null and brandName != ''">
                and brand_name like #{brandName}
            </if>
        </where>
    </select>
(3) 查询-单条件-动态条件查询
  • 从多个条件中选择一个
  • choose(when, otherwise):选择,类似于Java中的switch
    在这里插入图片描述
    在这里插入图片描述
<!--单条件动态查询-->
    <select id="selectByCondition2" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <choose> <!--类似于 switch-->
                <when test="status != null"> <!--类似于 case-->
                    status = #{status}
                </when>
                <when test="companyName != null and companyName != ''">
                    company_name like #{companyName}
                </when>
                <when test="brandName != null and brandName != ''">
                    brand_name like #{brandName}
                </when>
            </choose>
        </where>
    </select>

2. 添加

1)添加

在这里插入图片描述

  • 实现
    在这里插入图片描述
 <!--添加  不返回主键-->
    <insert id="add">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    </insert>

2)添加-主键返回

在这里插入图片描述

  • 实现
    返回添加数据的主键
    <insert useGeneratedKeys="true" keyProperty="id">
    在这里插入图片描述
 <!--添加  返回主键-->
    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    </insert>

3. 修改

1) 修改全部字段

在这里插入图片描述

<!--修改全部字段-->
<update id="update">
        update tb_brand
        set brand_name = #{brandName},
            company_name = #{companyName},
            ordered = #{ordered},
            description = #{description},
            status = #{status}
        where id = #{id};
    </update>

2) 修改动态字段

在这里插入图片描述

<!--修改动态字段-->
<update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName != ''">
                company_name = #{companyName},
            </if>
            <if test="ordered != null">
                ordered = #{ordered},
            </if>
            <if test="description != null and description != ''">
                description = #{description},
            </if>
            <if test="status != null">
                status = #{status}
            </if>
        </set>
        where id = #{id};
    </update>

4. 删除

1) 删除一个

在这里插入图片描述

2) 批量删除

在这里插入图片描述

  • mybatis 会将数组参数,封装为一个Map集合。
    • 默认:array = 数组
      在这里插入图片描述
    • 使用 @Param 注解改变 map 集合的默认key 的名称
      在这里插入图片描述

在这里插入图片描述



六. 注解完成增删改查

  • 使用注解开发会比配置文件开发更加方便
    在这里插入图片描述

🔎使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好
用XML来映射语句。
🔎选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和XML的语句映射方式间自
由移植和切换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字小萌新♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值