Mybits入门


1、Mybatis概述

1.1、Mybatis简介

  • MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
  • MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

持久层:

  • 负责将数据到保存到数据库的那一层代码。
  • 以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
  • JavaEE三层架构:表现层、业务层、持久层

作用:

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

持久层框架的使用占比。
在这里插入图片描述

2、MyBatis入门

需求:查询user表中所有数据。

  • 创建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', '男', '西安');
    
  • 一、创建模块,导入坐标
    在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标

    <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.46</version>
        </dependency>
    
        <!--junit 单元测试-->
        <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>
    
  • 二、注意:需要在项目的resources目录下创建logback.xml的文件
    在这里插入图片描述

<?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>
  • 三、编写MyBatis核心配置文件
    在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml
    在这里插入图片描述

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <typeAliases>
            <package name="com.chuhe.pojo"/>
        </typeAliases>
        
        <!--
        environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
        -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库连接信息-->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="1234"/>
                </dataSource>
            </environment>
    
            <environment id="test">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!--数据库连接信息-->
                    <property name="driver" value="com.mysql.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映射文件-->
           <!--我们映射的是tb_user这张表,这里我们起名叫UseMapper.xml-->
           <mapper resource="UserMapper.xml"/>
        </mappers>
    </configuration>
    
  • 四、编写 SQL 映射文件
    在模块的 resources 目录下创建映射配置文件 UserMapper.xml

    <?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设置的是名称空间,这里起名为test-->
    <mapper namespace="test">
    	<!--
    	id设置的名称是该处设置的sql唯一名称;
    	resultType设置的为该sql的返回值类型,这里我们返回的ResultSet最终封装成User对象
    	-->
        <select id="selectAll" resultType="com.chuhe.pojo.User">
            select * from tb_user;
        </select>
    </mapper>
    
  • 五、在 com.chuhe.pojo 包下创建 User类

    package com.chuhe.pojo;
    
    public class User {
        private String id;
        private String username;
        private String password;
        private String gender;
        private String addr;
    
        public String getId() {
            return id;
        }
    
        public void setId(String 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 + '\'' +
                    '}';
        }
    }
    
    
  • 六、 编写测试类

    package com.chuhe.pojo;
    
    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 Demo {
        public static void main(String[] args) throws IOException {
           //加载mybatis的核心配置文件,获取SqlSessionFactory
           String resource="mybatis-config.xml";
           InputStream inputStream= Resources.getResourceAsStream(resource);
           SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    
           //获取SqlSession对象,用来执行sql
            SqlSession sqlSession=sqlSessionFactory.openSession();
    
            //执行sql
            List<User> users=sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id
    
            System.out.println(users);
            //释放资源
            sqlSession.close();
    
        }
    }
    
    

3、解决SQL映射文件的警告提示

映射配置文件中存在报红的情况。问题如下:
在这里插入图片描述
产生原因: IDEA和数据库没有建立连接,不识别表信息。但它并不影响程序的执行。
解决方式: 在Idea中配置MySQL数据库连接。
在这里插入图片描述
在这里插入图片描述

4、Mapper代理开发

4.1、解决的问题

  • 使用加载sql映射文件这种方法,也存在硬编码的问题,不利于后期维护
    在这里插入图片描述
  • 使用 Mapper 代理方式(如下图)则不存在硬编码问题。
    在这里插入图片描述

Mapper 代理方式的目的:
解决原生方式中的硬编码
简化后期执行SQL

4.2、使用Mapper代理要求

  • 一、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置同一目录下。 如下图
    在这里插入图片描述

  • 二、设置SQL映射文件的namespace属性为Mapper接口全限定名

    在这里插入图片描述

  • 三、在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致。
    在这里插入图片描述

