MyBatis(全)

news2025/2/12 0:50:47

文章目录

    • 什么是MyBatis?
    • MyBatis快速入门
      • 查询user表中所有数据
    • Mapper代理开发
      • 使用Mapper代理方式完成入门案例
    • MyBatis核心配置文件
    • 配置文件完成增删改查
      • 案例:完成品牌数据的增删改查操作
        • 准备环境
        • 查询-查询所有数据
        • 查询-查看详情
        • 查询-条件查询--1.多条件查询
          • 方法1:参数接收-- 散装参数
          • 方法2:参数接收-- 对象参数
          • 方法3:参数接收-- map集合参数
        • 查询-条件查询--2.多条件-动态条件查询(动态SQL)
        • 查询-条件查询--3.单条件-动态条件查询
    • 动态SQL

什么是MyBatis?

  • MyBatis 是一款优秀的持久层框架,用于简化JDBC 开发

JDBC的缺点?

  • 硬编码 - MyBatis解决方法 --> 写入配置文件
    • 注册驱动,获取连接
    • SQL语句
  • 操作繁琐 --MyBatis解决方法 --> 自动完成
    • 手动设置参数
    • 手动封装结果集

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

 

MyBatis快速入门

查询user表中所有数据

  • 1.创建user表,添加数据
  • 2.创建模块,导入坐标
  • 3.编写MyBatis核心配置文件 --> 替换连接信息,解决硬编码问题
  • 4.编写SQL映射文件 --> 统一管理sql语句,解决硬编码问题
  • 5.编码
    • 1.定义POJO类
    • 2.加载核心配置文件,获取SqlSessionFactory对象
    • 3.获取SqlSession对象,执行SQL语句
    • 4.释放资源

 

步骤1:创建user表,添加数据

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, 'zhangsan', '123', '', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

步骤2:创建模块,导入坐标

	<dependencies>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>        
        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依赖 -->
        <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>

将下面的logback.xml放在src–>main–>resources下

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="com.itheima" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>


    <!--

      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
     , 默认debug
      <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
      -->
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

步骤3:编写MyBatis核心配置文件 --> 替换连接信息,解决硬编码问题
在src–>main–>resources下创建一个新的文件mybatis-config.xml
从mybatis官网粘贴过来如下,修改deiver,url,username,password

<?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:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件-->
        <mapper resource="xxx.xml"/>
    </mappers>
</configuration>

步骤4:编写SQL映射文件 --> 统一管理sql语句,解决硬编码问题
在src–>main–>resources下创建UserMapper.xml
修改 namespacetest
创建 com.itheima.pojo.User
修改 select id="selectAll" resultType="com.itheima.pojo.User"

<?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="test">
	<!--statement-->
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>
package com.itheima.pojo;

public class User {
}

修改mybatis-config.xml

	<mappers>
        <!--加载sql映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>

步骤5:编码

  • 1.定义POJO类
package com.itheima.pojo;

public class User {

    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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 + '\'' +
                '}';
    }
}
  • 2.加载核心配置文件,获取SqlSessionFactory对象
  • 3.获取SqlSession对象,执行SQL语句
  • 4.释放资源
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;

/**
 * Mybatis快速入门代码
 */
public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        //2。加载mybatis的核心配置文件,获取SqlSessionFactory (官网复制)
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //3。获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行SQL语句
        List<User> users = .selectList("test.selectAll");
        System.out.println(users);
        
        //4。释放资源
        sqlSession.close();
    }
}

输出:

[User{id=1, username='zhangsan', password='123', gender='男', addr='北京'}, 
User{id=2, username='李四', password='234', gender='女', addr='天津'}, 
User{id=3, username='王五', password='11', gender='男', addr='西安'}]

 

Mapper代理开发

存在的问题:硬编码

//执行SQL语句
List<User> users = sqlSession.selectList("test.selectAll");

