前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Web(二)MyBatis

Java Web(二)MyBatis

作者头像
浅辄
发布2022-11-23 10:29:46
4340
发布2022-11-23 10:29:46
举报
文章被收录于专栏:Java+爬虫

MyBatis

一.MyBatis 简介
1.什么是 MyBatis
  • MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
  • MyBatis 本是 Apache 的一个开源项目 iBatis,2010 年这个项目由 apache softwarefoundation 迁移到了 google code,并且改名为 MyBatis。2013 年 11 月迁移到 Github
  • 官网:https://mybatis.org/mybatis-3/zh/index.html
2.持久层
  • 负责将数据到保存到数据的那一层代码
  • JavaEE 三层架构:表现层、业务层、持久层
3.框架
  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
二.MyBatis 简化
1.JDBC 缺点

1.硬编码

注册驱动,获取连接 SQL 语句

2.操作繁琐

手动设置参数手动封装结果集

代码语言:javascript
复制
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取Connection.连接
String url = "jdbc:mysql:///db1?useSSL=false";
String uname "root";
String pwd ="1234";
Connection conn = DriverManager.getConnection(url,uname,pwd);
∥接收输入的查询条件
String gender="男";
∥定义sql
String sql "select from tb_user where gender = ?";
∥获取pstmt对象
PreparedStatement pstmt =  conn.prepareStatement(sql);
∥设置?的值
pstmt.setString(1,gender);
∥执行sql
ResultSet rs = pstmt.executeQuery();
∥遍历Result,获取数据
User user = null;
ArrayList<User>users new ArrayList<>();
while (rs.next(){
∥获取数据
    int id rs.getInt("id");
    String username = rs.getString("username");
    String password = rs.getString("password");
    ∥创建对象,设置属性值
    user = new User();
    user.setld(id);
    user.setUsername(username);
    user.setPassword(password);
    user.setGender(gender);
    ∥装入集合
    users.add(user);
}

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作

三.MyBatis 快速入门
1.查询 user 表中所有数据

1.创建 user 表,添加数据

2.创建模块,导入坐标

3.编写小 yBatis 核心配置文件->替换连接信息解决硬编码问题

4.编写 SQL 映射文件->统一管理 sq 语句,解决硬编码问题

5.编码

代码语言:javascript
复制
    1.定义P0J0类
    2.加载核心配置文件,获取SqlSessionFactory对象
    3.获取SqlSession对象,执行SQL语句
    4.释放资源

代码语言:javascript
复制
create database mybatis;
use mybatis;

drop table if exists 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,'李四','345','女','上海');
insert into tb_user values(3,'王五','567','男','成都');

2.解决 SQL 映射文件的警告提示
  • 产生原因:Idea 和数据库没有建立连接,不识别表信息
  • 解决方式:在 ldea 中配置 MySQL 数据库连接
四.Mapper 代理开发
1.目的

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

代码语言:javascript
复制
        List<User> users = sqlSession.  selectList("test.selectAll");
        System.out.println(users);

代码语言:javascript
复制
         //3.获取接口代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //4.执行方法,其实就是执行sgL语句
        List<User>users = userMapper.selectAll();

2.使用 Mapper 代理方式完成入门案例

1.定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一目录下 2.设置 SQL 映射文件的 namespace)属性为 Mapper 接口全限定名 3.在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致 4.编码 ​ 4.1.通过 SqlSession 的 getMapper 方法获取 Mapper 接口的代理对象​ 4.2.调用对应方法完成 sq 的执行

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

五.MyBatis 核心配置文件
1.environments

配置数据库连接环境信息.可以配置多个 environment,通过不同的 default 属性切换不同的 environment

代码语言:javascript
复制
    <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:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

2.mappers
代码语言:javascript
复制
     </environments>
    <mappers>
        <!-- 加载sql映射文件 -->
        <mapper resource="com/gbx/mapper/UserMapper.xml"/>

        <!-- Mapper代理方式 -->
        <package name="com.gbx.mapper"/>
    </mappers>

3.typeAliases

类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。

代码语言:javascript
复制
    <typeAliases>
        <package name="com.gbx.pojo"/>
    </typeAliases>

六.MyBatis 完成 CURD

查询

  • 查询所有数据
  • 查看条件
  • 条件查询

添加

修改

  • 修改全部字段
  • 修改动态字段

删除

  • 删除一个
  • 批量删除
1.通过配置 xml 文件

1.1 准备环境

​ 数据库表 tb_ brand​ 实体类 Brand​ 测试用例​ 安装 MyBatisX:插件

