目录
mybatisPlus 方便SQL查询。
如果是单表的话,直接用wapper进行
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq()
dao.select()
如果是多表查询,那就要写SQl了
配置分页
Page<T> p = new Page<>(page,pageSize);
dao.select(p, map)
以为这样就结束了?注意这里是多参数,需要 @Param 进行配合。
dao.select(Page p, @param("map") Map map)
在mapper中从map中获取参数
Mybatis中的关联
关联是非单表的必用功能
以下提供两种形式参考
第一种
public class UserAndRoleDto {
private SysUser user;
private List<SysRole> role;
}
希望得到的返回结果是
[
{
"user": {
"id": 1,
"userName": "张三",
"passWord": "123456",
"nikeName": "三儿",
"phone": "1122334455",
"email": "zhangsan@qq.com",
"address": "花园小胡同",
"rolesId": 1,
"createDate": "2020-06-06 23:08:03",
"updateDate": "2020-06-06 23:08:03"
},
"role": [
{
"id": 1,
"roleName": "管理员",
"roleType": "1"
}
]
}
]
映射如何写?
<resultMap id="userMap" type="com.panghai.scheduled.model.entity.SysUser">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="passWord" property="passWord" />
<result column="nikeName" property="nikeName" />
<result column="phone" property="phone" />
<result column="email" property="email" />
<result column="address" property="address" />
<result column="rolesId" property="rolesId" />
<result column="createDate" property="createDate" />
<result column="updateDate" property="updateDate" />
</resultMap>
<resultMap id="roleMap" type="com.panghai.scheduled.model.entity.SysRole">
<id column="rId" property="id" />
<result column="roleName" property="roleName" />
<result column="roleType" property="roleType" />
</resultMap>
<resultMap id="userAndRole" type="com.panghai.scheduled.model.dto.UserAndRoleDto">
<association property="user" resultMap="userMap" />
<association property="role" resultMap="roleMap" />
</resultMap>
第二种形式,可以由上一种形式推出
public class UserInfoDto extends SysUser {
private List<SysRole> roles;
}
希望得到的结果是
[
{
"id": 1,
"userName": "张三",
"passWord": "123456",
"nikeName": "三儿",
"phone": "1122334455",
"email": "zhangsan@qq.com",
"address": "花园小胡同",
"rolesId": 1,
"createDate": "2020-06-06 23:08:03",
"updateDate": "2020-06-06 23:08:03",
"roles": [
{
"id": 1,
"roleName": "管理员",
"roleType": "1"
}
]
}
]
mapper如何写?
<resultMap id="userInfoMap" type="com.panghai.scheduled.model.dto.UserInfoDto" extends="userMap">
<association property="roles" resultMap="roleMap" />
</resultMap>
代码复用很重要。
之前总是觉得代码复用有点啰嗦,然后功能分开写。
后来发现只要提前想好变通,按照基本规则进行设计,就会很灵活。
提高生产力很重要
MyBatis 有两种不同的方式加载关联:
- 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
- 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
collection 的坑
进行一对多映射的时候,collection 始终不能进入到同一个集合中
是因为mybatis划分数据的时候是根据id进行划分的
也就是说,对应的类中必须有id, 注意: 是属于类本身的id
{
"id": 5,
"user": {
"id": 5,
"userName": "田七",
"passWord": "123456",
"nikeName": "七儿",
"phone": "1122334455",
"email": "zhangsan@qq.com",
"address": "花园小胡同",
"rolesId": "1,2,3",
"createDate": "2020-06-07 09:08:40",
"updateDate": "2020-06-07 09:08:40"
},
"roles": [
{
"roleName": "管理员",
"roleType": "1",
"rid": 1
},
{
"roleName": "东A",
"roleType": "2",
"rid": 2
},
{
"roleName": "东B",
"roleType": "2",
"rid": 3
}
]
}
就是这里,内外层必须有id
日志打印
这个配置是将SQL打印在控制台
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
如果要将日志交由log4j管理
logging:
level:
com.xx.xxx.dao: debug
config: classpath:log4j2/log4j2_prod1.xml
这样就结束了吗?
<logger name="com.xxx.xxx.dao" level="DEBUG"/>
要添加这个项
如果日志配置文件加载不成功怎么办?有可能是包或版本冲突了,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>