Mybatis进阶(mybatis-plus教程)
mhr18 2024-10-02 16:45 26 浏览 0 评论
Mybatis高级查询
- ResultMap属性
package com.demo.domain;
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Integer id;
private String usernameabc;
private String passwordabc;
private Date birthdayab;
private String sexabc;
private String addressabc;
}
package com.demo.mapper;
import com.demo.domain.User;
import java.util.List;
public interface UserMapper {
/*
根据id查询用户
*/
public User findUserById(int id);
/**
* 查询所有用户
* @return
*/
public List<User> findAllResultMap();
}
<?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.demo.mapper.UserMapper">
<!--根据id查询用户-->
<select id="findUserById" parameterType="int" resultMap="userResultMap">
select * from user where id = #{id}
</select>
<!--
id: 标签的唯一标识
type: 封装后实体类型
-->
<resultMap id="userResultMap" type="com.demo.domain.User">
<!--手动配置映射关系-->
<!--id: 用来配置主键-->
<id property="id" column="id"></id>
<!--result: 表中普通字段的封装-->
<result property="usernameabc" column="username"></result>
<result property="passwordabc" column="password"></result>
<result property="sexabc" column="sex"></result>
<result property="addressabc" column="address"></result>
</resultMap>
<!--查询所有用户-->
<!--resultMap: 手动配置实体属性与表中字段的映射关系,完成手动封装-->
<select id="findAllResultMap" resultMap="userResultMap">
select * from user
</select>
</mapper>
- 多条件查询
- 方式一:#{arg0}~#{argn} 或者 #{param1}~#{paramn} 获取参数
public List<User> findByIdAndUsername1(int id, String username);
<!--多条件查询: 方式一-->
<select id="findByIdAndUsername1" resultMap="userResultMap">
select * from user where id = #{param1} and username = #{param2}
</select>
- 方式二:注解, @Param()注解获取参数
public List<User> findByIdAndUsername2(@Param("id") int id,@Param("username") String username);
<select id="findByIdAndUsername2" resultMap="userResultMap">
select * from user where id = #{id} and username = #{username}
</select>
- 方式三:pojo对象传递参数
public List<User> findByIdAndUsername3(User user);
<select id="findByIdAndUsername3" resultMap="userResultMap" parameterType="user">
select * from user where id = #{id} and username = #{usernameabc}
</select>
- 模糊查询
- 方式一:#{} 在Mybatis中占位符,引用参数值的时会自动添加单引号
public List<User> findByUsernameLike(String username);
<!--模糊查询-->
<select id="findByUsernameLike" resultMap="userResultMap" parameterType="string">
<!--
#{}: 占位符,引用参数值的时会自动添加单引号
-->
select * from user where username like #{username}
</select>
List<User> users = mapper.findByUsernameLike("%aa%");
users.forEach(System.out::println);
- 方式二:${} sql原样拼接
<!--模糊查询-->
<select id="findByUsernameLike" resultMap="userResultMap" parameterType="string">
<!--
parameterType是基本数据类型或String时,${}里面的值只能写value
-->
select * from user where username like '${value}'
</select>
List<User> users = mapper.findByUsernameLike("%aa%");
users.forEach(System.out::println);
Mybatis映射文件深入
- 返回主键
向数据库插入一条记录后,能立即拿到这条记录在数据库的主键值。
- useGeneratedKeys
只适用于主键自增的数据库,mysql和sqlserver支持,oracle不支持。
<!--添加用户: 获取返回主键-->
<!--
useGenerateKeys: 声明返回主键
keyProperty: 把返回主键的值,封装到实体中的那个属性上
-->
<insert id="saveUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
insert into user (username, birthday, sex, address) values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
- selectKey
适用范围更广,支持所有类型的数据库
<!--添加用户: 获取返回主键-->
<!--
selectKey: 适用范围更广,支持所有类型的数据库
order: 设置在sql语句执行前(后),执行此语句
keyColumn: 指定主键对应列名
keyProperty: 返回主键的值,封装到实体中的那个属性上
resultType: 指定主键类型
-->
<insert id="saveUser" parameterType="user">
<selectKey order="AFTER" keyColumn="id" keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID();
</selectKey>
insert into user (username, birthday, sex, address) values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
动态SQL之<if>:不确定两个都有值
<select id="findByIdAndUsernameIf" parameterType="user" resultType="user">
select * from user /*where 1 = 1*/
<!--
test里面写的时表达式
<where>相当于 1 = 1, 如果没有条件的法,不会拼接where关键字
-->
<where>
<if test="id != null">
and id = #{id}
</if>
<if test = "username != null">
and username = #{username}
</if>
</where>
</select>
动态SQL之<set>:有值更新;没有值不做处理
<!--动态sql之set: 动态更新-->
<update id="updateSet" parameterType="user">
update user
<!--
在更新的时候,会自动添加set关键字
还会去掉最后一个条件的逗号;
-->
<set>
<if test="username != null">
username = #{username},
</if>
<if test="birthday != null">
birthday = #{birthday},
</if>
<if test="sex != null">
sex = #{sex},
</if>
<if test="address != null">
address = #{address},
</if>
</set>
where id = #{id}
</update>
动态SQL之<foreach>:数据的循环遍历
- 集合
<!--动态sql的foreach标签 多值查询: 根据多个id值查询用户-->
<select id="findByList" parameterType="list" resultType="user">
select * from user
<where>
<!--
collection: 要遍历的集合元素,通常可写collection或者list
open: 语句开始部分
close: 语句结束部分
item: 遍历集合中的每个元素,生成变量名
-->
<foreach collection="collection" open="id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
- 数组
<select id="findByArray" parameterType="int" resultType="user">
select * from user
<where>
<!--
collection: 要遍历的数组元素,写array
open: 语句开始部分
close: 语句结束部分
item: 遍历集合中的每个元素,生成变量名
-->
<foreach collection="array" open = "id in (" close = ")" item = "id" separator=",">
#{id}
</foreach>
</where>
</select>
SQL片段
映射文件中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
Mybatis核心配置文件深入
- plugin
- 分页
<!--分页助手-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.5</version>
</dependency>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>
// 设置分页参数
// 参数1: 当前页
// 参数2: 每页显示的条数
// 一定要写在调用数据库的上面
PageHelper.startPage(1, 1);
List<User> users = mapper.findAllResultMap();
for (User user : users) {
System.out.println("user = " + user);
}
// 获取分页相关的其它参数
PageInfo<User> pageInfo = new PageInfo<>(users);
// 总条数
long total = pageInfo.getTotal();
// 总页数
int pages = pageInfo.getPages();
// 当前页
int pageNum = pageInfo.getPageNum();
// 每页显示长度
int pageSize = pageInfo.getPageSize();
// 判断是否第一页
boolean isFirstPage = pageInfo.isIsFirstPage();
// 是否最后一页
boolean isLastPage = pageInfo.isIsLastPage();
Mybatis多表查询
package com.demo.domain;
import lombok.Data;
@Data
public class Orders {
private Integer id;
private String ordertime;
private Double total;
private Integer uid;
private User user;
}
package com.demo.domain;
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Integer id;
private String username;
private String password;
private Date birthday;
private String sex;
private String address;
}
- 一对一(多对一)
<?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.demo.mapper.OrderMapper">
<!--一对一关联查询: 查询所有订单,与此同时还要查询出每个订单所属的用户信息-->
<resultMap id="orderMap" type="com.demo.domain.Orders">
<id property="id" column="id"></id>
<result property="ordertime" column="ordertime"></result>
<result property="total" column="total"></result>
<result property="uid" column="uid"></result>
<!--
association: 在进行一对一关联查询配置前,使用association标签进行关联
property="user": 封装实体的属性名
javaType="com.demo.domain.User" 要封装的实体的属性类型
-->
<association property="user" javaType="user">
<id property="id" column="uid" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
</association>
</resultMap>
<select id="findAllWithUser" resultMap="orderMap">
select * from orders o left join user u on o.uid = u.id
</select>
</mapper>
- 一对多
<?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.demo.mapper.UserMapper">
<resultMap id="userMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
<!--collection: 一对多使用collection标签进行关联-->
<collection property="ordersList" ofType="orders">
<id property="id" column="oid" />
<result property="ordertime" column="ordertime" />
<result property="total" column="total" />
<result property="uid" column="uid" />
</collection>
</resultMap>
<select id="findAllWithOrder" resultMap="userMap">
select u.*, o.id oid, o.ordertime, o.total, o.uid from orders o right join user u on o.uid = u.id
</select>
</mapper>
- 多对多
package com.demo.domain;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class User {
private Integer id;
private String username;
private String password;
private Date birthday;
private String sex;
private String address;
// 一个用户多个角色
private List<Role> roleList;
}
package com.demo.domain;
import lombok.Data;
@Data
public class Role {
private Integer id;
private String rolename;
private String roleDesc;
}
<?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.demo.mapper.UserMapper">
<resultMap id="userRoleMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
<collection property="roleList" ofType="role">
<id column="rid" property="id" />
<result property="rolename" column="rolename" />
<result property="roleDesc" column="roleDesc" />
</collection>
</resultMap>
<select id = "findAllWithRole" resultMap="userRoleMap">
select u.*, r.id rid, r.rolename, r.roleDesc from user u left join sys_user_role ur on ur.userid = u.id
left join sys_role r on ur.roleid = r.id
</select>
</mapper>
嵌套查询
将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一起。
- 一对一
package com.demo.domain;
import lombok.Data;
@Data
public class Orders {
private Integer id;
private String ordertime;
private Double total;
private Integer uid;
private User user;
}
<?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.demo.mapper.OrderMapper">
<resultMap id="orderMap" type="orders">
<id property="id" column="id" />
<result property="ordertime" column="ordertime" />
<result property="total" column="total" />
<result property="uid" column="uid" />
<association property="user" javaType="user" select="com.demo.mapper.UserMapper.findById" column="uid" />
</resultMap>
<!--一对一嵌套查询-->
<select id="findAllWithUser" resultMap="orderMap">
select * from orders
</select>
</mapper>
<?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.demo.mapper.UserMapper">
<!--根据id查询用户-->
<select id="findById" resultType="user" parameterType="int">
select * from user where id = #{id}
</select>
</mapper>
- 一对多
package com.demo.domain;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class User {
private Integer id;
private String username;
private String password;
private Date birthday;
private String sex;
private String address;
private List<Orders> ordersList;
}
<?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.demo.mapper.UserMapper">
<resultMap id="userOrderMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
<collection property="ordersList" ofType="orders" select="com.demo.mapper.OrderMapper.findByUid" column="id"/>
</resultMap>
<select id = "findAllWithOrder" resultMap="userOrderMap">
select * from user
</select>
</mapper>
<?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.demo.mapper.OrderMapper">
<select id="findByUid" parameterType="int" resultType="orders">
select * from orders where uid = #{uid}
</select>
</mapper>
- 多对多
package com.demo.domain;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class User {
private Integer id;
private String username;
private String password;
private Date birthday;
private String sex;
private String address;
private List<Role> roleList;
}
<?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.demo.mapper.UserMapper">
<resultMap id="userRoleMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
<collection property="roleList" ofType="role" select="com.demo.mapper.RoleMapper.findByUid" column="id"/>
</resultMap>
<select id = "findAllWithRole" resultMap="userRoleMap">
select * from user
</select>
</mapper>
<?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.demo.mapper.RoleMapper">
<select id="findByUid" resultType="role" parameterType="int">
select * from sys_role r inner join sys_user_role ur on ur.roleid = r.id
where ur.userid = #{uid}
</select>
</mapper>
相关推荐
- JDK从8升级到21的问题集(jdk8版本)
-
一、背景与挑战1.升级动因oOracle长期支持策略o现代特性需求:协程、模式匹配、ZGC等o安全性与性能的需求oAI新技术引入的版本要求2.项目情况o100+项目并行升级的协同作战o多技术栈并存o持...
- 科莱特SAP ABAP干货 | 基础篇:二、数据字典(1)
-
ABAP开发基础及应用二、数据字典(1)目标及说明目标:1、掌握SAP数据字典各种对象的定义和使用2、能根据业务数据要求,建立存储数据用的表和视图需求说明:1、在SAP中自建程序,以对一企业(自由行集...
- Mycat入门(mycatalog)
-
一、Linux系统下搭建Mycat注:如果没有服务器可以选择虚拟机进行操作1、首先准备好服务器或者虚拟机2、安装和配置MySQL数据库2.1、删除原来的数据库//查询已安装的mariadb[root...
- MySQL从入门到实战:表设计、索引优化与高频面试解析
-
一、业务场景驱动表设计:电商订单系统案例场景背景某电商平台需设计用户、商品、订单模块,要求支持以下操作:用户高频查询最新订单按商品分类+价格区间筛选商品统计每日订单金额建表实战--用户表(反范式设计...
- oracle生成AWR报告的两种方法(oracle中awr报告的输出格式有哪些)
-
方法1:sqlplus中执行:execdbms_workload_repository.create_snapshot();@?/rdbms/admin/awrrpt.sql方法2:setpage...
- Navicat Premium:数据库管理神器(navicat 本地数据库)
-
提供免费下载网站Mavom.cn在数据库管理的世界里,「NavicatPremium」是一款「一体化的数据库管理和迁移工具」,适用于MySQL、SQLServer、Oracle和PostgreSQ...
- Iperius Backup功能特色(backup如何使用)
-
备份作业:1.文件夹备份:本地的文件夹,带SMB的路径文件夹,网络路径文件夹,NAS文件夹等等2.文件备份:对某个文件进行备份3.备份镜像:可以把系统刻录成镜像用于恢复(图1)4.FTP:自带FTP...
- sql注入攻击,拿到网站账户,黑客这样神操作
-
首先的话,我们来仔细搞清楚这个攻击的流程,第一步就是了解一下,什么是sql?又什么是sql注入、sql注入的流程和步骤。1、首先什么是sql,Sql是一种数据库查询和程序设计的语言,这里的数据库是指存...
- Java 8 新特性指南(java的八大特性)
-
本教程可以在实验楼(shiyanlou.com)中在线练习。一、实验简介Java8是近年来最后起来的一个Java编程语言发行版本。Oracle在2014年3月发布了它。该版本为Java带来...
- Java系统开发从入门到精通第三讲(文字版)
-
下来我们进入数据持久化的部分,对于一个真实的业务系统,能够正常的运转离不开数据的持久化。在数据持久化这块,目前主流的还是关系型数据库(RDBMS),NoSQL(NewSQL)也有了长足发展,特别在大数...
- 扣细节:while (true) 和 for (;;) 哪个更快
-
来源:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u...
- JAVA 8 环境安装配置(java环境怎么装)
-
一、下载这里选择的是OracleJDK,首先到Oracle官网下载JDK8,以Windows10操作系统为例,若是32位系统则下载“Windowsx86”,否则64位系统下载“Windows...
- 从零开始学Java系列之最详细的Java环境变量配置教程
-
前言:在上一篇文章中,壹哥给大家重点讲解了Java实现跨平台的原理,不知道你现在有没有弄清楚呢?如果你还有疑问,可以在评论区留言~之前的三篇文章,主要是理论性的内容,其实你暂时跳过不看也是可以的,我们...
- Linux下乱码的文件名修改或删除(linux文件名乱码如何处理)
-
查看文件名#lstouch1?.txt#ll-itotal1469445217956913-rw-r--r--1oracleoinstall0Jan18...
- 「论文写作-解决方案」数据库TDE加密
-
数据是应用的核心。对于绝大多数应用,存储数据的数据库是系统日常管理的重中之重。数据库安全背景根据verizon2014年的统计数据,96%数据攻击行为是针对数据库进行的。数据库已经成为外部入侵与内部渗...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)