百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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%数据攻击行为是针对数据库进行的。数据库已经成为外部入侵与内部渗...

取消回复欢迎 发表评论: