MyBatis见解3

8.MyBatis的关联查询

8.3.一对多查询

需求:查询所有用户信息及用户关联的账户信息。

分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,此时左外连接查询比较合适。

8.3.1.pojo

package com.by.pojo;import java.io.Serializable;
import java.util.Date;
import java.util.List;public class User implements Serializable {private Integer id;private String username;private Date birthday;private String sex;private String address;private List<Account> account;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +", account=" + account +'}';}public List<Account> getAccount() {return account;}public void setAccount(List<Account> account) {this.account = account;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}

8.3.2.mapper

package com.by.dao;import com.by.pojo.User;import java.util.List;public interface UserDao {User getUserById(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<resultMap id="getUserByIdResultMap" type="user"><id column="id" property="id"></id><result column="username" property="username"></result><result column="birthday" property="birthday"></result><result column="sex" property="sex"></result><result column="address" property="address"></result><!--一对多使用collection标签指定数据的封装规则--><collection property="account" ofType="account"><id column="aid" property="id"></id><result column="uid" property="uid"></result><result column="money" property="money"></result></collection></resultMap><select id="getUserById" parameterType="int" resultMap="getUserByIdResultMap">SELECTu.*,a.id aid,a.money money,a.uid uidFROMuser uLEFT JOINaccount aONu.id=a.uidWHEREu.id=#{id}</select>

8.3.3.测试

    /*** 一对多:一个user 对 多个Account*/@Testpublic void testGetUsertById() throws IOException {UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.getUserById(41);System.out.println(user);}

8.4.多对多查询

需求:查询角色及角色赋予的用户信息。

分析:一个用户可以拥有多个角色,一个角色也可以赋予多个用户,用户和角色为双向的一对多关系,多对多关系其实我们看成是双向的一对多关系。
在这里插入图片描述
user(uid, username):王贺、万通

​ user_role(uid, rid)

role(rid, ):校长、老师、学生

8.3.1.pojo

package com.by.pojo;import java.util.List;
// 一方
public class Role {private Integer id;private String roleName;private String roleDesc;// 多方private List<User> user;@Overridepublic String toString() {return "Role{" +"id=" + id +", roleName='" + roleName + '\'' +", roleDesc='" + roleDesc + '\'' +", user=" + user +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleDesc() {return roleDesc;}public void setRoleDesc(String roleDesc) {this.roleDesc = roleDesc;}public List<User> getUser() {return user;}public void setUser(List<User> user) {this.user = user;}
}

8.3.2.mapper

package com.by.dao;import com.by.pojo.Role;public interface RoleMapper {Role getRoleById(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.RoleMapper"><resultMap id="getRoleByIdResultMap" type="role"><id column="rid" property="id"></id><result column="role_name" property="roleName"></result><result column="role_desc" property="roleDesc"></result><!--一对多使用collection标签指定数据的封装规则property="userList":pojo的属性ofType="com.by.pojo.User":集合的泛型,等价于resultType--><collection property="user" ofType="user"><id column="id" property="id"></id><result column="username" property="username"></result><result column="birthday" property="birthday"></result><result column="sex" property="sex"></result><result column="address" property="address"></result></collection></resultMap><select id="getRoleById" parameterType="int" resultMap="getRoleByIdResultMap">SELECTr.id rid,role_name,role_desc,u.*FROMuser_role urLEFT JOINrole rONur.rid=r.idLEFT JOINuser uONur.uid=u.idWHEREr.id=#{id}</select>
</mapper>

8.3.3.测试

   /*** 多对多:一个user 对 多个role   一个role 对 多个user*/@Testpublic void testGetRoletById() throws IOException {RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);Role role = roleMapper.getRoleById(1);System.out.println(role);}

9.MyBatis的延迟加载

创建工程:
在这里插入图片描述

9.1.什么是延迟加载?

开启延迟加载后,在真正使用数据的时候才发起级联查询,不用的时候不查询。

9.2.mapper

package com.by.dao;import com.by.pojo.User;import java.util.List;public interface UserDao {User getUserById2(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.UserDao"><!--id:和接口方法名保持一致resultType:和接口返回类型保持一致--><select id="findAll" resultType="com.by.pojo.User">select * from user</select><select id="getUserById" parameterType="int" resultType="user">select * from user where id=#{id}</select><resultMap id="getUserById2ResultMap" type="user"><id column="id" property="id"></id><result column="username" property="username"></result><result column="birthday" property="birthday"></result><result column="sex" property="sex"></result><result column="address" property="address"></result><!--property="accountList":pojo的属性ofType="account":集合的泛型select="com.by.mapper.AccountMapper.selectAccountByUid":要调用的select标签的idcolumn="id":传递的参数fetchType="lazy":局部开启延迟加载--><collection property="accountList" ofType="account" select="com.by.dao.AccountMapper.selectAccountById" column="id" fetchType="lazy"></collection></resultMap><select id="getUserById2" parameterType="int" resultMap="getUserById2ResultMap">SELECT * FROM user WHERE id=#{id}</select>
</mapper>

9.3.全局开启懒加载

    <!-- 全局配置延迟加载策略 --><settings><!--  打开延迟加载的开关  --><setting name="lazyLoadingEnabled" value="true"/></settings>

9.4.测试

    @Testpublic void testGetUserById2() throws IOException {UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.getUserById2(41);System.out.println(user.getUsername());List<Account> accountList = user.getAccountList();for (Account account : accountList) {System.out.println(account);}}

10.MyBatis的动态SQL

创建工程:
在这里插入图片描述

10.1.什么是动态SQL?

MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。

10.2.if标签

我们根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在id如果不为空时可以根据 id查询,如果username不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
mapper接口

package com.by.dao;import com.by.pojo.User;import java.util.List;public interface UserDao {User findAll2(User user);
}

mapper映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><select id="findAll2" parameterType="user" resultType="user">SELECT * FROM user<where><if test="id != null">AND id=#{id}</if><if test="sex != null and sex != ''">AND sex=#{sex}</if></where></select>

测试

    public void testFindAll2(){UserDao userDao = sqlSession.getMapper(UserDao.class);User user = new User();user.setId(41);user.setSex("男");System.out.println(userDao.findAll2(user));}

10.3.where标签

为了简化上面where 1=1的条件拼装,我们可以使用where标签将if标签代码块包起来,将1=1条件去掉。

若查询条件的开头为 “AND” 或 “OR”,where 标签会将它们去除。
mapper映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:隔离sql,一般是接口名称的全类名-->
<mapper namespace="com.by.dao.UserDao">
<select id="findByUser" resultType="User">select * from user<!--where标签将if标签代码块包起来去掉开头 “AND” 或 “OR--><where><if test="username!=null and username != ''">and username=#{username}</if><if test="birthday!=null">and birthday=#{birthday}</if><if test="sex!=null and sex != ''">and sex=#{sex}</if><if test="address!=null and address != ''">and address=#{address}</if></where></select></mapper>

10.4.set标签

set标签用于动态包含需要更新的列,并会删掉额外的逗号
mapper

package com.by.dao;import com.by.pojo.User;import java.util.List;public interface UserDao {void updateUserById(User user);
}
    <update id="updateUserById" parameterType="user">UPDATE user<set><if test="username != null and username != ''">username=#{username},</if></set>WHERE id=#{id}</update>

测试

    @Testpublic void testUpdateUserById(){UserDao userDao = sqlSession.getMapper(UserDao.class);User user = new User();user.setId(41);user.setUsername("杨过");userDao.updateUserById(user);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式-原型模式

目录 一、克隆羊问题 二、传统方式解决 三、基本介绍 四、浅拷贝和深拷贝 &#xff08;一&#xff09;浅拷贝介绍 &#xff08;二&#xff09;深拷贝 五、原型模式深拷贝 &#xff08;一&#xff09;重写clone方法 &#xff08;二&#xff09;对象序列化 六、注意事项…

3D模型人物换装系统(二 优化材质球合批降低DrawCall)

3D模型人物换装系统 介绍原理合批材质对比没有合批材质核心代码完整代码修改总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 本文没有考虑法线贴图合并的问题&#xff0c;因为生成法线贴图有点问题&#xff0c;放在下一篇文章解决在进行优化 如果这里不太明白换装的流程可以…

Ignite数据流处理

数据流处理 #1.概述 Ignite提供了一个数据流API&#xff0c;可用于将大量连续的数据流注入Ignite集群&#xff0c;数据流API支持容错和线性扩展&#xff0c;并为注入Ignite的数据提供了至少一次保证&#xff0c;这意味着每个条目至少会被处理一次。 数据通过与缓存关联的数据…

重学设计模式-Iterator(迭代器模式)

Iterator迭代器模式 介绍&#xff1a; 迭代器模式是一种行为型设计模式&#xff0c;它允许你在不暴露集合底层表示&#xff08;并不知道集合底层使用何种方式对数据尽心存储&#xff09;的情况下遍历集合中的元素。 这种模式提供了一种方法&#xff0c;可以顺序访问一个聚合…

java类和对象的思想概述

0.面向对象Object OOP——名人名言&#xff1a;类是写出来的&#xff0c;对象是new出来的 **> 学习面向对象的三条路线 java类以及类成员&#xff1a;&#xff08;重点&#xff09;类成员——属性、方法、构造器、&#xff08;熟悉&#xff09;代码块、内部类面向对象特征&…

文章解读与仿真程序复现思路——高电压技术EI\CSCD\北大核心《含CCUS和P2G的综合能源系统分布式鲁棒优化调度》

这个标题涉及到两个关键的能源技术领域&#xff0c;即CCUS&#xff08;Carbon Capture, Utilization, and Storage&#xff0c;碳捕捉利用与储存&#xff09;和P2G&#xff08;Power-to-Gas&#xff0c;电力转化为气体&#xff09;。同时&#xff0c;它提到了综合能源系统的分布…

Linux中文件权限

目录 一、文件类型 二、三字符的码&#xff0c;三重访问权限 三、chmod改变权限 3.1 八进制模式 3.2 符号模式 文件无权限&#xff0c;无法操作&#xff0c;有没有感觉很恼火呀&#xff1f; 下面来分析一下linux中的文件权限。 一、文件类型 - 代表文件 d 代表目录 l 代表…

EarMaster Pro 7 简体中文破解版 v7.2.0.42 电脑版

软件介绍 EarMaster破解版一款功能强大的专业级别多媒体音乐教育学习软件&#xff0c;EarMaster破解版提供了大量音乐相关的学习内容&#xff0c;用户在这里可以学习基础的和弦、音阶、节奏&#xff0c;也可以提升自己的音感&#xff0c;如果基础已经很扎实了&#xff0c;还可…

【ONE·MySQL || 基础介绍】

总言 主要内容&#xff1a;MySQL在Centos 7下的安装&#xff08;主要学习相关指令语句&#xff0c;理解安装操作是在做什么&#xff09;、对MySQL数据库有一个基础认识。 文章目录 总言0、MySQL的安装与卸载&#xff08;Centos 7&#xff09;0.1、MySQL的卸载0.1.1、卸载不必要…

FCIS 2023网络安全创新大会-核心PPT资料下载

一、峰会简介 本次会议的主题是“AI大模型、人工智能与智能制造安全、攻击面管理与供应链安全”。 1、AI大模型 会议首先探讨了AI大模型在网络安全领域的应用。AI大模型是一种基于深度学习的模型&#xff0c;具有强大的特征提取和分类能力&#xff0c;可以用于检测和防御各种…

Springboot+vue的装饰工程管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的装饰工程管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的装饰工程管理系统&#xff0c;采用M&#xff08…

RateLimiter速率了解

RateLimiter <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version> </dependency>这个同名的类在nacos的jar包中也有出现。速率限制于java.util.concurrent.Semaphore功能…