前言
MyBatis 是一个半自动化的 ORM 框架,所谓半自动化是指 MyBatis 只支持将数据库查出的数据映射到 POJO 实体类上,而实体到数据库的映射则需要我们自己编写 SQL 语句实现。
官网:https://mybatis.net.cn/index.html
1、添加mybatis依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency>
2、定义bean
package com.xxx.springboot.entity; /** * 房子信息 */ public class HouseInfo { /** * 主键 */ private Integer id; /** * 名称 */ private String name; /** * 户型 */ private String type; /** * 地址 */ private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
3、查询数据 - select
使用 Mapper 进行开发时,需要遵循以下规则:
- mapper 映射文件中 namespace 必须与对应的 mapper 接口的完全限定名一致。
- mapper 映射文件中 statement 的 id 必须与 mapper 接口中的方法的方法名一致
- mapper 映射文件中 statement 的 parameterType 指定的类型必须与 mapper 接口中方法的参数类型一致。
- mapper 映射文件中 statement 的 resultType 指定的类型必须与 mapper 接口中方法的返回值类型一致。
3.1、定义Mapper
package com.xxx.springboot.mapper; import com.xxx.springboot.entity.HouseInfo; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * 房屋信息mapper类 */ @Mapper public interface HouseInfoMapper { List<HouseInfo> queryHouseInfo(); }
3.2、定义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"> <mapper namespace="com.xxx.springboot.mapper.HouseInfoMapper"> <!--查询列名集合--> <resultMap id="BaseResultMap" type="HouseInfo"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="type" property="type" jdbcType="VARCHAR"/> <result column="address" property="address" jdbcType="VARCHAR"/> </resultMap> <!--定义查询方法--> <select id="queryHouseInfo" resultMap="BaseResultMap"> select * from house_info </select> </mapper>
3.3、动态查询语句定义
元素属性
属性 | 描述 |
id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |
parameterType | 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。 |
resultType | 期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。 |
resultMap | 对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。 |
flushCache | 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。 |
useCache | 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。 |
timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。 |
<!--定义查询方法--> <select id="queryHouseInfo" resultMap="BaseResultMap"> select * from house_info <where> <!--判断语句--> <if test="name != null and name != ''"> and name = #{name} </if> <if test="type != null and type != ''"> and type = #{type} </if> <if test="address != null and address != ''"> and address like concat('%',#{address},'%') </if> </where> </select>
3.4、配置文件
mybatis: #指定mapper.xml的位置 mapper-locations: classpath:mybatis/mapper/*.xml #实体类的位置 type-aliases-package: com.hqyj.springboot.entity
4、新增数据 - insert
<!--新增数据--> <insert id="insertHouserInfo" useGeneratedKeys="true" keyProperty="id"> insert into house_info(name,type,address) values(#{name},#{type},#{address}) </insert> <!--批量插入--> <insert id="batchInsertHouserInfo" useGeneratedKeys="true" keyProperty="id"> insert into house_info(name,type,address) values <foreach collection="list" item="houseInfo" separator=","> (#{houseInfo.name},#{houseInfo.type},#{houseInfo.address}) </foreach> </insert>
/** * 新增房屋信息数据 * @param houseInfo * @return */ public int insertHouserInfo(HouseInfo houseInfo); /** * 新增房屋信息数据 * @param listHouse * @return */ public int batchInsertHouserInfo(List<HouseInfo> listHouse);
<insert id="insertHouserInfoExt" > insert into house_info(name,type,address) values(#{name},#{type},#{address}) </insert>
/** * 新增房屋信息数据 * @param name * @param type * @param address * @return */ public int insertHouserInfoExt(@Param("name") String name, @Param("type")String type, @Param("address")String address );