4.3、代码实现

  • com.chuhe.mapper 包下创建 UserMapper接口,代码如下:

    package com.chuhe.mapper;
    
    import com.chuhe.pojo.User;
    
    import java.util.List;
    
    public interface UserMapper {
        List<User> selectAll();
    }
    
    
  • resources 下创建 com/itheima/mapper 目录,并在该目录下创建 UserMapper.xml 映射配置文件

    <?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设置的是名称空间,这里起名为test-->
    <!--namespace设置的是名称空间,必须是对应接口的全限定名-->
    <mapper namespace="com.chuhe.mapper.UserMapper">
        <!--
        id设置的名称是该处设置的sql唯一名称;
        resultType设置的为该sql的返回值类型,这里我们返回的ResultSet最终封装成User对象
        -->
        <select id="selectAll" resultType="com.chuhe.pojo.User">
            select * from tb_user;
        </select>
    </mapper>
    
  • 测试类中代码如下:

    package com.chuhe.pojo;
    
    import com.chuhe.mapper.UserMapper;
    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 Demo {
        public static void main(String[] args) throws IOException {
           //加载mybatis的核心配置文件,获取SqlSessionFactory
           String resource="mybatis-config.xml";
           InputStream inputStream= Resources.getResourceAsStream(resource);
           SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    
           //获取SqlSession对象,用来执行sql
            SqlSession sqlSession=sqlSessionFactory.openSession();
    
            //执行sql
            //List<User> users=sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id
            //获取UserMapper接口的代理对象
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            List<User> users=userMapper.selectAll();
            System.out.println(users);
            //释放资源
            sqlSession.close();
    
        }
    }
    
    

4.4、包扫描方式简化SQL映射文件的加载

在这里插入图片描述

  • 不使用Mapper代理mybatis-config.xml配置方法
    若存在多个SQL映射文件,需要配置多个标签。

       <!--加载sql映射文件-->
       <mapper resource="com/chuhe/mapper/UserMapper.xml"/>
    
  • 使用Mapper代理mybatis-config.xml配置方法
    如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。

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

4.5、Mapper代理开发配置总结

4.5.1、SQL映射文件

这里以UserMapper.xml为例
一、namespace

<!--namespace设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.UserMapper">

二、id
UserMapper接口文件中定义的方法必须和id相同。

  <select id="selectAll" resultType="com.chuhe.pojo.User">
      select * from tb_user;
  </select>

三、resultType
resultType为返回值,这里是要封装成User对象,必须要填User类的全限定名。

5、MyBatis核心配置文件

核心配置文件中现有的配置之前已经给大家进行了解释,而核心配置文件中还可以配置很多内容。我们可以通过查询官网看可以配置的内容https://mybatis.org/mybatis-3/zh/configuration.html

5.1、多环境配置

在核心配置文件的 environments 标签中其实是可以配置多个 environment ,使用 id 给每段环境起名,在 environments 中使用 default='环境id' 来指定使用哪儿段配置。我们一般就配置一个 environment 即可。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
	    <!--
	    name属性的值是实体类所在包
	    起别名
	    可以简化映射配置文件中 resultType 属性值的编写
	    -->
	    <package name="com.chuhe.pojo"/> 
	</typeAliases>
	<environments default="development">
	    <environment id="development">
	        <transactionManager type="JDBC"/>
	        <dataSource type="POOLED">
	            <!--数据库连接信息-->
	            <property name="driver" value="com.mysql.jdbc.Driver"/>
	            <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
	            <property name="username" value="root"/>
	            <property name="password" value="1234"/>
	        </dataSource>
	    </environment>
	
	    <environment id="test">
	        <transactionManager type="JDBC"/>
	        <dataSource type="POOLED">
	            <!--数据库连接信息-->
	            <property name="driver" value="com.mysql.jdbc.Driver"/>
	            <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
	            <property name="username" value="root"/>
	            <property name="password" value="1234"/>
	        </dataSource>
	    </environment>
	</environments>
	 <!--扫描mapper-->
    <mappers>
        <package name="com.chuhe.mapper"/>
    </mappers>
</configuration>

5.2、类型别名

在映射配置文件中的 resultType 属性需要配置数据封装的类型(类的全限定名)。Mybatis 提供了 类型别名(typeAliases) 可以简化这部分的书写。
首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写。内容如下:

<typeAliases>
    <!--name属性的值是实体类所在包-->
    <package name="com.chuhe.pojo"/> 
</typeAliases>

通过上述的配置,我们就可以简化映射配置文件中 resultType 属性值的编写