Mapper代理的目的:

  • 解决原生方式中的硬编码
  • 简化后期执行SQL
//获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用对应方法完成sql的执行
List<User> users = userMapper.selectAll();

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

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

 
步骤1:定义与SQL映射文件同名的Mapper接口,并将Mapper接口和SQL映射文件放置在同一目录下

package com.itheima.mapper;

public interface UserMapper {
}

在resources下创建同级的mapper,存放UserMapper.xml
在这里插入图片描述

整体如下:
在这里插入图片描述

步骤 2:设置SQL映射文件的namespace属性为Mapper接口全限定名
UserMapper.xml

<mapper namespace="com.itheima.mapper.UserMapper">

步骤3:在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

package com.itheima.mapper;

import com.itheima.pojo.User;

public interface UserMapper {

    List<User> selectAll();
}

mybatis-config.xml

<mapper resource="com/itheima/mapper/UserMapper.xml"/>

步骤 4:编码

  • 1.通过SqlSession的getMapper方法获取Mapper接口的代理对象
  • 2.调用对应方法完成sql的执行
public class MybatisDemo2 {
    public static void main(String[] args) throws IOException {
        //2。加载mybatis的核心配置文件,获取SqlSessionFactory (官网复制)
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //3。获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行SQL
        //3.1 获取UserMapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //3.2 调用对应方法完成sql的执行
        List<User> users = userMapper.selectAll();
        System.out.println(users);

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

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

	<mappers>
        <!--加载sql映射文件-->
        <!--<mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
        
        <!--Mapper代理方式-->
        <package name="com.itheima.mapper"/>
    </mappers>

 

MyBatis核心配置文件

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>
    <!--
    typeAliases:类型别名
    在resultType时,不需要写前面的包名了
    -->
    <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:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="zjz571588"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件-->
        <!--<mapper resource="com/itheima/mapper/UserMapper.xml"/>-->

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

UserMapper.xml

<mapper namespace="com.itheima.mapper.UserMapper">
	<!--statement-->
    <!--resultType中不区分大小写-->
    <select id="selectAll" resultType="user">
        select * from tb_user;
    </select>
</mapper>

 

配置文件完成增删改查

案例:完成品牌数据的增删改查操作

要完成的功能列表清单:

  • 1.查询
    • 查询所有数据
    • 查看详情
    • 条件查询
  • 2.添加
  • 3.修改
    • 修改全部字段
    • 修改动态字段
  • 4.删除
    • 删除一个
    • 批量删除

 

准备环境

  • 数据库表 tb_brand
-- 删除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;
  • 实体类 Brand
package com.itheima.pojo;

/**
 * 品牌
 * <p>
 * alt + 鼠标左键:整列编辑
 * <p>
 * 在实体类中,基本数据类型建议使用其对应的包装类型
 */

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;


    public Integer getId() {
        return id;
    }

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

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}
  • 测试用例
package com.itheima.test;

public class MyBatisTest {
}

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

查询-查询所有数据

  • 1.编写接口方法:Mapper接口
    • 参数:无
    • 结果:List< Brand>
package com.itheima.mapper;

import com.itheima.pojo.Brand;

import java.util.List;

public interface BrandMapper {

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

  • 2.编写SQL语句:SQL映射文件
<?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.itheima.mapper.BrandMapper">

    <select id="selectAll" resultType="brand">
        select * from tb_brand;
    </select>
</mapper>
  • 3.执行方法,测试
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();
    }
}

输出:

[Brand{id=1, brandName='null', companyName='null', ordered=5, description='好吃不上火', status=0}, 
Brand{id=2, brandName='null', companyName='null', ordered=100, description='华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', status=1}, 
Brand{id=3, brandName='null', companyName='null', ordered=50, description='are you ok', status=1}]

问题:数据库表的字段名称和实体类的属性名称不一样,则不能自动封装数据

  • 解决方法1:起别名
    对不一样的列名起别名,让别名和实体类的属性名一样

