深入浅出MyBatis中映射文件和实体类的关联性
mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间、维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~:
以User对象和UserMap.xml为例讲解,代码如下:
User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略):
importcom.google.common.collect.Lists; importcom.gukeer.common.persistence.DataEntity; importcom.gukeer.modules.personal.entity.Dept; importcom.gukeer.modules.personal.entity.Staff; importcom.gukeer.modules.school.entity.School; importjava.util.Date; /** *用户Entity * *auther:cc *date:2016/9/2 */ publicclassUserextendsDataEntity<User>{ privatestaticfinallongserialVersionUID=1L; privateStringid; privateOfficecompany;//归属公司 privateOfficeoffice;//归属部门 privateStringloginName;//登录名 privateStringpassword;//密码 privateStringno;//工号 privateStringname;//姓名 privateStringemail;//邮箱 privateStringphone;//电话 privateStringmobile;//手机 privateStringuserType;//用户类型 privateStringloginIp;//最后登陆IP privateDateloginDate;//最后登陆日期 privateStringloginFlag;//是否允许登陆 privateStringphoto;//头像 privateStringqrCode;//二维码 privateStringoldLoginName;//原登录名 privateStringnewPassword;//新密码 privateStringoldLoginIp;//上次登陆IP privateDateoldLoginDate;//上次登陆日期 privateDeptdept;//部门 privateStaffstaff;//职位 privateRolerole;//根据角色查询用户条件 privateList<Role>roleList=Lists.newArrayList();//拥有角色列表 privateSchoolschool;//归属学校 privateStringremarks;//备注 privateUsercreateBy;//创建者 privateDatecreateDate;//创建日期 privateUserupdateBy;//更新者 privateDateupdateDate;//更新日期 privateStringdelFlag;//删除标记(0:正常;1:删除;2:审核) }
针对引用类型的成员变量,为了可以在查询过程中直接赋值,在映射文件中可以直接将查询结果赋值给返回的结果集:
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mappernamespace="com.gk.modules.sys.dao.UserDao"> <!--重点就是这一段,将数据库保存的id字段直接赋值给一个对象的成员变量中,比如a.company_idAS"company.id",此时后台查询回的List或User对象中的属性可以直接通过user.getCompany().getId()来获取到--> <!--当然Company中的引用类型变量也可以使用这种方法来赋值,通过LEFTJOIN可以联查多表,这是数据库查询方面的操作,这里不作讨论--> <sqlid="userColumns"> a.id, a.company_idAS"company.id", a.office_idAS"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_byAS"createBy.id", a.create_date, a.update_byAS"updateBy.id", a.update_date, a.del_flag, c.nameAS"company.name", c.parent_idAS"company.parent.id", c.parent_idsAS"company.parentIds", ca.idAS"company.area.id", ca.nameAS"company.area.name", ca.parent_idAS"company.area.parent.id", ca.parent_idsAS"company.area.parentIds", o.nameAS"office.name", o.parent_idAS"office.parent.id", o.parent_idsAS"office.parentIds", oa.idAS"office.area.id", oa.nameAS"office.area.name", oa.parent_idAS"office.area.parent.id", oa.parent_idsAS"office.area.parentIds", cu.idAS"company.primaryPerson.id", cu.nameAS"company.primaryPerson.name", cu2.idAS"company.deputyPerson.id", cu2.nameAS"company.deputyPerson.name", ou.idAS"office.primaryPerson.id", ou.nameAS"office.primaryPerson.name", ou2.idAS"office.deputyPerson.id", ou2.nameAS"office.deputyPerson.name", sc.xxlxAS"school.xxlx", sc.xxmcAS"school.xxmc" </sql> <sqlid="userJoins"> LEFTJOINsys_officecONc.id=a.company_id LEFTJOINsys_areacaONca.id=c.area_id LEFTJOINsys_officeoONo.id=a.office_id LEFTJOINsys_areaoaONoa.id=o.area_id LEFTJOINsys_usercuONcu.id=c.primary_person LEFTJOINsys_usercu2ONcu2.id=c.deputy_person LEFTJOINsys_userouONou.id=o.primary_person LEFTJOINsys_userou2ONou2.id=o.deputy_person LEFTJOINxj_schoolscONsc.id=a.school </sql> <!--查询语句,根据Id查询结果,返回类型可以直接写User,而不同配置resultMap省略编写xml的时间--> <selectid="getUserById"resultType="User"> SELECT <includerefid="userColumns"/> FROMsys_usera <includerefid="userJoins"/> WHEREa.id=#{id} </select> <!--查询语句,根据User对象来查询,这里的参数即为User变量--> <selectid="getByLoginName"resultType="User"parameterType="User"> SELECT <includerefid="userColumns"/> FROMsys_usera <includerefid="userJoins"/> WHERE a.login_name=#{loginName} ANDa.del_flag=#{DEL_FLAG_NORMAL} </select> <!--插入语句,参数肯定是User对象--> <insertid="insert"> INSERTINTOsys_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对象--> <updateid="update"> UPDATEsys_userSET 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} WHEREid=#{id} </update> <!--物理删除用户--> <updateid="delete"> DELETEFROMsys_user WHEREid=#{id} </update> <!--逻辑删除用户--> <updateid="deleteByLogic"> UPDATEsys_userSET del_flag=#{DEL_FLAG_DELETE} WHEREid=#{id} </update> </mapper>