mybatis 基础

mybatis 基础

MapperScan

要让SpringBoot能够使用Mybatis的Mapper类,需要用@MapperScan注解扫描到Mapper类包。

import org.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(basePackages = "com.xkcoding.multi.datasource.mybatis.mapper")
public class SpringBootDemoMultiDatasourceMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoMultiDatasourceMybatisApplication.class, args);
    }

}

并且在application.yml 需要设置xml文件位置

mybatis:
  mapper-locations:
    - classpath:dao/*.xml
    - classpath*:com/**/mapper/*.xml

xml Mapper类与 PoJo关系。

xml文件通常定义的是SQL。并且每一个SQL都会有一个唯一id,这个id会与Mappper类的方法一一对应。
Mapper是接口类,提供接口方法,但并不需要具体实现,Mybatis底层的会根据xml文件实现具体的逻辑。
Pojo通常就是数据库中一条记录的映射,每一个字段会映射到Pojo对象的成员属性上。

mbg逆向工程配置mysql插入SQL返回自增ID

<table tableName="%">
    <generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>

Mapper类通常都是接口类,通过这些接口类,就可以直接操作数据库(mybatis底层会代理操作)。比如UmsRoleMapper,就有insert方法。对应到 UmsRoleMapper.xml 的标签

<insert id="insert" parameterType="com.macro.mall.model.UmsRole">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into ums_role (name, description, admin_count, 
      create_time, status, sort
      )
    values (#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{adminCount,jdbcType=INTEGER}, 
      #{createTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}, #{sort,jdbcType=INTEGER}
      )
  </insert>

id值就对应到接口里的insert方法.
selectKey 表示插入之后获取到对应的自增ID,并设置到 UmsRole.id

{sort,jdbcType=INTEGER} jdbcType 是一个中间类型,他即映射java类型也映射mysql中的字段类型。

JDBC Type            Java Type
CHAR                String
VARCHAR                String
LONGVARCHAR            String
NUMERIC                java.math.BigDecimal
DECIMAL                java.math.BigDecimal
BIT                boolean
BOOLEAN                boolean
TINYINT                byte
SMALLINT            short
INTEGER                int
BIGINT                long
REAL                float
FLOAT                double
DOUBLE                double
BINARY                byte[]
VARBINARY            byte[]
LONGVARBINARY                byte[]
DATE                java.sql.Date
TIME                java.sql.Time
TIMESTAMP            java.sql.Timestamp
CLOB                Clob
BLOB                Blob
ARRAY                Array
DISTINCT            mapping of underlying type
STRUCT                Struct
REF                            Ref
DATALINK            java.net.URL[color=red][/color]
这个namespace表示这个xml文件映射到UmsRoleMapper类 ### resultMap标签,表示的就是一条数据库记录, 并且映射到UmsRole类 column 表示的是mysql字段,而对应的property表示的java对象属性成员,而jdbcType表示类型 ```xml ``` ## 自定义Mapper文件 ### 编写 resultMap 标签 ```xml ``` 记录对应的类如下: ```java package com.imooc.pojo.vo; import java.util.List; /** * 二级分类VO */ public class CategoryVO { private Integer id; private String name; private String type; private Integer fatherId; // 三级分类vo list private List subCatList; } package com.imooc.pojo.vo; public class SubCategoryVO { private Integer subId; private String subName; private String subType; private Integer subFatherId; public Integer getSubId() { return subId; } public void setSubId(Integer subId) { this.subId = subId; } } ``` ### 复杂SQL的写法 ```xml ``` 对应的Mapper类: ```java package com.imooc.mapper; import com.imooc.pojo.vo.CategoryVO; import com.imooc.pojo.vo.NewItemsVO; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; public interface CategoryMapperCustom { public List getSubCatList(Integer rootCatId); //paramsMap会映射到xml文件里 public List getSixNewItemsLazy(@Param("paramsMap") Map map); } ``` --- ### 标签的用法 ```xml ``` \ 类似于switch语句。\ 类似于default语句。 --- 使用#{parameterName}引用参数的时候,Mybatis会把这个参数认为是一个字符串,并自动加上". 而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。 ## 循环用法 ```java public List queryItemsBySpecIds(@Param("paramsList") List specIdsList); ``` ```xml ``` --- ## update语句 ```java public interface ItemsMapperCustom { public int decreaseItemSpecStock(@Param("specId") String specId, @Param("pendingCounts") int pendingCounts); } ``` ```xml update items_spec set stock = stock - #{pendingCounts} where id = #{specId} and stock >= #{pendingCounts} ``` --- ## insert 批量插入语句 ```java package com.macro.mall.dao; import com.macro.mall.model.CmsPrefrenceAreaProductRelation; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 优选和商品关系自定义Dao * Created by macro on 2018/4/26. */ public interface CmsPrefrenceAreaProductRelationDao { /** * 批量创建 */ int insertList(@Param("list") List prefrenceAreaProductRelationList); } package com.macro.mall.model; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; public class CmsPrefrenceAreaProductRelation implements Serializable { private Long id; private Long prefrenceAreaId; private Long productId; private static final long serialVersionUID = 1L; } ``` ```xml insert into cms_prefrence_area_product_relation (prefrence_area_id, product_id) values (#{item.prefrenceAreaId,jdbcType=BIGINT}, #{item.productId,jdbcType=BIGINT}) ``` --- --------------------------------

Leave a Comment

Your email address will not be published. Required fields are marked *

PHP 8.1.1 - 15.522 ms, 0 Q