深入浅出MyBatis中映射文件和实体类的关联性

 更新时间:2016年09月03日 11:27:44   作者:代码书生  
这篇文章主要介绍了MyBatis中映射文件和实体类的关联性的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下

mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间、维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~:

以User对象和UserMap.xml为例讲解,代码如下:

User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略):

import com.google.common.collect.Lists;
import com.gukeer.common.persistence.DataEntity;
import com.gukeer.modules.personal.entity.Dept;
import com.gukeer.modules.personal.entity.Staff;
import com.gukeer.modules.school.entity.School;
import java.util.Date;
/**
* 用户Entity
*
* auther:cc
* date:2016/9/2
*/
public class User extends DataEntity<User> {
private static final long serialVersionUID = 1L;
private String id;
private Office company; // 归属公司
private Office office; // 归属部门
private String loginName;// 登录名
private String password;// 密码
private String no; // 工号
private String name; // 姓名
private String email; // 邮箱
private String phone; // 电话
private String mobile; // 手机
private String userType;// 用户类型
private String loginIp; // 最后登陆IP
private Date loginDate; // 最后登陆日期
private String loginFlag; // 是否允许登陆
private String photo; // 头像
private String qrCode; // 二维码
private String oldLoginName;// 原登录名
private String newPassword; // 新密码
private String oldLoginIp; // 上次登陆IP
private Date oldLoginDate; // 上次登陆日期
private Dept dept;  //部门
private Staff staff;  //职位
private Role role; // 根据角色查询用户条件
private List<Role> roleList = Lists.newArrayList(); // 拥有角色列表
private School school; //归属学校
private String remarks; // 备注
private User createBy; // 创建者
private Date createDate; // 创建日期
private User updateBy; // 更新者
private Date updateDate; // 更新日期
private String delFlag; // 删除标记(0:正常;1:删除;2:审核)
}

针对引用类型的成员变量,为了可以在查询过程中直接赋值,在映射文件中可以直接将查询结果赋值给返回的结果集:

<?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.gk.modules.sys.dao.UserDao">
  <!-- 重点就是这一段,将数据库保存的id字段直接赋值给一个对象的成员变量中,比如a.company_id AS "company.id",此时后台查询回的List或User对象中的属性可以直接通过user.getCompany().getId()来获取到-->
  <!-- 当然Company中的引用类型变量也可以使用这种方法来赋值,通过LEFT JOIN可以联查多表,这是数据库查询方面的操作,这里不作讨论 -->
<sql id="userColumns">
a.id,
a.company_id AS "company.id",
a.office_id AS "office.id",
a.login_name,
a.password,
a.no,
a.name,
a.email,
a.phone,
a.mobile,
a.user_type,
a.login_ip,
a.login_date,
a.remarks,
a.login_flag,
a.photo,
a.qrcode,
a.create_by AS "createBy.id",
a.create_date,
a.update_by AS "updateBy.id",
a.update_date,
a.del_flag,
c.name AS "company.name",
c.parent_id AS "company.parent.id",
c.parent_ids AS "company.parentIds",
ca.id AS "company.area.id",
ca.name AS "company.area.name",
ca.parent_id AS "company.area.parent.id",
ca.parent_ids AS "company.area.parentIds",
o.name AS "office.name",
o.parent_id AS "office.parent.id",
o.parent_ids AS "office.parentIds",
oa.id AS "office.area.id",
oa.name AS "office.area.name",
oa.parent_id AS "office.area.parent.id",
oa.parent_ids AS "office.area.parentIds",
cu.id AS "company.primaryPerson.id",
cu.name AS "company.primaryPerson.name",
cu2.id AS "company.deputyPerson.id",
cu2.name AS "company.deputyPerson.name",
ou.id AS "office.primaryPerson.id",
ou.name AS "office.primaryPerson.name",
ou2.id AS "office.deputyPerson.id",
ou2.name AS "office.deputyPerson.name",
sc.xxlx AS "school.xxlx",
sc.xxmc AS "school.xxmc"
</sql>
<sql id="userJoins">
LEFT JOIN sys_office c ON c.id = a.company_id
LEFT JOIN sys_area ca ON ca.id = c.area_id
LEFT JOIN sys_office o ON o.id = a.office_id
LEFT JOIN sys_area oa ON oa.id = o.area_id
LEFT JOIN sys_user cu ON cu.id = c.primary_person
LEFT JOIN sys_user cu2 ON cu2.id = c.deputy_person
LEFT JOIN sys_user ou ON ou.id = o.primary_person
LEFT JOIN sys_user ou2 ON ou2.id = o.deputy_person
LEFT JOIN xj_school sc ON sc.id = a.school
</sql>
<!-- 查询语句,根据Id查询结果,返回类型可以直接写User,而不同配置resultMap省略编写xml的时间 -->
<select id="getUserById" resultType="User">
SELECT
<include refid="userColumns"/>
FROM sys_user a
<include refid="userJoins"/>
WHERE a.id = #{id}
</select>
<!-- 查询语句,根据User对象来查询,这里的参数即为User变量 -->
<select id="getByLoginName" resultType="User" parameterType="User">
SELECT
<include refid="userColumns"/>
FROM sys_user a
<include refid="userJoins"/>
WHERE 
     a.login_name = #{loginName} 
     AND a.del_flag = #{DEL_FLAG_NORMAL}
</select>
<!-- 插入语句,参数肯定是User对象 -->
<insert id="insert">
INSERT INTO sys_user(
id, 
company_id, 
office_id, 
login_name, 
password, 
no, 
name, 
email, 
phone, 
mobile, 
user_type, 
create_by, 
create_date, 
update_by, 
update_date, 
remarks, 
login_flag, 
photo, 
qrcode,
del_flag,
dept_id,
staff_id,
school
) VALUES (
#{id}, 
#{company.id}, 
#{office.id}, 
#{loginName}, 
#{password}, 
#{no}, 
#{name}, 
#{email}, 
#{phone}, 
#{mobile}, 
#{userType}, 
#{createBy.id}, 
#{createDate}, 
#{updateBy.id}, 
#{updateDate}, 
#{remarks}, 
#{loginFlag}, 
#{photo}, 
#{qrCode},
#{delFlag},
#{dept.id},
#{staff.id},
#{school.id}
)
</insert>
<!-- 更新语句,参数也是User对象 -->
<update id="update">
UPDATE sys_user SET 
company_id = #{company.id}, 
office_id = #{office.id}, 
login_name = #{loginName}, 
password = #{password}, 
no = #{no}, 
name = #{name}, 
email = #{email}, 
phone = #{phone}, 
mobile = #{mobile}, 
user_type = #{userType}, 
update_by = #{updateBy.id}, 
update_date = #{updateDate}, 
remarks = #{remarks},
login_flag = #{loginFlag},
photo = #{photo},
qrcode = #{qrCode},
school = #{school.id}
WHERE id = #{id}
</update>
<!-- 物理删除用户 -->
<update id="delete">
DELETE FROM sys_user 
WHERE id = #{id}
</update>
<!-- 逻辑删除用户 -->
<update id="deleteByLogic">
UPDATE sys_user SET 
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
</mapper>

相关文章

  • Jexcel实现按一定规则分割excel文件的方法

    Jexcel实现按一定规则分割excel文件的方法

    这篇文章主要介绍了Jexcel实现按一定规则分割excel文件的方法,涉及java操作Excel文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java 并发编程的可见性、有序性和原子性

    Java 并发编程的可见性、有序性和原子性

    这篇文章主要介绍了Java 并发编程的可见性、有序性和原子性的相关资料,帮助大家更好的理解和学习Java并发编程,感兴趣的朋友可以了解下。
    2020-11-11
  • 探讨Java 将Markdown文件转换为Word和PDF文档

    探讨Java 将Markdown文件转换为Word和PDF文档

    这篇文章主要介绍了Java 将Markdown文件转换为Word和PDF文档,本文通过分步指南及代码示例展示了如何将 Markdown 文件转换为 Word 文档和 PDF 文件,需要的朋友可以参考下
    2024-07-07
  • 深入理解Java并发编程之LinkedBlockingQueue队列

    深入理解Java并发编程之LinkedBlockingQueue队列

    本文主要介绍了Java并发编程之LinkedBlockingQueue队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • JAVA异常信息Exception e及e的相关方法解读

    JAVA异常信息Exception e及e的相关方法解读

    这篇文章主要介绍了JAVA异常信息Exception e及e的相关方法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java异常处理机制深入理解

    Java异常处理机制深入理解

    如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返回任何值。另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器
    2022-01-01
  • spring cloud实现Eureka注册中心的HA的方法

    spring cloud实现Eureka注册中心的HA的方法

    本篇文章主要介绍了spring cloud实现Eureka注册中心的HA的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

    亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

    这篇文章主要介绍了亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java多线程编程中synchronized关键字的基础用法讲解

    Java多线程编程中synchronized关键字的基础用法讲解

    Java的synchronized关键字用于修饰线程同步,用以线程资源共享的目的等,下面就带来简单的Java多线程编程中synchronized关键字的基础用法讲解
    2016-06-06
  • Json在Struts中的转换与传递方法

    Json在Struts中的转换与传递方法

    下面小编就为大家带来一篇Json在Struts中的转换与传递方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论