Mybatis一对多延迟加载实现代码解析

需求:一个用户可以有多个账户,查询用户时实现账户的延迟加载

1、用户实体类

package com.yl.bean;

import java.io.Serializable;
import java.sql.Date;
import java.util.List;

/**
 * 用户实体类
 */
public class User implements Serializable {
  private Integer id;//id
  private String username;//用户名
  private Date birthday;//生日
  private String sex;//性别
  private String address;//地址
  private List<Account> accountList;//用户所拥有的账户

  public User() {
  }

  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;
  }

  public List<Account> getAccountList() {
    return accountList;
  }

  public void setAccountList(List<Account> accountList) {
    this.accountList = accountList;
  }

  @Override
  public String toString() {
    return "User{" +
        "id=" + id +
        ", username='" + username + '\'' +
        ", birthday=" + birthday +
        ", sex='" + sex + '\'' +
        ", address='" + address + '\'' +
        '}';
  }
}

2、账户实体类

package com.yl.bean;

import java.io.Serializable;

/**
 * 账户实体类
 */
public class Account implements Serializable {
  private Integer id;//账户id
  private Integer uid;//用户id
  private Double money;//余额
  private User user;//账户所属用户

  public Account() {
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public Integer getUid() {
    return uid;
  }

  public void setUid(Integer uid) {
    this.uid = uid;
  }

  public Double getMoney() {
    return money;
  }

  public void setMoney(Double money) {
    this.money = money;
  }

  public User getUser() {
    return user;
  }

  public void setUser(User user) {
    this.user = user;
  }

  @Override
  public String toString() {
    return "Account{" +
        "id=" + id +
        ", uid=" + uid +
        ", money=" + money +
        '}';
  }
}

3、用户持久层接口

package com.yl.dao;

import com.yl.bean.User;

import java.util.List;

/**
 * 用户持久层接口
 */
public interface IUserDao {

  /**
   * 查询所有用户
   */
  List<User> queryAll();

  /**
   * 根据id查询用户
   */
  User queryById(int id);

}

4、账户持久层接口

package com.yl.dao;

import com.yl.bean.Account;
import com.yl.bean.User;

import java.util.List;

/**
 * 账户持久层接口
 */
public interface IAccountDao {

  /**
   * 查询所有账户
   */
  List<Account> queryAll();

  /**
   * 根据用户id查询账户
   */
  List<Account> queryByUid(int uid);
}

5、全局配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

  <settings>
    <!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
  </settings>

  <!--配置别名-->
  <typeAliases>
    <package name="com.yl.bean"/>
  </typeAliases>

  <!--配置mybatis环境-->
  <environments default="mysql">
    <!--配置mysql环境-->
    <environment id="mysql">
      <!--事务类型-->
      <transactionManager type="JDBC"></transactionManager>
      <!--数据源-->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&amp;serverTimezone=GMT%2B8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>

  <!--指定映射配置文件位置-->
  <mappers>
    <mapper resource="IUserDao.xml"></mapper>
    <mapper resource="IAccountDao.xml"></mapper>
  </mappers>
</configuration>

6、用户映射配置文件

<?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.yl.dao.IUserDao">
  <!--配置用户实体类和数据库的对应信息-->
  <resultMap id="userMap" type="com.yl.bean.User">
    <id property="id" column="id"></id>
    <result property="username" column="username"></result>
    <result property="birthday" column="birthday"></result>
    <result property="sex" column="sex"></result>
    <result property="address" column="address"></result>
    <!--根据id查询账户-->
    <collection property="accountList" ofType="com.yl.bean.Account" select="com.yl.dao.IAccountDao.queryByUid" column="id"></collection>
  </resultMap>

  <!--查询所有用户-->
  <select id="queryAll" resultMap="userMap">
    SELECT * FROM USER
  </select>
  <!--根据id查询用户-->
  <select id="queryById" resultType="user" parameterType="int">
    select * from user where id=#{id}
  </select>
</mapper>

7、账户映射配置文件

<?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.yl.dao.IAccountDao">
  <!--配置Account属性对应数据库信息-->
  <resultMap id="accountUserMap" type="account">
    <id property="id" column="id"></id>
    <result property="uid" column="uid"></result>
    <result property="money" column="money"></result>
    <!--通过id查询用户-->
    <association property="user" column="uid" javaType="user" select="com.yl.dao.IUserDao.queryById"></association>
  </resultMap>

  <!--查询所有账户-->
  <select id="queryAll" resultMap="accountUserMap">
    SELECT * FROM account
  </select>

  <!--根据用户id查询账户-->
  <select id="queryByUid" resultType="account" parameterType="int">
    select * from account where uid=#{uid}
  </select>
</mapper>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis关系映射之一对多和多对一

    本实例使用用户和订单的例子做说明: 一个用户可以有多个订单, 一个订单只对应一个用户.(其中应用到注释) 1.代码的结构 2. 建表语句: CREATE DATABASE test; USE test; CREATE TABLE person( personId VARCHAR(36) PRIMARY KEY, personName VARCHAR(64), personAddress VARCHAR(128), personTel VARCHAR(11) ); CREATE TABLE ord

  • Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 表:market_plan(营销计划(关联了用户)) market_plan_product(产品关联营销计划) mark

  • Mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要的小伙伴有帮助,小编主要从四个方面进行介绍,订单商品数据模型.一对一查询.一对多查询.多对多查询. 一.订单商品数据模型 1.数据库执行脚本,如下所示: <span style="font-family:Comic Sans MS;font-size:18px;">CREATE

  • Mybatis 一对多和多对一关联查询问题

    首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.util.Date; public class Student { private Integer sno; private String sname; private String ssex; private Integer sclass; private StudentMajor studentmaj

  • 通过Mybatis实现单表内一对多的数据展示示例代码

    表: 需求: 将表中的数据,按照一级二级分类返回给前端json数据 代码实现: java代码: public class ResultIndustry { private String industryFirst;//一级行业 private List<String> industrySecondList;//二级行业 mybatis代码: <select id="getResultIndustryList" resultMap="resultIndustr

  • mybatis一对多查询功能

    首先,我们还是先给出一个需求:根据订单id查询订单明细--我们知道,一个订单里面可以有多个订单的明细(需求不明确的同学,请留言或者去淘宝网上的订单处点一下就知道了).这个时候,一个订单,对应多个订单的id.这种需求出现的时候,我们应该如何查询呢? 此时我们的数据模型如下图(左)由于查询用户也是我们的需求,所以就在原有的基础上进行扩展,数据模型如下(右): 很显然,如果用resultType的方式去实现的话,是不合理的了.因为我们需要创建一个既有订单又有订单明细的pojo然后呢,我们的mybati

  • mybatis 一对一、一对多和多对多查询实例代码

    关键字:association 一对一映射(一个班级只有一个班主任) <select id="getClass" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type=&q

  • Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    前言 在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Mybatis并完成CRUD操作,这是本文操作的基础.本文先准备一个测试的数据库,然后使用MyBatis Generator进行部分代码自动生成,再以一个例子来展示稍微高级点的操作:使用Mybatis完成级联一对多的CRUD操作. 数据库准备 数据库用到三张表:user表,role表,user_ro

  • Mybatis一对多延迟加载实现代码解析

    需求:一个用户可以有多个账户,查询用户时实现账户的延迟加载 1.用户实体类 package com.yl.bean; import java.io.Serializable; import java.sql.Date; import java.util.List; /** * 用户实体类 */ public class User implements Serializable { private Integer id;//id private String username;//用户名 priv

  • Mybatis一对多关联关系映射实现过程解析

    这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List<另一方> 属性名 作为少的一方的属性. 用户和订单就是一对多的关系,从用户角度看就是一对多关系,从订单的角度来看就是多对一的关系. /** * 订单持久化类 */ public class Orders { p

  • Mybatis中的延迟加载案例解析

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

  • mybatis开启spring事务代码解析

    1.事务 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.最终都是调用数据库连接来完成事务的开启.提交和回滚. 2.模块 那么在对于spring事务而言,几个不可或缺的模块就是数据源.事务管理器以及事务编程 3.xml配置 <!--事务管理器--> <bean id="springTransactionManager" class="org.springframework.jdbc.datasourc

  • MyBatis使用动态表或列代码解析

    有时候会不可避免使用动态表或者列进行业务处理.下面学习几种动态表/列的使用方式: [1]使用预编译 即,默认值. <select id="hisNumber" parameterType="hashmap" resultType="hashmap" > select number from ${oldTableName} <!--这里使用"$"!!!--> where name=#{name} and

  • mybatis使用xml进行增删改查代码解析

    MyBatis是支持普通sql查询.存储过程和高级映射的持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用 简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录. 每一个Mybatis应用程序都以一个sqlSessionFactory对象的实例为核心. sqlSessionFactory对象的实例可以通过sqlSessionFa

  • MyBatis Mapper接受参数的四种方式代码解析

    这篇文章主要介绍了MyBatis Mapper接受参数的四种方式代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于单个参数而言,可以直接写#{param},这里的占位符名称没有限制,反正就一个参数一个占位符,不需要指定名称 对于多个参数,有常用的四种方式 根据位置排序号 public interface UserDao { public Integer addUser(String username, String password)

  • 简述Mybatis增删改查实例代码

    编写一个简单的mybatis进行插入数据的实例 1 数据库建表 其中建表dob=Date of Birth 的意思 create table students (stud_id number primary key, name varchar2(20), email varchar2(20), dob date ); Oracle数据库中出现表已创建,则表示创建成功,如果出现名称已被使用,则可在建表之前进行删除操作:drop table students;或者进行级联删除drop table s

  • Mybatis中的动态SQL语句解析

    这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配

  • Mybatis 缓存原理及失效情况解析

    这篇文章主要介绍了Mybatis 缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.什么是缓存[Cache] 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2.为什么要使用缓存 减少和数据库的交互次数,减少系统开销,提高系统效率. 3.什么样的数据需要使用缓存 经常查询且不易改变的数据

随机推荐