代码语言:javascript
复制
#删除tb_brand表
drop table if exists tb_brand;
#创建tb_brand表
create table tb_brand
(
    #id  主键
    id  int primary key auto_increment,
    # 品牌名称
    brand_name  varchar(20),
    # 企业名称
    company_name  varchar(20),
    #排序字段
    ordered  int,
    # 描述信息
    description  varchar(100),
    #状态: 0 :禁用  1: 启动
    status int
);
insert into tb_brand(brand_name,company_name,ordered,description,status)
values('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
      ('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),
      ('小米','小米科技有限公司',50,'are you ok',1);
select * from tb_brand;

代码语言:javascript
复制
@Data
public class Brand {
    //id 主键
    private Integer id;
    //品牌名称
    private String brandName;
    //企业名称
    private String companyName;
    //排序字段
    private Integer ordered;
    //描述信息
    private String description;
    //状态:0:禁用1:启用
    private Integer status;
}

1.2MyBatisX

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

主要功能:

  • XML 和接口方法相互跳转
  • 根据接口方法生成 statement

1.3 查询

查询所有

1.编写接口方法:Mapper 接口

  • 参数:无
  • 结果:List<Brand>

2.编写 SQL 语句:SQL 映射文件:3.执行方法,测试

代码语言:javascript
复制
public interface BrandMapper {
    /**
     * 查询所有
     */
    public List<Brand> selectAll();
}

代码语言:javascript
复制
<?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:名称空间
-->
<mapper namespace="com.gbx.mapper.BrandMapper">
    <select id="selectAll" resultType="brand">
        select * from
        tb_brand;
    </select>
</mapper>

代码语言:javascript
复制
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();

    }
}

MyBatis 完成操作需要几步?三步:编写接口方法>>编写>>执行方法

实体类属性名和数据库表列名不一致,不能自动封装数据 1)起别名:在 SQL 语句中,对不一样的列名起别名,别名和实体类属性名一样可以定义<sql>片段,提升复用性 2)resultMap:定义<resultMap>完成不一致的属性名和列名的映射

代码语言:javascript
复制
<!--
    数据库表的字段名称  和  实体类的属性名称不一样,则不能自动封装数据
       *起别名: 对不一样的列名起别名,让别名和实体类的属性名一样
            *缺点:每次查询都要定义一次别名
        *解决办法:sql 片段
          缺点:不灵活
-->
<select id="selectAll" resultType="com.gbx.pojo.Brand">
    select id,brand_name as brandName,company_name as companyName,ordered,description,status
    from tb_brand;
</select>

代码语言:javascript
复制
<!--
  sql 片段
-->
<sql id="brand_column">
    id,brand_name as brandName,company_name as companyName,ordered,description,status
</sql>
<select id="selectAll" resultType="com.gbx.pojo.Brand">
    select 
        <include refid="brand_column"/>
    from tb_brand;
</select>

代码语言:javascript
复制
<!--
    数据库表的字段名称  和  实体类的属性名称不一样,则不能自动封装数据
    *resultMap:
        1.定义<resultMap>标签
        2.使用resultMap属性替换 resultType属性
-->
<!--
    id:唯一标识
    type:映射的类型,支持别名
 -->
<resultMap id="brandResultMap" type="brand">
    <!--
        id:完成主键的映射
            column:表的列名
            property:实体类的属性名
        result:完成一般字符的映射
     -->
    <result column="brand_name" property="brandName"/>
    <result column="company_name" property="companyName"/>
</resultMap>
<select id="selectAll" resultType="brandResultMap">
    select
    *
    from tb_brand;
</select>

查看详情

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

代码语言:javascript
复制
<!--
 *参数占位符:
            1.#{}:会将其替换成 ? .为了防止sql注入
            2.${}:拼sql 会存在sql注入问题
            3.使用时机:
                    *在参数传递的时候: #{}
                    *表明或者列名不固定的情况下:${}会存在sql注入问题
            *参数类型:parameterType:可以省略
            *特殊字符处理:
                    1.转义字符:
                    2.CDATA区
                    <I[CDATA[内容]>
 -->
<select id="selectById" parameterType="int" resultMap="brandResultMap">
    select * from tb_brand where id = #{id};
</select>

条件查询

1.多条件查询

1.编写接口方法:Mapper 接口

​ 参数:所有查询条件​ 结果:List<Brand>

2.编写 SQL 语句:SQL 映射文件 3.执行方法,测试

代码语言:javascript
复制
  List<Brand> selectByCondition(@Param("status")int status,@Param("companyName") String companyName,@Param("brandName")String brandName);

    <select id="selectByCondition" resultType="brandResultMap">
        select * from tb_brand
        where status = #{status} and company_name like #{companyName}
        and brand_name like #{brandName}
    </select>
        
    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        //处理参数
        companyName="%"+companyName+"%";
        brandName="%"+brandName+"%";
        //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, companyName, brandName);
        System.out.println(brands);
        //5.释放资源
        sqlSession.close();
    }

