MyEclipse2015整合SSM框架:详解Mybatis逆向工程配置一对一关联表,查询结果排序问题

简介: MyEclipse2015整合SSM框架:详解Mybatis逆向工程配置一对一关联表,查询结果排序问题http://www.bieryun.com/3343.html 先说问题:在搭建SSM(Spring+SpringMVC+Mybatis)框架,从后台数据库查询出数据提供给前端页面进行分页显示时候,发现分页查询出来的结果在前端页面上显示并不是按照主键 id 排序的,而是先按照关联表id,也就是主表外键的 id 分成不同的部门(我这里是employee 和 department) ,每个部门中再按照 id 顺序显示记录。

MyEclipse2015整合SSM框架:详解Mybatis逆向工程配置一对一关联表,查询结果排序问题http://www.bieryun.com/3343.html

先说问题:在搭建SSM(Spring+SpringMVC+Mybatis)框架,从后台数据库查询出数据提供给前端页面进行分页显示时候,发现分页查询出来的结果在前端页面上显示并不是按照主键 id 排序的,而是先按照关联表id,也就是主表外键的 id 分成不同的部门(我这里是employee 和 department) ,每个部门中再按照 id 顺序显示记录。

这样导致主键 id 为 2的反而跑到了查询结果的后面,或是在插入新的数据,由于排序显示问题,可能不能出现在列表的最后面,导致不容易找到刚刚插入的记录。

其中,我想按照 emp_id(employeeid) 这个主键顺序排列查询的记录,显示到页面上

默认出现的问题如图:

表的关联结构如图:

修改后的效果如图:

 

解决思路:开始认为是 pageHelper 这个分页插件,在分页的时候对于记录按照某种规则排列了,最后经过测试,mybatis生成逆向工程时候 配置sql 语句 如果不指定 order by XX ,就会按照上述情况排序。其中,实现一对一关联的sql 查询语句有两种写法:

  1. SELECT * FROM tbl_emp e, tbl_dept d WHERE e.d_id = d.dept_id
  2.  
  3.  
  4. SELECT* FROM tbl_emp e LEFT JOIN tbl_dept d ON e.d_id = d.dept_id
  5.  

解决步骤:Mybatis逆向工程配置以及dao层增删改查测试参见:

https://blog.csdn.net/weixin_38533896/article/details/79866813

这里主要是写如何在 mybatis 映射文件 实现一对一关联的sql 并设置order by 属性,排序查询结果

 

1.  mybatis 逆向工程生成的目录结构如下,包括bean 、dao  以及 mapper文件夹下的sql 映射文件

2. 在com.lbc.crud.bean 包中的 Employee.java 中添加Department 属性以及相应的 get 、set 方法

 

  1. private Department department;
  2.  
  3. public Department getDepartment() {
  4.     return department;
  5. }
  6.  
  7. public void setDepartment(Department department) {
  8.     this.department = department;
  9. }

 

3.  在 com.lbc.crud.dao 包中的EmployeeMapper.java 中添加 员工 关联 部门的查询接口

  1. List<Employee> selectByExampleWithDept(EmployeeExample example);
  2.  
  3. Employee selectByPrimaryKeyWithDept(Integer empId);

