MyBatis核心配置文件

直接看案例xml文件

:::info mybatis-config.xml 中的enviroment :::

  1. <!--
  2. environments:配置数据库连接环境信息,可以配置多个enviroment,通过default属性切换不同的
  3. -->
  4. <environments default="development">
  5. <environment id="development">
  6. <transactionManager type="JDBC"/>
  7. <dataSource type="POOLED">
  8. <!--数据库连接信息-->
  9. <property name="driver" value="com.mysql.jdbc.Driver"/>
  10. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
  11. <property name="username" value="root"/>
  12. <property name="password" value="12345"/>
  13. </dataSource>
  14. </environment>
  15. <environment id="development">
  16. <transactionManager type="JDBC"/>
  17. <dataSource type="POOLED">
  18. <!--数据库连接信息-->
  19. <property name="driver" value="com.mysql.jdbc.Driver"/>
  20. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
  21. <property name="username" value="root"/>
  22. <property name="password" value="12345"/>
  23. </dataSource>
  24. </environment>
  25. </environments>

别名方式配置(包扫描)

  1. <typeAliases>
  2. <package name="com.taotao.pojo"/>
  3. </typeAliases>

:::info 写完后我们可以在resultType里面直接传入类,比如“user” :::

改之前

:::info Tb_userMapper.xml :::

  1. <!--statement-->
  2. <select id="selectAll" resultType="com.taotao.pojo.Tb_user">
  3. select * from tb_user;
  4. </select>

用别名方式后

:::info Tb_userMapper.xml :::

  1. <!--statement-->
  2. <select id="selectAll" resultType="user">
  3. select * from tb_user;
  4. </select>

配置文件完成增删改查

准备环境

数据库表tb_brand