代码语言:javascript
复制
    List <Brand> selectByCondition(Brand brand);

    <select id="selectByCondition" resultType="brandResultMap">
        select * from tb_brand
        where status = #{status} and company_name like #{companyName}
        and brand_name like #{brandName}
    </select>
    
  @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        //处理参数
        companyName="%"+companyName+"%";
        brandName="%"+brandName+"%";

        //封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);
        //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(brand);
        System.out.println(brands);
        //5.释放资源
        sqlSession.close();
    }

代码语言:javascript
复制
     List <Brand> selectByCondition(Map map);

    <select id="selectByCondition" resultType="brandResultMap">
        select * from tb_brand
        where status = #{status} and company_name like #{companyName}
        and brand_name like #{brandName}
    </select>
    
    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        //处理参数
        companyName="%"+companyName+"%";
        brandName="%"+brandName+"%";

        //Map集合
        Map map = new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);
        //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(map);
        System.out.println(brands);
        //5.释放资源
        sqlSession.close();
    }

2.动态查询

SQL 语句会随着用户的输入或外部条件的变化而变化,我们称为动态 SQL

代码语言:javascript
复制
<select id="selectByCondition"resultMap="brandResultMap">
    select  *
    from tb_brand
    where
        if(status!=null)
                 status =#status)
      and company name like #{companyName}
      and brand name like #{brandName)
<select>

MyBatis 对动态 SQL 有很强大的支撑:

  • if
  • choose (when,otherwise)
  • trim (where,set)
  • foreach

2.1if 查询

代码语言:javascript
复制
    <!--
    动态条件查询
    *if:条件判断
      *test:逻辑表达式
    *问题:第一个条件不需要逻辑运算符
      *恒等式
      *<where>替换where关键字
    -->
    <select id="selectByCondition" resultType="brandResultMap">
        select * from tb_brand
        where
        <if test="status!=null">
            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>
    </select>

2.2choose(when,otherwise)查询

从多个条件中选择个.

类似于 Java 中的 switch 语句

代码语言:javascript
复制
<select id="selectByConditionSingle"resultMap="brandResultMap">
    select
    from tb_brand
    where
    <choose><!-类似于switch->
        <when test=:"status=nul"><!-类似于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>
        <otherwise><I-类似于default->
            1=1
        </otherwise>
  </choose>
</select>

3.添加

1.编写接口方法:Mapper 接口

  • 参数:除了 id 之外的所有数据
  • 结果:void

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

3.执行方法,测试

MyBatis 事务:

  • openSession0:默认开启事务,进行增删改操作后需要使用 sqlSession.commit0;手动提交事务
  • openSession(true):可以设置为自动提交事务(关闭事务)
代码语言:javascript
复制
  /**
   * 添加
   */
  void add(Brand brand);