BrandMapper.xml

<mapper namespace="com.itheima.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>

输出:

[Brand{id=1, brandName='三只松鼠', companyName='三只松鼠股份有限公司', ordered=5, description='好吃不上火', status=0}, 
Brand{id=2, brandName='华为', companyName='华为技术有限公司', ordered=100, description='华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', status=1}, 
Brand{id=3, brandName='小米', companyName='小米科技有限公司', ordered=50, description='are you ok', status=1}]

缺点:每次查询都要定义一次别名

  • 解决方法2:sql片段
<mapper namespace="com.itheima.mapper.BrandMapper">
    <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>

缺点:不灵活

  • 终极解决方法:resultMap
    • 1.定义< resultMap>标签
    • 2.在< select>标签中,使用resultMap属性替换resultType属性
<mapper namespace="com.itheima.mapper.BrandMapper">
    <!--
        id:唯一标识
        type:映射的类型,正常别名
    -->
    <resultMap id="brandResultMap" type="brand">
        <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column
                property
        -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

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

 

查询-查看详情

  • 1.编写接口方法:Mapper接口
    • 参数:id
    • 结果:List< Brand>
	/**
     * 查看详情
     */
    List<Brand> selectById(int id);
  • 2.编写SQL语句:SQL映射文件
	<!--
        * 参数占位符:
            1. #{}:会将其替换为 ? ,防止SQL注入
            2. ¥{}:拼SQL,存在SQL注入问题
            使用时机:
                * 参数传递的时候: #{}
                * 表名或者列名不固定的情况下:¥{}
         * 参数类型:parameterType:可以省略
         * 特殊字符处理:
            1.转义字符:<  -> &lt;
            2.CDATA区: CD -> 回车
            <![CDATA[
                <
            ]]>
    -->
	<select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand
        where id = #{id};
   </select>
  • 3.执行方法,测试
	@Test
    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。执行方法
        List<Brand> brands = brandMapper.selectById(id);
        System.out.println(brands);

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

输出:

[Brand{id=1, brandName='三只松鼠', companyName='三只松鼠股份有限公司', ordered=5, description='好吃不上火', status=0}]

 

查询-条件查询–1.多条件查询

方法1:参数接收-- 散装参数
  • 1.编写接口方法:Mapper接口
    • 参数:所有查询条件
    • 结果:List< Brand>
	/**
     * 条件查询
     * * 参数接收
     * 1。散装参数:如果方法中有多个参数,需要使用@param("SQL参数占位符名称")
     * 2。对象参数:对象的属性名称要和参数占位符名称一致
     * 3。map集合参数
     */
    List<Brand> selectByCondition(@Param("status") int status,
                                  @Param("companyName") String companyName,
                                  @Param("brandName") String brandName);
  • 2.编写SQL语句:SQL映射文件
	<!--条件查询-->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName}
    </select>
  • 3.执行方法,测试
	@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();
    }

输出:

[Brand{id=2, brandName='华为', companyName='华为技术有限公司', ordered=100, description='华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', status=1}]

 

方法2:参数接收-- 对象参数
  • 1.编写接口方法:Mapper接口
	List<Brand> selectByCondition(Brand brand);
  • 2.编写SQL语句:SQL映射文件
  • 3.执行方法,测试
	@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();
    }

 

方法3:参数接收-- map集合参数
  • 1.编写接口方法:Mapper接口
    List<Brand> selectByCondition(Map map);
  • 2.编写SQL语句:SQL映射文件
  • 3.执行方法,测试
 @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";
        //处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        //封装对象
        Map map = new HashMap();
        map.put("status",status);
        map.put("brandName",brandName);
        map.put("companyName",companyName);

        //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)

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

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

 
步骤:

  • 1.编写接口方法:Mapper接口
    • 参数:所有查询条件
    • 结果:List< Brand>
	List<Brand> selectByCondition(Map map);
  • 2.编写SQL语句:SQL映射文件
	<!--动态条件查询-->
    <!--
        * if:条件判断
            * test:逻辑表达式
        * 问题:and -> 第一个条件不需要逻辑运算符
            * 恒等式 where 1=1
            * <where> 替换 where关键字
    -->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <!--where 1=1-->
        <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.执行方法,测试
@Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";
        //处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        //封装对象
        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();
    }

 

查询-条件查询–3.单条件-动态条件查询

  • 从多个条件中选择一个
    • choose(when,otherwise):选择,类似于Java中的switch语句
       

步骤:

  • 1.编写接口方法:Mapper接口
    • 参数:所有查询条件
    • 结果:List< Brand>
	/**
     * 单条件动态查询
     * @param brand
     * @return
     */
    List<Brand> selectByConditionSingle(Brand brand);
  • 2.编写SQL语句:SQL映射文件
	
  • 3.执行方法,测试
	

输出:


动态SQL

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css移动端

目录 谷歌模拟器 屏幕分辨率 视口 二倍图 适配方案 rem 简介 问题 媒体查询 移动端 设备宽度不同&#xff0c;HTML标签字号设置多少合适 flexible.js rem-移动端适配 less 注释 运算 嵌套 变量 导入 导出 禁止导出 谷歌模拟器 模拟移动设备&#xff0c;方…

MySQL Community Server的安装配置教程(Windows版本)

&#xff08;1&#xff09;了解MySQL Community Server&#xff1a; MySQL Community Server是开源的MySQL数据库服务的名称。它是MySQL AB在2000年推出的一个开源数据库服务器&#xff0c;现在由Oracle公司维护和管理。 MySQL Community Server是一个关系型数据库系统&#…

通讯录管理系统(cpp)

一 系统需求 主要用C来实现一个通讯录管理系统 需要包含以下功能 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括姓名、性别、年龄、联系电话、家庭住址&#xff0c;最多记录1000人显示联系人&#xff1a;显示通讯录中所有联系人信息删除联系人&#xff1a;按…

【Spring】— 动态SQL :MyBatis的关联映射

目录 MyBatis的关联映射1、关联关系概述2、MyBatis中的关联关系2.1 一对一2.2 一对多2.3 多对多 MyBatis的关联映射 在实际应用中&#xff0c;对数据库的操作会涉及多张表&#xff0c;这在面向对象中就涉及对象与对象之间的关联关系。针对多表之间的操作&#xff0c;MyBatis提…