<mapper namespace="com.chuhe.mapper.UserMapper">
    <select id="selectAll" resultType="user">
        select * from tb_user;
    </select>
</mapper>

5.3、配置SQL映射文件

详见:包扫描方式简化SQL映射文件的加载

6、配置文件完成增删改查

6.1、准备环境

-- 删除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;

6.2、安装MyBatisX插件

在这里插入图片描述

6.3、MyBaits增删改查案例

在这里插入图片描述

Brand.java

package com.chuhe.pojo;

public class Brand {
    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    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 getCommanyName() {
        return companyName;
    }

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

    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 + '\'' +
                ", commanyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}


mybatisConfig.xml

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

    <typeAliases>
        <package name="com.chuhe.pojo"/>
    </typeAliases>

    <!--
    environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件-->
<!--        <mapper resource="com/chuhe/mapper/BrandMapper.xml"/>-->
        <package name="com.chuhe.mapper"/>
    </mappers>
</configuration>

6.3.1、查询所有数据

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;

import java.util.List;

public interface BrandMapper {
    //查询所有
    List<Brand> selectAll();
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
 	<!--查询所有-->
    <select id="selectAll" resultMap="brandResultMap">
        select *  from tb_brand;
    </select>    
</mapper>

Demo.java

package com.chuhe.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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 Demo {
    @Test
    public void testSelectAll() throws IOException {
        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands=brandMapper.selectAll();
        System.out.println(brands);


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

6.3.2、查看详情

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;

import java.util.List;

public interface BrandMapper {
    //查看详情
    Brand selectById(int id);

}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
	<!--查看详情-->
    <select id="selectById" parameterType="Brand" resultMap="brandResultMap">
        select * from tb_brand where id=#{id};
    </select>

</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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 Demo {
    @Test
    public void testSelectById() throws IOException {
        int id=1;
        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        Brand brand=brandMapper.selectById(id);
        System.out.println(brand);
        //释放资源
        sqlSession.close();;
    }
}

6.3.3、条件查询

6.3.3.1、多条件查询:用参数传参

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;


import java.util.List;

public interface BrandMapper {
    //条件查询
    List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
//    List<Brand> selectByCondition(Brand brand);
//    List<Brand> selectByCondition(Map map);
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

    <!--条件查询-->
    <select id="selectByCondition" resultMap="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>

        </where>

    </select>
</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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 Demo {
    
    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status=1;
        String brandName="华为";
        String companyName="华为";
        //处理参数
        brandName="%"+"华为"+"%";
        companyName="%"+"华为"+"%";

        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands=brandMapper.selectByCondition(status,companyName,brandName);
        System.out.println(brands);
        //释放资源
        sqlSession.close();
    }
}

6.3.3.2、多条件查询:用对象传参

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;


import java.util.List;

public interface BrandMapper {
    //条件查询
//    List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
    List<Brand> selectByCondition(Brand brand);
//    List<Brand> selectByCondition(Map map);
}

BrandMapper.xml

三种方法用到的sql一致,这里不变
省略,具体参照
6.3.3.1、用参数传参
中的BrandMapper.xml

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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 Demo {
    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status=1;
        String brandName="华为";
        String companyName="华为";
        //处理参数
        brandName="%"+"华为"+"%";
        companyName="%"+"华为"+"%";

        Brand brand=new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);

        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands=brandMapper.selectByCondition(brand);
        System.out.println(brands);
        //释放资源
        sqlSession.close();


    }
}

6.3.3.3、多条件查询:用Map传参

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface BrandMapper {

    //条件查询
//    List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
//    List<Brand> selectByCondition(Brand brand);
    List<Brand> selectByCondition(Map map);
}

BrandMapper.xml

三种方法用到的sql一致,这里不变
省略,具体参照
6.3.3.1、用参数传参
中的BrandMapper.xml

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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.HashMap;
import java.util.List;
import java.util.Map;

public class Demo {

    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status=1;
        String brandName="华为";
        String companyName="华为";
        //处理参数
        brandName="%"+"华为"+"%";
        companyName="%"+"华为"+"%";