代码语言:javascript
复制
   <insert id="add">
    insert into tb_brand (brand_name,company_name,ordered,description,status)
    values (#{brandName},#{companyName},#{ordered},#{description},#{status});
  </insert>

代码语言:javascript
复制
<insert id="add">
    insert into tb_brand (brand_name,company_name,ordered,description,status)    
    values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>

代码语言:javascript
复制
     @Test
    public void testAdd() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "菠萝手机";
        String brandName = "菠萝";
        String description = "菠萝手机,手机中的战斗机";
        int ordered = 100;
    
    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    brand.setCompanyName(companyName);
    brand.setBrandName(brandName);
    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();
        //方式二  自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        brandMapper.add(brand);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

3.1 主键返回

在数据添加成功后,需要获取插入数据库数据的主键的值

  • 比如:添加订单和订单项

1.添加订单

2.添加订单项,订单项中需要设置所属订单的 id

代码语言:javascript
复制
<insert id="add" useGeneratedKey="true" keyProperty="id">
    insert into tb_brand (brand_name,company_name,ordered,description,status)    
    values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>

代码语言:javascript
复制
    @Test
    public void testAdd2() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "菠萝手机";
        String brandName = "菠萝";
        String description = "菠萝手机,手机中的战斗机";
        int ordered = 100;
    
    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    brand.setCompanyName(companyName);
    brand.setBrandName(brandName);
    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();
        //方式二  自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        brandMapper.add(brand);
        Integer id = brand.getId();
        System.out.println(id);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

返回添加数据的主键<insert useGeneratedKeys="true"keyProperty="id">

4.修改

4.1 修改全部字段

1.编写接口方法:Mapper 接口

  • 参数:所有数据
  • 结果:void

2.编写 SQL 语句:SQL 映射文件 3.执行方法,测试

代码语言:javascript
复制
  /**
     * 修改
     */
  
  int update(Brand brand);

代码语言:javascript
复制
<update id="update">
  update tb_brand
    set 
    brand_name=#{brandName},
    company_name=#{companyName},
    ordered=#{brandName},
    description=#{description},
    status=#{status}
    where id = #{id};
</update>

代码语言:javascript
复制
     @Test
    public void testUpdate() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "菠萝手机";
        String brandName = "菠萝";
        String description = "手机中的战斗机";
        int ordered = 200;
        int id = 5;
    
    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    brand.setCompanyName(companyName);
    brand.setBrandName(brandName);
    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();
        //方式二  自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        int count = brandMapper.update(brand);
        System.out.println(count);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

4.2 修改动态字段

1.编写接口方法:Mapper 接口

  • 参数:部分数据,封装到对象中
  • 结果:void

2.编写 SQL 语句:SQL 映射文件 3.执行方法,测试

代码语言:javascript
复制
<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=#{fordered},
        </if>
        <if test="description !=null and description !=''>
            description=#{description},
        </if>
        <if test="status !=null>
            status=#{status}
        </if>
    </set>
    where id #{id};
</update>

5.删除

5.1 删除一个

1.编写接口方法:Mapper 接口

  • 参数:id
  • 结果:void

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

3.执行方法,测试

代码语言:javascript
复制
  void deleteById(int id);

代码语言:javascript
复制
<delete id="deleteById">
  delete from tb_brand where id = #{id};
</delete>

代码语言:javascript
复制
     @Test
    public void testDeleteById() throws IOException {
        //接收参数
        int id = 6;

        //1.获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象
        //方式一
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //方式二  自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        brandMapper.deleteById(id);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

5.2 批量删除

1.编写接口方法:Mapper 接口

  • 参数:id 数组
  • 结果:void

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

3.执行方法,测试

代码语言:javascript
复制
void deleteByIds(@Param("ids")int[]ids);

mybatis 会将数组参数,封装为一个 Map 集合。*默认:array=数组

​ *使用 @Param 注解改变 map 集合的默认 key 的名称

代码语言:javascript
复制
<delete id="deleteByIds">
  delete from tb_brand where id 
  in
    <foreach collection="array" separator="," open="(" close=")">
      #{id}
    </foreach>
  ;
</delete>

代码语言:javascript
复制
    @Test
    public void testDeleteByIds() throws IOException {
        //接收参数
        int ids = {5,7,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();
        //方式二  自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //3.获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        brandMapper.deleteByIds(ids);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

6.MyBatis 参数传递

MyBatis 接口方法中可以接收各种各样的参数,MyBatis 底层对于这些参数进行不同的封装处理方式

  • 单个参数:
  • 1.POO 类型:直接使用,属性名和参数占位符名称一致 2.Map 集合:直接使用,键名和参数占位符名称一到 3.Collection:封装为 Map 集合
  • ​ map.put("arg0",collection 集合);​ map.put("collection",collection 集合);
  • 4.List:封装为 Map 集合
  • ​ map.put("arg0",List 集合):​ map.put("collection",List 集合);​ map.put("List",List 集合);
  • 5.Array:封装为 Map 集合
  • ​ map.put("argo",数组);​ map.put("array",数组);
  • 6.其他类型:直接使用
  • 多个参数:封装为 Map 集合
  • map.put("arg0",参数值 1)
  • map.put("param1",参数值 1)
  • map.put("param2",参数值 2)
  • map.put("arg1",参数值 2)

MyBatisj 提供了 ParamNameResolver 类来进行参数封装

代码语言:javascript
复制
User select(String username,String password);

代码语言:javascript
复制
<select id="select"resultType="user">
    select *
    from tb_user
    where
      username = #{arg0}
    and password = #{arg1}
</select>

7.通过注解开发

使用注解开发会比配置文件开发更加方便

代码语言:javascript
复制
@Select("select from tb_user where id =#{id}")
public User seectByld(int id);

  • 查询:@Select
  • 添加:@Insert
  • 修改:@Update
  • 删除:@Delete

提示:注解完成简单功能配置文件完成复杂功能

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MyBatis
    • 一.MyBatis 简介
      • 1.什么是 MyBatis
      • 2.持久层
      • 3.框架
    • 二.MyBatis 简化
      • 1.JDBC 缺点
    • 三.MyBatis 快速入门
      • 1.查询 user 表中所有数据
      • 2.解决 SQL 映射文件的警告提示
    • 四.Mapper 代理开发
      • 1.目的
      • 2.使用 Mapper 代理方式完成入门案例
    • 五.MyBatis 核心配置文件
      • 1.environments
      • 2.mappers
    • 六.MyBatis 完成 CURD
      • 1.通过配置 xml 文件
      • 2.动态查询
      • 3.添加
      • 4.修改
      • 5.删除
      • 6.MyBatis 参数传递
      • 7.通过注解开发
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档