MyBatis使用级联操作解决lombok构造方法识别失败问题

先解决一下idea无法识别lombok构造方法的问题,解决方案是在idea的插件中下载并安装lombok插件。

MyBatis级联操作,列举最简单的student-classes(学生与班级)的关系表:

create table if not exists student (
  id int primary key auto_increment,
  name varchar(20) not null comment '学生姓名',
  cid int not null comment '班级id'
);
create table if not exists classes (
  id int primary key auto_increment,
  name varchar(20) not null comment '班级名'
);

接下来,创建关系表对应的实体类:

@Data
public class Student {
  private long id;
  private String name;
  private Classes classes;
}
@Data
public class Classes {
  private long id;
  private String name;
  private List<Student> students;
}

在repository包下新建StudentRepository接口:

public interface StudentRepository {
  public Student findById(long id);
}

然后创建对应的mapper文件StudentRepository.xml:

<?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.wts.repository.StudentRepository">

  <resultMap id="studentMap" type="com.wts.entity.Student">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <association property="classes" javaType="com.wts.entity.Classes">
      <id column="cid" property="id"></id>
      <result column="cname" property="name"></result>
    </association>
  </resultMap>

  <select id="findById" parameterType="long" resultMap="studentMap">
    select s.id,s.name,c.id as cid,c.name as cname from student s,classes c where s.id = #{id} and s.cid = c.id
  </select>
</mapper>

注意这里有几个限制:

1.命名空间,xml文件的namespace必须是对应接口的全类名

2.Statement标签的id必须与接口方法相同,其中parameterType为参数,resultType为返回类型,复杂类型用resultMap

3.复杂类型resultMap中多对一用association,一堆多用集合collection

MyBatis执行sql返回的结果集会和关系对象映射起来,注意列与字段的对应关系。

然后将mapper引入:

<mappers>
  <mapper resource="com/wts/repository/StudentRepository.xml"></mapper>
</mappers>

编写测试方法:

@Test
public void test03() {
  InputStream inputStream = AppTest.class.getClassLoader().getResourceAsStream("config.xml");
  SqlSessionFactory sqlSessionFactory = (new SqlSessionFactoryBuilder()).build(inputStream);
  try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    // 级联查询
    StudentRepository studentRepository = sqlSession.getMapper(StudentRepository.class);
    System.out.println(studentRepository.findById(1L));
  }
}

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

(0)

