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})
```
--- --------------------------------