:::info 在mybatis数据库中创建 :::

  1. drop table if exists tb_brand;
  2. create table tb_brand
  3. (
  4. id int primary key auto_increment,
  5. brand_name varchar(20),
  6. company_name varchar(20),
  7. ordered int,
  8. description varchar(100),
  9. status int
  10. );
  11. insert into tb_brand (brand_name,company_name,ordered,description,status)
  12. values('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
  13. ('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人,每个家庭,每个组织,构建万物互联的智能世界',1),
  14. ('小米','小米科技有限公司',50,'are you ok',1);
  15. select * from tb_brand;

实体类Brand

:::info 我们在pojo包下新建Brand实体类 :::

  1. package com.taotao.pojo;
  2. public class Brand {
  3. private Integer id;
  4. private String brand_name;
  5. private String company_name;
  6. private Integer ordered;
  7. private String description;
  8. private Integer status;
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getBrand_name() {
  16. return brand_name;
  17. }
  18. public void setBrand_name(String brand_name) {
  19. this.brand_name = brand_name;
  20. }
  21. public String getCompany_name() {
  22. return company_name;
  23. }
  24. public void setCompany_name(String company_name) {
  25. this.company_name = company_name;
  26. }
  27. public Integer getOrdered() {
  28. return ordered;
  29. }
  30. public void setOrdered(Integer ordered) {
  31. this.ordered = ordered;
  32. }
  33. public String getDescription() {
  34. return description;
  35. }
  36. public void setDescription(String description) {
  37. this.description = description;
  38. }
  39. public Integer getStatus() {
  40. return status;
  41. }
  42. public void setStatus(Integer status) {
  43. this.status = status;
  44. }
  45. @Override
  46. public String toString() {
  47. return "Brand{" +
  48. "id=" + id +
  49. ", brand_name='" + brand_name + '\'' +
  50. ", company_name='" + company_name + '\'' +
  51. ", ordered=" + ordered +
  52. ", description='" + description + '\'' +
  53. ", status=" + status +
  54. '}';
  55. }
  56. }

测试用例

:::info 我们在maven项目test目录下的java目录下创建测试包 ::: image.png
image.png

安装MyBatisX插件

插件介绍

  • MybatisX是一款基于 IDEA的快速开发插件,为效率而生
  • 主要功能
  1. XML 和 接口方法 相互跳转
  2. 根据接口方法生成 statement

image.png

举例

image.png
image.png

使用方法(点击鸟跳转)

image.png

一.查询

查询所有数据

  1. 编写接口方法:Mapper接口
  • 参数:无
  • 结果:List< brand >
  1. 编写SQL语句:SQL映射文件
  2. 执行方法,测试

    编写接口方法

    ```java package com.taotao.mapper;

import com.taotao.pojo.Brand;

import java.util.List;

@SuppressWarnings({“all”}) public interface BrandMapper { /**

 * * 查询所有
 */
public List<Brand> selectAll();

}

<a name="IiMXV"></a>
#### 编写BrandMapper.xml
```java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">

</mapper>

image.png
image.png
image.png :::info 写到这里我们可以刷新连接下数据库,为了方便提示信息 ::: image.png :::info 出现提示,我们继续往下走(需要设置setting-sql dialects) ::: image.png :::info 我们编写test包里的MyBatisTest :::

package com.taotao.test;

import com.taotao.mapper.BrandMapper;
import com.taotao.pojo.Brand;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest {
    @Test
    public void testSelectAll() throws IOException {
        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        List<Brand> brands = brandMapper.selectAll();
        System.out.println(brands);

        //5.释放资源
        sqlSession.close();
    }
}

:::info 我们更改加载sql文件映射 ::: image.png

运行成功

image.png

起别名

:::info 起别名:对不一样的列名起别名,让别名和实体类的属性名一样 ::: :::info 快捷录入 ::: image.png

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">
<!--
   数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
   *起别名:对不一样的列名起别名,让别名和实体类的属性名一样
   *缺点:每次查询都要定义一次别名
   -->
    <select id="selectAll" resultType="brand">
        select id, brand_name as brandName, company_name as companyName,
               ordered, description, status
        from tb_brand;
    </select>

</mapper>

sql片段

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">
<!--
   数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
   *起别名:对不一样的列名起别名,让别名和实体类的属性名一样
   *缺点:每次查询都要定义一次别名
   -->

<!--  sql片段  -->
    <sql id="brand_column">
        id, brand_name as brandName, company_name as companyName,
               ordered, description, status
    </sql>
    <select id="selectAll" resultType="brand">
        select <include refid="brand_column"/>
        from tb_brand;
    </select>

</mapper>

:::info 我们把表的字段名从新改下,以驼峰法命名 ::: :::info alter table 表名 change 旧字段名 新字段名 字段类型 ::: image.png :::info 我们的数据库名要与实体类名不一致的话就用as,强制一致 :::

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">
<!--
   数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
   *起别名:对不一样的列名起别名,让别名和实体类的属性名一样
   *缺点:每次查询都要定义一次别名
   -->

<!--  sql片段  -->
    <sql id="brand_column">
        id, brandName as brand_name, companyName as company_name, ordered, description, status
    </sql>
    <select id="selectAll" resultType="brand">
        select <include refid="brand_column"></include>
        from tb_brand;
    </select>

</mapper>

运行成功

image.png

resultMap的案例使用

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">
<!--
   数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
   *起别名:对不一样的列名起别名,让别名和实体类的属性名一样
   *缺点:每次查询都要定义一次别名
        *sql片段
            *缺点:不灵活

        *resultMap
            1.定义<resultMap>标签
            2.在<select>使用resultMap属性替换 resultType属性
   -->
    <resultMap id="brandResultMap" type="brand">
        <result column="brandName" property="brand_name"></result>
        <result column="companyName" property="company_name"></result>
    </resultMap>

    <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名

        result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
    -->

    <select id="selectAll" resultMap="brandResultMap">
        select
        *
        from tb_brand;
    </select>

</mapper>

查看详情

  1. 编写接口方法:Mapper接口
    • 参数:id
    • 结果:Brand
  2. 编写SQL语句:SQL映射文件
  3. 执行方法,测试

    编写接口方法

    ```java package com.taotao.mapper;

import com.taotao.pojo.Brand;

import java.util.List;

@SuppressWarnings({“all”}) public interface BrandMapper { /**

 * * 查询所有
 */
public List<Brand> selectAll();

/**
 * 查看详情,根据id查询
 *
 */
Brand selectById(int id);

}

<a name="MGkU2"></a>
#### 编写BrandMapper.xml
```java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--namespace:名称空间-->
<!--statement-->
<mapper namespace="com.taotao.mapper.BrandMapper">
<!--
   数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据
   *起别名:对不一样的列名起别名,让别名和实体类的属性名一样
   *缺点:每次查询都要定义一次别名
        *sql片段
            *缺点:不灵活

        *resultMap
            1.定义<resultMap>标签
            2.在<select>使用resultMap属性替换 resultType属性
   -->
    <resultMap id="brandResultMap" type="brand">
        <result column="brandName" property="brand_name"></result>
        <result column="companyName" property="company_name"></result>
    </resultMap>

    <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名

        result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
    -->

    <select id="selectAll" resultMap="brandResultMap">
        select
        *
        from tb_brand;
    </select>

    <select id="selectById" resultMap="brandResultMap">   
    select *
    from tb_brand where id = #{id};
    </select>

</mapper>

编写测试方法MyBatisTest.java

    public void testSelectById() throws IOException {
        //接收参数
        int id = 1;

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        Brand brand = brandMapper.selectById(id);
        System.out.println(brand);

        //5.释放资源
        sqlSession.close();
    }

运行测试

image.png

sql参数占位符

:::info 参数占位符:
1.#{}:会将其替换为?,为了防止SQL注入
2.KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 36: ….使用时机
参数传递的时候:#̲{} *表名或者列名不固定的…{} 会存在SQL注入问题 :::

sql特殊字符处理

:::info *特殊字符处理:
比如小于号 < 就不能使用,因为是xml文件,所以编译器认为 < 是括号<>
1.转义字符 (比如 < 号的转义字符为 <)
2.COATA区 (输入CD) :::

    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where id <![CDATA[
        <
        ]]>  #{id};

parameterType

:::info 用于设置参数类型,该参数可以省略 :::

条件查询

:::info 这篇我们只演示“散装参数”的方式 ::: image.png

  1. 编写接口方法:Mapper接口 :::info 参数:所有查询条件
    结果:List< Brand > :::

  2. 编写SQL语句:SQL映射文件

  3. 执行方法,测试

    编写sql语句

    :::info 编写BrandMapper.xml ::: ```java
<a name="U6yh6"></a>
#### 编写接口方法
:::info
编写BrandMapper.java
:::
```java
    /**
     * 条件查询
     *  *参数接收
     *          1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称")
     *          2.对象参数
     *          3.map集合参数
     * @param status
     * @param company_name
     * @param brand_name
     * @return
     */
    List<Brand> selectByCondition(@Param("status") int status,@Param("company_name") String company_name,@Param("brand_name") String brand_name);

    //这里是第二种方法,不再演示
    List<Brand> selectByCondition(Brand brand);

    //这里是第三种方法,不再演示
    List<Brand> selectByCondition(Map map);

编写测试方法

:::info 编写MyBatisTest.java :::

    @Test
    public void testSelectByCondtion() throws IOException {
        //接收参数
        int status = 1;
        String company_name = "华为";
        String brand_name = "华为";

        //处理参数
        company_name = company_name + "%";
        brand_name = brand_name + "%";


        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        List<Brand> brands = brandMapper.selectByCondition(status, company_name, brand_name);
        System.out.println(brands);

        //5.释放资源
        sqlSession.close();
    }

查询结果

image.png

多条件-动态条件查询

  • MyBatis 对动态SQL有很强大的支撑 :::info if
    choose(when,otherwise)
    trim(where,set)
    foreach :::

  • 目的是因为一个条件或多个条件

    改造SQL语句

    ```java

<a name="SXksv"></a>
#### 恒等式语法1
```java
    <!--    动态条件查询
                *if:条件判断
                    *test:逻辑表达式
                *问题:
                    *恒等式
    -->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where
        1 = 1
        <if test="status != null">
            and status = #{status}
        </if>
        <if test="company_name != null and company_name != '' ">
            and companyName like #{company_name}
        </if>

        <if test="brand_name != null and brand_name != '' ">
            and brandName like #{brand_name}
        </if>

    </select>

恒等式语法2(where标签)

    <!--    动态条件查询
                *if:条件判断
                    *test:逻辑表达式
                *问题:
                    *恒等式
    -->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
        <if test="status != null">
            and status = #{status}
        </if>
        <if test="company_name != null and company_name != '' ">
            and companyName like #{company_name}
        </if>

        <if test="brand_name != null and brand_name != '' ">
            and brandName like #{brand_name}
        </if>
        </where>
    </select>

单条件查询

编写接口方法

    /**
     * 单条件动态查询
     * @param brand
     * @return
     */
    List<Brand> selectByConditionSingle(Brand brand);

生成statement

:::info 直接alt + enter ::: image.png
image.png

编写sql语句

:::info 编写BrandMapper.xml :::

    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        where
        <choose>    <!--相当于switch-->
            <when test="status !=null">    <!--相当于case-->
                status = #{status}
            </when>

            <when test="company_name != null and company_name != ''">    <!--相当于case-->
                and companyName like #{company_name}
            </when>

            <when test="brand_name != null and brand_name != ''">    <!--相当于case-->
                and brandName like #{brand_name}
            </when>
        </choose>
    </select>

编写测试方法

:::info 编写MyBatisTest.java :::

     @Test
    public void testSelectByCondtionSingle() throws IOException {
        //接收参数
        int status = 1;
        String company_name = "华为";
        String brand_name = "华为";

        //处理参数
        company_name = company_name + "%";
        brand_name = brand_name + "%";

        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompany_name(company_name);
        brand.setBrand_name(brand_name);

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        List<Brand> brands = brandMapper.selectByConditionSingle(brand);
        System.out.println(brands);

        //5.释放资源
        sqlSession.close();
    }

查询结果

image.png

遇到问题

:::info 如果用户连一个条件也不传入,那么执行就会报错 ::: 解决方案 :::info otherwise :::

编写sql语句1
    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        where
        <choose>    <!--相当于switch-->
            <when test="status !=null">    <!--相当于case-->
                status = #{status}
            </when>

            <when test="company_name != null and company_name != ''">    <!--相当于case-->
                and companyName like #{company_name}
            </when>

            <when test="brand_name != null and brand_name != ''">    <!--相当于case-->
                and brandName like #{brand_name}
            </when>
            <otherwise>
            1 = 1
            </otherwise>
        </choose>
    </select>

编写sql语句2
    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <choose>    <!--相当于switch-->
                <when test="status !=null">    <!--相当于case-->
                    status = #{status}
                </when>

                <when test="company_name != null and company_name != ''">    <!--相当于case-->
                    and companyName like #{company_name}
                </when>

                <when test="brand_name != null and brand_name != ''">    <!--相当于case-->
                    and brandName like #{brand_name}
                </when>

            </choose>
        </where>
    </select>

查询结果

image.png

二.添加

  1. 编写接口方法:Mapper接口 :::info 参数:除了id之外的所有数据
    结果:void :::

  2. 编写SQL语句:SQL映射文件

  3. 执行方法,测试

    编写接口方法

    :::info 编写BrandMapper.java ::: ```java /**
    • 添加 */ void add(Brand brand);
<a name="DtpZy"></a>
#### 编写sql语句
:::info
编写BrandMapper.xml
:::
:::info
插件生成statement
:::
![image.png](https://cdn.nlark.com/yuque/0/2022/png/26639306/1657492087655-787f5f9b-c8f1-4d2b-b163-851267dbd761.png#clientId=u436ca85b-07b4-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uc21d5996&margin=%5Bobject%20Object%5D&name=image.png&originHeight=769&originWidth=1307&originalType=url&ratio=1&rotation=0&showTitle=false&size=131249&status=done&style=none&taskId=u29e350c6-d7ce-4a60-9370-741b333be0f&title=)
```java
    <insert id="add">
        insert into tb_brand(brandName, companyName, ordered, description, status)
        values(#{brand_name}, #{company_name}, #{ordered}, #{description}, #{status});
    </insert>

编写测试方法

:::info 编写MybatisTest.java :::

   @Test
    public void testAdd() throws IOException {
        //接收参数
        int status = 1;
        String company_name = "波导手机";
        String brand_name = "博导";
        String description = "手机中的战斗机";
        int ordered = 200;

        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompany_name(company_name);
        brand.setBrand_name(brand_name);
        brand.setDescription(description);
        brand.setOrdered(ordered);


        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        brandMapper.add(brand);

        //5.提交事务
        sqlSession.commit();
        System.out.println("提交成功");

        //6.释放资源
        sqlSession.close();
    }

是否自动提交事务

  • MyBatis事务 :::info openSession():默认开启事务,进行增删改操作后需要使用sqlSession.commit();手动提交事务
    openSeesion(true):可以设置为自动提交事务(关闭事务) :::

    添加 - 主键返回

  • 在数据添加成功后,需要获取插入数据库数据的主键的值 :::info 比如:添加订单和订单项 :::

  1. 添加订单
  2. 添加订单项,订单项中需要设置所属订单的id ```java
<a name="SVtwP"></a>
#### 更改sql语句
```java
    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand(brandName, companyName, ordered, description, status)
        values(#{brand_name}, #{company_name}, #{ordered}, #{description}, #{status});
    </insert>

编写测试方法

@Test
public void testAdd2() throws IOException {
    //接收参数
    int status = 1;
    String company_name = "波导手机";
    String brand_name = "博导";
    String description = "手机中的战斗机";
    int ordered = 200;

    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    brand.setCompany_name(company_name);
    brand.setBrand_name(brand_name);
    brand.setDescription(description);
    brand.setOrdered(ordered);


    //1.获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //2.获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //3.获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

    //4.执行方法

    brandMapper.add(brand);
    Integer id = brand.getId();
    System.out.println(id);

    //5.提交事务
    sqlSession.commit();

    //6.释放资源
    sqlSession.close();
}

输出结果

image.png

三.修改

修改全部字段

编写接口方法

:::info 编写BrandMapper.java :::

    /**
     * 更新
     */
    int update(Brand brand);

编写sql语句

:::info 编写BrandMapper.xml :::

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

编写测试方法

:::info 编写MyBatisTest.java :::

    @Test
    public void testUpdate() throws IOException {
        //接收参数
        int status = 1;
        String company_name = "波导手机";
        String brand_name = "博导";
        String description = "手机中的战斗机2";
        int ordered = 400;
        int id = 6;     //修改id为6的数据

        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompany_name(company_name);
        brand.setBrand_name(brand_name);
        brand.setDescription(description);
        brand.setOrdered(ordered);
        brand.setId(id);


        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法

        int count = brandMapper.update(brand); //返回受影响的行数
        System.out.println(count);

        //5.提交事务
        sqlSession.commit();

        //6.释放资源
        sqlSession.close();
    }

查询结果

image.png

修改动态字段

编写sql语句

    <update id="update">
        update tb_brand
        <set>
            <if test="brand_name != null and brand_name != ''">
                brandName = #{brand_name},
            </if>

            <if test="company_name != null and company_name != ''">
                companyName = #{company_name},
            </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>

更改测试方法

:::info 编写MyBatisTest.java
把id = 6的数据的status字段改为 50 :::

    @Test
    public void testUpdate() throws IOException {
        //接收参数
        int status = 50;
        String company_name = "波导手机";
        String brand_name = "博导";
        String description = "手机中的战斗机2";
        int ordered = 400;
        int id = 6;     //修改id为6的数据

        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
//        brand.setCompany_name(company_name);
//        brand.setBrand_name(brand_name);
//        brand.setDescription(description);
//        brand.setOrdered(ordered);
        brand.setId(id);

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法

        int count = brandMapper.update(brand); //返回受影响的行数
        System.out.println(count);

        //5.提交事务
        sqlSession.commit();

        //6.释放资源
        sqlSession.close();
    }

修改结果

image.png

四.删除

删除一个

  1. 编写接口方法:Mapper接口 :::info 参数:id
    结果:void :::

  2. 编写SQL语句:SQL映射文件

  3. 执行方法:测试

    编写接口方法

    ```java /**
    • 根据id删除 */ void deleteById(int id);
<a name="Io5Mb"></a>
#### 编写sql语句
:::info
编写BrandMapper.xml
:::
```java
<!--
  删除
-->
    <delete id="deleteById">
             delete from tb_brand where id = #{id};
    </delete>

编写测试方法

:::info 编写MyBatisTest.java :::

    @Test
    public void testDeleteById() throws IOException {
        //接收参数
        int id = 8;

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        brandMapper.deleteById(id);

        //5.提交事务
        sqlSession.commit();

        //6.释放资源
        sqlSession.close();
    }

删除结果

image.png

批量删除

  1. 编写接口方法:Mapper接口 :::info 参数:id数组
    结果:void :::

  2. 编写SQL语句:SQL映射文件

  3. 执行方法,测试

    编写接口方法

    :::info 编写BrandMapper.java ::: ```java /**

    • 批量删除 */

      void deleteByIds(@Param(“ids”) int[] ids); //@Param(“ids”)将map.key“id”变为ids

<a name="sNOPv"></a>
#### 编写sql语句
:::info
编写BrandMapper.xml
:::
```java
<!--
    mybatis会将数组参数,封装为一个Map集合,
           *默认:array = 数组
           *使用@Param注解改变map集合的默认key的名称

-->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in (
        <foreach collection="ids" item="id" separator=",">    # separator分隔符
            #{id}
        </foreach>
         );
    </delete>

编写测试方法

:::info 编写MyBatisTest.java :::

@Test
    public void testDeleteByIds() throws IOException {
        //接收参数
        int []ids = {6,7};

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        brandMapper.deleteByIds(ids);

        //5.提交事务
        sqlSession.commit();

        //6.释放资源
        sqlSession.close();
    }

删除结果

image.png