全志V3S嵌入式驱动开发(wifi驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 荔枝派上面除了支持v3s自带的有线网口&#xff0c;还带有一个支持sd协议的esp 8089 wifi模块。有了这个模块&#xff0c;v3s没有网线&#xff0c;也…

chatgpt赋能python:Python程序与SEO:如何建立程序使您的网站优化更好

Python程序与SEO&#xff1a;如何建立程序使您的网站优化更好 今天&#xff0c;越来越多的网站和在线业务转向搜索引擎优化&#xff0c;以吸引更多访问者和客户。Python编程语言是一种快速、灵活、易于学习的工具&#xff0c;如果正确使用它可以使您的网站SEO更好。下面我们来…

【从删库到跑路】MySQL系列——数据库的介绍MySQL的启动

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;什么是数据库⭐组成⭐数据库的优势 &#x1f35…

Spring Security--自动登录

也就是remember me 在配置链上加一个 然后发送请求时加上:remember-me字段 value值可以为&#xff0c;ture&#xff0c;1&#xff0c;on 我们记住登录后&#xff0c;关掉浏览器再打开&#xff0c;访问一下接口&#xff0c;可以访问&#xff0c;说明记住登录成功了。 因为有的…

Spring中Bean的生命 周期与作用域

文章目录 前言Bean的作用域概念Bean作用域类型1. singleton&#xff1a;单例作⽤域2. prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09;3. request&#xff1a;请求作⽤域4. session&#xff1a;回话作⽤域5. application&#xff1a;全局作⽤域6. websocke…

51单片机实训项目之“红外控制小风扇”代码详解

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说&#xff0c;直接上代码。 另外补充一点红外通信的原理&#xff1a; 红外接收 NEC协议&#xff1a; 数据格式 发射端的方波图&#xff0c;接收端的正好与之相反&#xff0c;数据传输从最低位开始 NEC 标准下…

mqtt.fx连接阿里云物联网平台

这里写目录标题 注册公共示例创建产品添加设备创建云产品流转生成基本信息配置mqtt.fx客户端数据传送 前提条件&#xff1a;下载mqtt.fx软件&#xff0c;以及注册好阿里云物联网平台账号 本实验用两个mqtt.fx客户端接入阿里云物联网平台&#xff0c;来实现不同设备间消息的传输…

大数据Doris(四十):Routine Load基本原理和语法介绍

文章目录 Routine Load基本原理和语法介绍 一、基本原理 二、Routine Load 语法 Routine Load基本原理和语法介绍 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Rou

chatgpt赋能python:如何使用Python获取Listview

如何使用Python获取Listview 在现代数据驱动的世界中&#xff0c;处理大量数据已经成为一项关键技能。准确地说&#xff0c;操作大量数据要比操作一小部分数据要困难得多。Python是一门非常出色的编程语言&#xff0c;它的处理大量数据的能力无人能敌。在这篇文章中&#xff0…

MySQL面试题详解

优化 如何定位慢查询 mysql中慢查询通常发生在以下几种情况&#xff0c;聚合查询&#xff0c;多表查询&#xff0c;表数据量过大查询&#xff0c;深度分页查询。 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长(超过1s) 定位慢查询的方法主要有两种。方法一…

Windows 下编译 OpenCV 和 OpenCV-contrib

文章目录 导言环境准备源码获取环境获取 配置 CMake 并编译ConfigureGenerate 生成项目总结 导言 在本文中&#xff0c;我们将介绍如何在 Windows 系统下编译 OpenCV 和 OpenCV-contrib。OpenCV 是一个开源的计算机视觉库&#xff0c;它包含了许多图像处理和计算机视觉的功能。…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…

Cracking C++(11): CMake代码高亮调研

文章目录 1. 目的2. VSCode 插件CMake 和 CMake ToolsCMake Language SupportCMake Highlights 3. JetBrains 系列3.1 CLion3.2 Fleet 4. Kate5. Sublime Text6. 总结 1. 目的 CMake 已经是开源 C 项目的主流 building system&#xff0c; 这里简单调研关注的编辑器 / IDE 下&…

Jetson nano 进阶教程4_通过IIC输出PWM

Jetson nano 进阶教程4_通过IIC输出PWM Jetson nano的40PIN不能直接发出PWM波&#xff0c;在很多控制舵机&#xff0c;电机调速方面很不方便&#xff0c;因此利用一块PCA9685模块&#xff0c;通过I2C总线控制PCA9685输出pwm波&#xff0c;并且可以调整占空比。 How do I use P…

Android Activity启动过程详解

目录 一&#xff0c;背景介绍 二&#xff0c;Activity启动过程 2.1 调用 ATMS 系统进程 2.1.1 时序图 2.1.2 Launcher 桌面的 App 图标入口 2.1.3 startActivitySafely() 方法 2.1.4 execStartActivity() 方法 2.2 ATMS 向 AMS 发送创建应用进程的过程 2.2.1 时序图 …

03- 流程控制(C语言)

一 概述 C语言支持三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构。 顺序结构&#xff1a;按照语句编写的顺序 上到下逐句执行。选择结构&#xff1a;也叫 分支结构&#xff0c;依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构&#xff1a;依据条件…