        Map map=new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);


        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands=brandMapper.selectByCondition(map);
        System.out.println(brands);
        //释放资源
        sqlSession.close();


    }
}

6.3.3.4、单条件动查询:只能用对象传参

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;


import java.util.List;
import java.util.Map;

public interface BrandMapper {
    //单条件动态查询
    List<Brand> selectByConditionSingle(Brand brand);

}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>


    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select * 
        from tb_brand
        <where>
            <choose>
                <when test="status != null">
                    status=#{status}
                </when>
                <when test="companyName!=null and companyName !=''">
                    and company_name like #{companyName}
                </when>
                <when test="brandName!=null and brandName !=''">
                    and brand_name like #{brandName}
                </when>
            </choose>
        </where>
    </select>
</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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.HashMap;
import java.util.List;
import java.util.Map;

public class Demo {


    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status=1;
        String brandName="华为";
        String companyName="华为";
        //处理参数
        brandName="%"+"华为"+"%";
        companyName="%"+"华为"+"%";

        Brand brand=new Brand();
        brand.setStatus(status);
       // brand.setBrandName(brandName);
       // brand.setCompanyName(companyName);


        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands=brandMapper.selectByConditionSingle(brand);
        System.out.println(brands);
        //释放资源
        sqlSession.close();


    }
}

6.3.4、添加

BrandMapper.java

package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
public interface BrandMapper {
    void add(Brand brand);
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
    <insert id="add" >
        insert into
        tb_brand(brand_name,company_name,ordered,description,status)
        values(#{brandName},#{companyName},#{ordered},#{description},#{status});
    </insert>
</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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.HashMap;
import java.util.List;


public class Demo {


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


        Brand brand=new Brand();
        brand.setStatus(status);
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(ordered);
        brand.setDescription(description);


        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        //不带参数默认为false表示,开启事务,需手动提交事务
        SqlSession sqlSession=sqlSessionFactory.openSession(false);
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        brandMapper.add(brand);

        //提交事务
         sqlSession.commit();
        //释放资源
        sqlSession.close();


    }
}

SqlSession sqlSession=sqlSessionFactory.openSession(false);
不带参数默认为false,表示开启事务,进行增删改操作后需手动提交事务
true表示关闭事务,会自动提交。
手动提 交事务:
sqlSession.commit();

6.3.4.1、主键返回
  • 在数据添加成功后,需要获取插入数据库数据的主键的值。
  • 返回添加数据的主键:<insert useGenerateKeys="true" keyProperty="id">
    BrandMapper.xml
<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

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

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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.HashMap;
import java.util.List;
import java.util.Map;

public class Demo {

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


        Brand brand=new Brand();
        brand.setStatus(status);
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(ordered);
        brand.setDescription(description);


        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        //不带参数默认为false表示,开启事务,需手动提交事务
        SqlSession sqlSession=sqlSessionFactory.openSession(false);
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        brandMapper.add(brand);
        System.out.println("添加数据的主键:"+brand.getId());

        //提交事务
         sqlSession.commit();
        //释放资源
        sqlSession.close();


    }
}

6.3.5、修改全部字段

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;


import java.util.List;
import java.util.Map;

public interface BrandMapper {

    int updata(Brand brand);
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

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

</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;
import com.chuhe.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.HashMap;
import java.util.List;
import java.util.Map;

public class Demo {
    @Test
    public void testUpdata() throws IOException {
        //接收参数
        int id=5;
        int status=1;
        String brandName="波导手机";
        String companyName="波导";
        int ordered=100;
        String description="手机中的战战斗机";


        Brand brand=new Brand();
        brand.setId(id);
        brand.setStatus(status);
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setOrdered(ordered);
        brand.setDescription(description);


        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        //不带参数默认为false表示,开启事务,需手动提交事务
        SqlSession sqlSession=sqlSessionFactory.openSession(false);
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        int count=brandMapper.updata(brand);
        System.out.println(count>0?"成功":"失败");


        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();


    }
}

6.3.6、修改动态字段

BrandMapper.java

6.3.5、修改全部字段保持一致

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
    <update id="updata">
        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>

</mapper>

Demo.java

6.3.5、修改全部字段保持一致

6.3.7、删除一个

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface BrandMapper {
    int deleteById(int id);
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

    <delete id="deleteById">
        delete
        from tb_brand
        where id=#{id};
    </delete>

</mapper>

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;

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;


public class Demo {

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

        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        //不带参数默认为false表示,开启事务,需手动提交事务
        SqlSession sqlSession=sqlSessionFactory.openSession(false);
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        int count=brandMapper.deleteById(id);
        System.out.println(count>0?"成功":"失败");


        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();


    }
}

6.3.8、批量删除

BrandMapper.java

package com.chuhe.mapper;

import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

public interface BrandMapper {
    int deleteByIds(int[] ids);
//  int deleteByIds(@Param("ids")int[] ids);
}

BrandMapper.xml

<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>

