推荐学习博客:
1、http://www.cnblogs.com/xdp-gacl/p/4264440.html
2、http://www.cnblogs.com/yaobolove/p/5444046.html
以前觉得hibernate的formula属性配置特别方便,作用就是说白了就是用一个查询语句动态的生成一个类的属性,数据库表又不存在这个属性,例子如下:
<hibernate-mapping> <class name="com.bsit.device.hibernate.pojo.User_info" table="user_info" > <id name="userid" type="java.lang.String"> <column name="USERID" ><comment>用户id</comment></column> <generator class="assigned"/> </id> <property name="account" type="java.lang.String"> <column name="ACCOUNT" ><comment>用户账号</comment></column> </property> <property name="username" type="java.lang.String"> <column name="USERNAME" ><comment>用户名称</comment></column> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" ><comment>密码</comment></column> </property> <property name="org_id" type="java.lang.String"> <column name="org_id" ><comment>用户所属的组织机构id</comment></column> </property> <property name="org_name" type="java.lang.String" formula="(select o.orgname from org o where o.orgid=org_id )" /> </class> </hibernate-mapping>
但本人不太喜欢hibernate,还是感觉直接sql来的爽,所以mybatis成了最爱,但此功能在mybatis中是怎样实现的呢?
<mapper namespace="com.bsit.system.mapper.Sys_userMapper" > <resultMap id="resultMap" type="com.bsit.system.model.Sys_user" > <id property="id" column="id"/> <result property="username" column="username"/> <result property="account" column="account"/> <result property="password" column="password"/> <result property="role_id" column="role_id"/> <association property="role_name" column="role_id" select="getRoleNameByRoleId"/> </resultMap> <!-- 根据id获取对象 --> <select id="getRoleNameByRoleId" parameterType="String" resultType="String"> select t.r_role_name from sys_role t where t.id = #{id} </select> <!-- 根据id获取对象 --> <select id="getSys_userById" parameterType="String" resultMap="resultMap"> select t.* from sys_user t where t.id = #{id} </select> </mapper>
service调用getSys_userById,返回值再根据关联association调用getRoleNameByRoleId,getRoleNameByRoleId方法中的参数就是association标签中column的值,
如果有多个参数,则可写成:
<association property="role_name" column="{acc=account,pas=password}" select="getRoleNameByRoleId"/> <!-- 根据id获取对象 --> <select id="getRoleNameByRoleId" parameterType="java.util.Map" resultMap="resultMap"> select t.* from sys_user t where t.account = #{acc} and t.password = #{pas} </select>
关联查询传入多值,column当map使用,是键值对形式。在具体查询语句中,直接使用其键就可以取到其值。column中如果有多个参数时,则对应的select标签的parameterType就必须是java.util.Map,或java.util.HashMap。
如果想要在对象中关联属性,则可参考推荐博客。