相关推荐

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

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

  • Spring Boot整合MyBatis操作过程

    1.加入mybatis-spring-boot-stater的Maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> 2.配置数据源 在src/main/re

  • MyBatis逆向工程基本操作及代码实例

    回想一下MyBatis的基本操作,它需要实体类,自定义mapper接口以及mapper.xml配置文件.为了避免繁琐的工作量,MyBatis Generator,简称MBG,可自动生成框架所需的这些依赖,同时支持基本的CRUD操作,但是需要注意,MBG一般不要重复执行,否则会出问题. 下面是引入MBG的基本操作: 一.新建maven项目,引入依赖: <dependencies> <dependency> <groupId>org.mybatis</groupId&

  • Mybatis批量修改的操作代码

    1.修改的字段值都是一样的,id不同 <update id="batchUpdate" parameterType="String"> update cbp_order set status=1 where id in <foreach item="id" collection="array" open="(" separator="," close=")&q

  • MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步.这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了. MyBatis实现分表最简单步骤 既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表. 1.我们模拟用户表数据量超过千万(虽然实际不太可能) 2.用户表原来的名字叫做user_tab,我们切分为user_tab_0和user_t

  • Mybatis Update操作返回值问题

    后端的数据持久化使用的是 Mybatis ,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题.在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数.这下就尴尬了. 一般而言,我们知道当我们使用 Mybatis 在 mapper 接口中定义 insert delete 等操作,定义一个 int 类型的返回值,通过该值是否为 0 来判断数据库中受影响的行数进而判断操作是否成功. 到底 update 返回值代表

  • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    A:首先先看下一个简单的面试题 斐波那契数列 计算数组{1,1,2,3,5,8.......} 第30位值 规律:1 1 从第三项开始,每一项都是前两项之和 有两种实现方式  第一种方式: public class TestOne { public int TestSelf(int n){ if(n<0){ throw new IllegalArgumentException("n不能为负数"); }else if(n<=2){ return 1; }else{ retur

  • MyBatis在insert插入操作时返回主键ID的配置(推荐)

    很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键. 但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数... 接下来,我们看看MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中. MySQL用法: <insert id="insert" parameterType="com.test.User&qu

  • Mybatis 中的insertOrUpdate操作

    下面一段代码给大家介绍了Mybatis 中的insertOrUpdate操作,具体代码如下所示: <insert id="insertOrUpdate"> insert into base_person (pname, idcard, gender, nation, source_flag, create_time) values <foreach collection="list" item="p" index="i

  • MyBatis使用级联操作解决lombok构造方法识别失败问题

    先解决一下idea无法识别lombok构造方法的问题,解决方案是在idea的插件中下载并安装lombok插件. MyBatis级联操作,列举最简单的student-classes(学生与班级)的关系表: create table if not exists student ( id int primary key auto_increment, name varchar(20) not null comment '学生姓名', cid int not null comment '班级id' );

  • 下拉菜单的级联操作(ajax)

    在开发中常常会遇到菜单的级联操作,比如:国家.城市.乡镇的选择等.当选中某个国家的时候,后面的菜单会把该国家内的城市罗列出来,当选中城市的时候,后面的菜单会把对应的乡镇列出来. 解决这种菜单的级联操作的办法,我理解的有两种: ①使用js来实现,把页面所用到的级联数据放到js内,当页面加载完成后,通过js显示到对应的select内,这种方法的解决办法有很多种,最为直观的一种是放到多维数组中,每个人的思维不一样,这里就不详细解说. ②使用ajax异步动态加载,然后显示到对应的select内,这种方法

  • 浅谈mybatis 乐观锁实现,解决并发问题

    情景展示: 银行两操作员同时操作同一账户就是典型的例子. 比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为1000-50=950元,但本该为1000+100-50=1050.这就是典型的并发问题. 乐观锁机制在一定程度上解决了这个问题.乐观锁,大多是基于数据版本(Version)记录机制实现.何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 "

  • MyBatis 多表操作的实现

    1.1 一对一查询 1.1.1 概述   关系数据库中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关. 1.1.2 创建实体类 public class Student { private Integer id; private String name; private Boolean age; private String sex; private StudentStatus studentStatus; // set and get }

  • 解决IIS不识别PUT和DELETE请求

    restful API对资源的相应操作应该被体现成http动词,增删改查对应动词应为post.delete.put.get. 按照思路写出一个demo以后,运行,结果是这样的: 好吧,被拦截了,怎么设置呢?网友们的回答五花八门—— 有删除webdav模块的: <system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <

  • 解决Lombok使用@Builder无法build父类属性的问题

    目录 Lombok使用@Builder无法build父类属性 问题描述 解决方案 使用示例 lombok @Builder注解和build父类属性问题 1.简介 2.使用 3.@Builder注解对类做了什么? 4.优缺点 5.问题:@Builder注解不能 build 父类属性 Lombok使用@Builder无法build父类属性 问题描述 实体类使用Lombok的@Builder来实现Builder模式,但是如果使用了extend继承,则子类无法通过Builder来Build父类属性值 解

  • MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="

  • jQuery级联操作绑定事件实例

    级联操作绑定事件是jQuery非常具有实用价值的一个技巧,本文即以实例形式实现这一功能.分享给大家供大家参考之用.具体方法如下: 本文所述实例主要实现jQuery操作一个列表,根据类别选出学校,点击学校出现院系,点击院系出现专业,然后链接至专业申请页面. 具体功能代码如下: $("li.university").click(function(){ var id = $(this).attr("rel"); $.get("data.aspx?type=u&a

  • 解决pycharm无法识别本地site-packages的问题

    之前一直用python自带的IDLE写python程序,后来发现有一些限制啥的,于是下载了pycharm作为IDE去处理python 新建项目以后本以为能直接跑以前的代码,发现有些库无法识别,比如requests 在项目的Externale Libraries里发现site-packages这一项没有被引用到(颜色不同) 查看编译器用的是项目里面的,没注意到创建项目后每个项目都有一个python.exe 于是猜测如果换成之前本地的编译器应该可以识别之前的环境,所以想办法换编译器就好了 于是找到F

随机推荐