    <delete id="deleteByIds">
        delete
        from tb_brand
        where id in
        <!--mybatis会将数组参数,封装为一个Map集合
        	key默认为arry,value为数组
        	即arry=数组,故collection="array"
        -->
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>


</mapper>

<foreach collection="array" item="id" separator="," open="(" close=")">

  • mybatis会将数组参数,封装为一个Map集合
    key默认为arry,value为数组
    即arry=数组,故collection=“array”

  • 若,非要写ids
    <foreach collection="ids" item="id" separator="," open="(" close=")">

  • open表示在in语句开始前加"("

  • close表示在in语句开始前加")"

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;

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;

public class Demo {
    @Test
    public void testDeteleByIds() throws IOException {
        //接收参数
        int[] ids={3,6,8};
        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象
        //不带参数默认为false表示,开启事务,需手动提交事务
        SqlSession sqlSession=sqlSessionFactory.openSession(false);
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        int count=brandMapper.deleteByIds(ids);
        System.out.println(count);

        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }
}

7、 MyBatis参数传递

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

User Select(@Param("username") String username,@Param("password")String password);
<select id="select" resultType="user">
	select *
	from tb_user
	where
		username=#{username}
		and password={#password};
</select>

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

  • 单个参数:

    1. POJO类型:直接使用,属性名和参数占位符名称一致。如,本文中的User、Brand
    2. Map集合:直接使用,键名和参数占位符名称一致。
    3. Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
      map.put("arg0",collection集合);
      map.put("collection",collection集合);	
      
    4. List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
      map.put("arg0",list集合);
      map.put("collection",list集合);
      map.put("list",list集合);
      
    5. Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
      map.put("arg0",数组);
      map.put("array",数组);
      
    6. 其他类型:直接使用
  • 多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。

    map.put("arg0",参数值1)
    map.put("param1",参数值1)
    map.put("param2",参数值2)
    map.put("agr1",参数值2)
    
  • 使用一个@Param(“username”)

    User Select(@Param("username") String username,String password);
    
    map.put("username",参数值1)
    map.put("param1",参数值1)
    map.put("param2",参数值2)
    map.put("agr1",参数值2)
    

8、动态SQL

8.1、实体类属性名和数据库表列名不一致

问题: 实体类属性名和数据库表列名不一致时,不能自动封装数据
如数据库中brand_name字段在Brand类中定义为brandName字段,MyBatis无法识别,导致无法封,就无法给brandName赋值,brandName就一直为默认值null。
在这里插入图片描述
解决方法:
方法一、sql中起别名
BrandMapper.xml中将SQL语句中,不一样的列名起别名,别名和实体类属性名一样。
在这里插入图片描述
缺点:sql过于冗长,每次查询都要定义别名。

方法二、定义sql片段,提升复用性
这种方法可以解决方法一中的缺点。

<mapper namespace="com.chuhe.mapper.BrandMapper">
    <!--sql片断-->
    <sql id="brand_colum">
        id,brand_name brandName,company_name companyName,ordered,description, status
    </sql>
    <select id="selectAll" resultType="com.chuhe.pojo.Brand">
        select
        <include refid="brand_colum"/>
        from tb_brand;
    </select>
</mapper>

缺点:不灵活
方法三、resultMap

  • resultMap:定义完成不一致的属性名和列名的映射。
<!--namespace设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
<!--select标签属性将不再使用resultType而是resultMap-->
    <select id="selectAll" resultMap="brandResultMap">
        select *  from tb_brand;
    </select>
</mapper>

注意:

  1. resultMap中的type属性,应和select标签中原来属性resultType一致
  2. select标签属性将不再使用resultType而是resultMap

8.2、参数占位符

  • #{}:执行SQL时,会将#{}占位符替换成?,MyBatis自动设置参数值。
  • ${}:拼SQL。会存在SQL注入问题。

使用时机:

  • 参数传递,都使用#{}
  • 如果要对表名、列名进行动态设置,只能使用${}进行SQL拼接,但会存存SQL注入问题。
    <select id="selectById" resultMap="brandResultMap">
        select * from tb_brand where id=#{id};
    </select>

8.3、parameterType

  • 用于设置参数类型,该参数可以省略。
  • 设置selectById返回的类型。
    <select id="selectById" parameterType="Brand" resultMap="brandResultMap">
        select * from tb_brand where id=#{id};
    </select>

8.4、SQL语句中殊字符处理

  • 转义字符
    xml中的一些特殊字符需要转义,如<需用&lt;
    xml常用转义字符

    显示结果转义字符描述
    &nbsp;空格
    <&lt;
    >&gt;
    &&amp;
    "&quot;
    '&apos;
    ×&times;
  • CDATA区
    <![CDATA[ 内容 ]]> 写在里面的内容会被当作纯文本。

8.5、动态SQL

**动态SQL:**多条件查询时,用户在筛选条件时,可能某些多件不选择,我们的sql要根据用户填写的条件进行动态变化。
if标签

  • 用于判断参数是否有值,使用set属性进行条件判断。
  • 存在的问题:第一个条件不需要逻辑运算符,如select * from tb_brand where and company_name=? and brand_name=?;
  • 解决方案:
    1. 方法一:使用恒等式让所有条件格式都一样

      		select *
              from tb_brand
              where 1=1
                  <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>	
      
      
    2. 方法二:<where>标签替换where关键字,MyBaits会根据实际情况决定要不要加逻辑运算符

8.5.1、多条件查询动态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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
    
    <!--条件查询-->
    <select id="selectByCondition" resultMap="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>

        </where>

    </select>
</mapper>

8.5.2、单条件动态条件查询

在这里插入图片描述

  • choose (when, otherwise)
<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
   
    <resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>

    </resultMap>
   

    <select id="selectByConditionSingle" resultMap="brandResultMap">
        select * 
        from tb_brand
        <where>
            <choose><!--类似于switch-->
                <when test="status != null"><!--类似于case-->
                    status=#{status}
                </when>
                <when test="companyName!=null and companyName !=''">
                    and company_name like #{companyName}
                </when>
                <when test="brandName!=null and brandName !=''">
                    and brand_name like #{brandName}
                </when>
                <otherwise><!--类似于default,使用where标签,otherwish就可以不写了-->
                	1=1
                </otherwise>
            </choose>
        </where>         
    </select>
</mapper>

动态SQL详见:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

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

8.5、SQL语句中设置多个参数

9、注解完成增删改查

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

    @Select("select * from tb_user where id=#{id}")
    public User selectById(int id);
    
    • 查询:@Select
    • 添加:@Insert
    • 修改:@Update
    • 删除:@Delete

提示:

  • 注解完成简单功能
    配置文件完成复杂功能

BrandMapper.java

package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

public interface BrandMapper {
    //查看详情
    @Select("select * from tb_brand where id=#{id}")
    Brand selectById(int id);

}

Demo.java

package com.chuh.test;

import com.chuhe.mapper.BrandMapper;

import com.chuhe.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;


public class Demo {

    @Test
    public void testSelectById() throws IOException {
        int id=1;
        //加载MyBatis核心配置文件,获取SqlSessionFactory
        String resource="mybatisConfig.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

        //获取SqlSession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取BrandMapper接口的代理对象
        BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
        Brand brand=brandMapper.selectById(id);
        System.out.println(brand);
        //释放资源
        sqlSession.close();;
    }


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值