mybatis

98 阅读2分钟

c.biancheng.net/mybatis/map…

springboot整合mybatis

引入mybatis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <version>8.0.27</version>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

增加yml配置

# 数据源
datasource:
    url: jdbc:mysql://124.220.8.55:3306/communitymanagement?serverTimezone=Asia/Chongqing&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis配置
mybatis:
  # 定义mapper位置
  mapper-locations: classpath:/mapper/*.xml
  # 定义实体位置
  type-aliases-package: com.zhl.base.model.entity
  configuration:
    cache-enabled: true
    use-generated-keys: true
    default-executor-type: REUSE
    use-actual-param-name: true

使⽤@Mapper注解和@MapperScan注解来将Mapper接⼝类交给Sprinig进⾏管理。

基于xml


id:唯一标识
resultType:返回结果类型
parameterType:请求参数类型

<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="String">
    select * from sys_user where id = #{id}
</select>

<!-- 向 user 表插入一条数据 -->
    <insert id="insertUser" parameterType="com.zhl.base.model.entity.BaseUser">
        insert into sys_user(id,is_del,name,age)
            value(#{id},#{isDel},#{name},#{age})
    </insert>
     
    <!-- 根据 id 更新 user 表的数据 -->
    <update id="updateUserById" parameterType="com.zhl.base.model.entity.BaseUser">
        update sys_user set name=#{username} where id=#{id}
    </update>
     
    <!-- 根据 id 删除 user 表的数据 -->
    <delete id="deleteUserById" parameterType="int">
        delete from sys_user where id=#{id}
    </delete>

        #{}:表示占位符,用来接收输入参数,类型可以是简单类型,pojo,HashMap等等
        如果接收简单类型,#{}可以写成 value 或者其他名称
        如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值
    
        ${}:表示一个拼接符,会引起 sql 注入,不建议使用  
    用来接收输入参数,类型可以是简单类型,pojo,HashMap等等
    如果接收简单类型,${}里面只能是 value
    如果接收 pojo 对象值,通过 OGNL 读取对象中的属性值,即属性.属性.属性...的方式获取属性值

mybatis 默认支持的别名

image.png

image.png

动态sql

mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签

通过if来判断是否执行<if>内的sql,通过and和or来添加判断条件
<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="int">
    select * from sys_user where id = #{id}
    <if test="name !=null and name !=''">
        and name = #{name}
    </if>
    <if test="name !=null and name !=''">
        and name like '%${name}%'
    </if>
    <if test="age !=null and age !=''">
        and name like concat('%',#{age},'%')
    </if>
</select>

where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
<select id="selectId" resultType="com.zhl.base.model.entity.BaseUser" parameterType="int">
    select * from sys_user
    <where>
        <if test="name !=null and name !=''">
            and name = #{name}
        </if>
    </where>
</select>

set标签
<update id="updateUserById" parameterType="int">
    update sys_user u
        <set>
            <if test="name != null and name != ''">
                u.name = #{name},
            </if>
            <if test="age != null and age != ''">
                u.age = #{age}
            </if>
        </set>
     where id=#{id}
</update>

choose(when,otherwise)标签,类似于 Java 的 switch 语句
<select id="selectUserByChoose" resultType="com.zhl.base.model.entity.BaseUser" parameterType="com.zhl.base.model.entity.BaseUser">
      select * from sys_user
      <where>
          <choose>
              <when test="id !='' and id != null">
                  id=#{id}
              </when>
              <when test="name !='' and name != null">
                  and name=#{name}
              </when>
              <otherwise>
                  and age=#{age}
              </otherwise>
          </choose>
      </where>
  </select>

动态SQL: SQL 片段
<sql id="selectUserByUserNameAndSexSQL">
    <if test="name != null and name != ''">
        AND name = #{name}
    </if>
    <if test="age != null and age != ''">
        AND age = #{age}
    </if>
</sql>

引用sql片段
<select id="selectUserByUsernameAndSex" resultType="com.zhl.base.model.entity.BaseUser" parameterType="com.zhl.base.model.entity.BaseUser">
    select * from user
    <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
    <include refid="selectUserByUserNameAndSexSQL"></include>
</select>

foreach 语句
<select id="selectUserByListId" parameterType="com.zhl.base.model.entity.BaseUser" resultType="com.zhl.base.model.entity.BaseUser">
    select * from user
    <where>
        <!--
            collection:指定输入对象中的集合属性
            item:每次遍历生成的对象
            open:开始遍历时的拼接字符串
            close:结束时拼接的字符串
            separator:遍历对象之间需要拼接的字符串
            select * from user where 1=1 and (id=1 or id=2 or id=3)
          -->
        <foreach collection="ids" item="id" open="and (" close=")" separator="or">
            id=#{id}
        </foreach>
    </where>
</select>

一对一、一对多、多对多

一对一

<resultMap id="BaseUserMap" type="com.zhl.base.model.vo.BaseUserVo">
    <!--id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个id-->
    <!--column:数据库对应的列-->
    <!--property:实体类对应的属性名-->
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="isDel" property="isDel"/>
    <result column="age" property="age"/>
    <result column="deptId" property="deptId"/>
    <result column="gmt_creat" property="gmtCreat"/>
    <result column="gmt_modified" property="gmtModified"/>
    <!--association:用于映射关联查询单个对象的信息
       property:实体类对应的属性名
       javaType:实体类对应的全类名
     -->
    <association property="baseDept" javaType="com.zhl.base.model.entity.BaseDept">
        <!--
           id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个id
           column:数据库对应的列
           property:实体类对应的属性名
         -->
        <id column="deptId" property="id"/>
        <result column="deptName" property="deptName"/>
    </association>
</resultMap>

一对一、一对多 www.cnblogs.com/xiaoyuicom/…

基于注解

pdai.tech/md/spring/s…

xml映射器

mybatis.net.cn/sqlmap-xml.…