4. 在mapper 文件夹下 EmployeeMapper.xml 将对应的sql 语句填入,这里直接copy 了整个映射文件select 相关语句

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.lbc.crud.dao.EmployeeMapper">
  4.  
  5.     <resultMap id="BaseResultMap" type="com.lbc.crud.bean.Employee">
  6.         <id column="emp_id" jdbcType="INTEGER" property="empId" />
  7.         <result column="emp_name" jdbcType="VARCHAR" property="empName" />
  8.         <result column="gender" jdbcType="CHAR" property="gender" />
  9.         <result column="email" jdbcType="VARCHAR" property="email" />
  10.         <result column="d_id" jdbcType="INTEGER" property="dId" />
  11.     </resultMap>
  12.  
  13.     <resultMap id="WithDeptResultMap" type="com.lbc.crud.bean.Employee">
  14.         <id column="emp_id" jdbcType="INTEGER" property="empId" />
  15.         <result column="emp_name" jdbcType="VARCHAR" property="empName" />
  16.         <result column="gender" jdbcType="CHAR" property="gender" />
  17.         <result column="email" jdbcType="VARCHAR" property="email" />
  18.         <result column="d_id" jdbcType="INTEGER" property="dId" />
  19.         <!-- 指定联合查询出部门字段的封装 -->
  20.         <association javaType="com.lbc.crud.bean.Department" property="department">
  21.             <id column="dept_id" property="deptId" />
  22.             <result column="dept_name" property="deptName" />
  23.         </association>
  24.     </resultMap>
  25.  
  26.     <sql id="Example_Where_Clause">
  27.         <where>
  28.             <foreach collection="oredCriteria" item="criteria" separator="or">
  29.                 <if test="criteria.valid">
  30.                     <trim prefix="(" prefixOverrides="and" suffix=")">
  31.                         <foreach collection="criteria.criteria" item="criterion">
  32.                             <choose>
  33.                                 <when test="criterion.noValue">
  34.                                     and ${criterion.condition}
  35.                                 </when>
  36.                                 <when test="criterion.singleValue">
  37.                                     and ${criterion.condition} #{criterion.value}
  38.                                 </when>
  39.                                 <when test="criterion.betweenValue">
  40.                                     and ${criterion.condition} #{criterion.value}
  41.                                     and
  42.                                     #{criterion.secondValue}
  43.                                 </when>
  44.                                 <when test="criterion.listValue">
  45.                                     and ${criterion.condition}
  46.                                     <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
  47.                                         #{listItem}
  48.                                     </foreach>
  49.                                 </when>
  50.                             </choose>
  51.                         </foreach>
  52.                     </trim>
  53.                 </if>
  54.             </foreach>
  55.         </where>
  56.     </sql>
  57.     <sql id="Update_By_Example_Where_Clause">
  58.         <where>
  59.             <foreach collection="example.oredCriteria" item="criteria" separator="or">
  60.                 <if test="criteria.valid">
  61.                     <trim prefix="(" prefixOverrides="and" suffix=")">
  62.                         <foreach collection="criteria.criteria" item="criterion">
  63.                             <choose>
  64.                                 <when test="criterion.noValue">
  65.                                     and ${criterion.condition}
  66.                                 </when>
  67.                                 <when test="criterion.singleValue">
  68.                                     and ${criterion.condition} #{criterion.value}
  69.                                 </when>
  70.                                 <when test="criterion.betweenValue">
  71.                                     and ${criterion.condition} #{criterion.value}
  72.                                     and
  73.                                     #{criterion.secondValue}
  74.                                 </when>
  75.                                 <when test="criterion.listValue">
  76.                                     and ${criterion.condition}
  77.                                     <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
  78.                                         #{listItem}
  79.                                     </foreach>
  80.                                 </when>
  81.                             </choose>
  82.                         </foreach>
  83.                     </trim>
  84.                 </if>
  85.             </foreach>
  86.         </where>
  87.     </sql>
  88.     <sql id="Base_Column_List">
  89.         emp_id, emp_name, gender, email, d_id
  90.     </sql>
  91.     <sql id="WithDept_Colume_List">
  92.         e.emp_id, e.emp_name, e.gender, e.email, e.d_id, d.dept_id,
  93.         d.dept_name
  94.     </sql>
  95.     <select id="selectByExampleWithDept" resultMap="WithDeptResultMap">
  96.         select
  97.         <if test="distinct">
  98.             distinct
  99.         </if>
  100.         <include refid="WithDept_Colume_List" />
  101.         from tbl_emp e, tbl_dept d where e.d_id = d.dept_id
  102.         <if test="_parameter != null">
  103.             <include refid="Example_Where_Clause" />
  104.         </if>
  105.         <if test="orderByClause != null">
  106.             order by ${orderByClause}
  107.         </if>
  108.     </select>
  109.     <select id="selectByPrimaryKeyWithDept" resultMap="WithDeptResultMap">
  110.         select
  111.         <include refid="WithDept_Colume_List" />
  112.         from tbl_emp e left join tbl_dept d on e.d_id = d.dept_id
  113.         where emp_id
  114.         = #{empId,jdbcType=INTEGER}
  115.     </select>
  116.     <select id="selectByExample" parameterType="com.lbc.crud.bean.EmployeeExample" resultMap="BaseResultMap">
  117.         select
  118.         <if test="distinct">
  119.             distinct
  120.         </if>
  121.         <include refid="Base_Column_List" />
  122.         from tbl_emp
  123.         <if test="_parameter != null">
  124.             <include refid="Example_Where_Clause" />
  125.         </if>
  126.         <if test="orderByClause != null">
  127.             order by ${orderByClause}
  128.         </if>
  129.     </select>
  130.     <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
  131.         select
  132.         <include refid="Base_Column_List" />
  133.         from tbl_emp
  134.         where emp_id = #{empId,jdbcType=INTEGER}
  135.     </select>
  136.  
  137. </mapper>

5. 编写MapperTest.java 进行联合查询的测试,顺带通过employeeExample.setOrderByClause() 方法,给查询结果指定排序顺序,这里是通过emp_id 默认以升序排序

  1. @Test
  2. public void testEmpSelectByExampleNull(){
  3.     EmployeeExample employeeExample = new EmployeeExample();
  4.     // 如果不指定order by id,将默认按照其他方式排序查询结果
  5.     employeeExample.setOrderByClause("emp_id");
  6.  
  7.     List<Employee> listTeammembers =employeeMapper.selectByExampleWithDept(employeeExample);
  8.     for(Employee e : listTeammembers){
  9.         System.out.println(e);
  10.     }
  11. }

PS: 给sql 提供更多的查询条件在 com.lbc.crud.bean 包的 EmployeeExample.java 中,需要使用更复杂的查询条件,可以在里面寻找合适的方法

原文地址https://blog.csdn.net/weixin_38533896/article/details/79926139

相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
192 8
|
25天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
14 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
1月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
40 1
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
118 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
353 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
17 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
下一篇
无影云桌面