您的位置:首页 > 其它

mybatis学习笔记 一对一 和一对多 以及 如何通过框架直接返回主键id

2018-02-21 18:09 525 查看
( 一 ) 一对一处理:
=============================
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="autoMappingBehavior" value="FULL"></setting>     深度自动映射级别设定   方便练习
</settings>
==============================

public class User {
private Integer id; //id
.... 省略部分属性...
private Integer userRole;    //用户角色         用于联表查询时的id
private Role role;   //角色           在接收返回数据的时候,将接收来自role表的相应数据

....省略封装和方法...
}
一般使用逆向生成工具后只会生成简单的pojo , 那么在实际应用中的一些需求,一对一的表与表之间的
关系需要在类中声明

==============================
在对于复杂属性封装的时候,一般会采用一个 <resultMap> 标签来接收,对返回的数据进行封装控制接收
对于复杂的类型,如:  在某个实体类中的属性出了默认的九种类型外,还有一些自定义的类型
这时,mybatis提供了 <association> 子标签来接收,
当然如果在主配置文件中开启了深度自动映射的级别,这些也可以不用配置,mybatis会自动映射到相关的属性
前提是要求属性名和列名相一致,否则需要在sql语句中使用as别名处理,避免报错
==============================
这里只一个自定义接收的数据的一个ResultMap, 其中id是用于接收数据的sql语句指定的标志
其中还可以指定javatype和jdbcType,一般为了结构更加清晰,在自定义类型的接收上我们也可以先将
自定义类型通过Resultmap封装好,指定id后在
<association property="role" javaType="Role" resultMap="roleResult"></association>   标签中的
resultMap="roleResult"    ===>  直接引用  方便多次引用,减轻相应的工作量
==============================
<resultMap id="userRoleResult" type="user">
<id property="id" column="id"></id>
<result property="userName" column="userName"/>
<result property="userCode" column="userCode"/>
<result property="userRole" column="userRole"/>
<association property="role" javaType="Role" resultMap="roleResult"></association>
</resultMap>
<resultMap id="roleResult" type="Role">
<id column="r_id" property="id"></id>
<result column="roleName" property="roleName"/>
<result column="roleCode" property="roleCode"/>
</resultMap>
==============================
resultMap   结果映射   一旦用结果映射封装好映射的结果信息后,在sql语句中应使用   resultMap="userRoleResult"
指向结果映射的id   而不是用Resulttype指向.
-------------
4000
-----------------------------------------------------------
<select id="getUserListByRoleId" parameterType="int" resultMap="userRoleResult">
select u.* ,r.id as r_id,r.roleCode,r.roleName FROM smbms_user u,smbms_role r
WHERE u.userRole=#{roleId} AND  u.userRole = r.id
</select>
--------------------------------------------------------------------------
==============================
( 二 ) 一对多
==============================
public class User {
private Integer id; //id
.... 省略部分属性...
private Integer userRole;    //用户角色         用于联表查询时的id
private list<address> listAddress;   //多个地址           返回多个地址

....省略封装和方法...
}
一般使用逆向生成工具后只会生成简单的pojo , 那么在实际应用中的一些需求,一对一的表与表之间的
关系需要在类中声明
==============================
mapper.xml映射文件..
==============================

<resultMap id="addressResult" type="address">
<id property="id" column="aid"></id>
<result property="contact" column="contact"></result>
<result property="tel" column="tel"></result>
<result property="addressDesc" column="addressDesc"></result>
<result property="postCode" column="postCode"></result>
</resultMap>
这里提取出来为了多次引用,一般建议在使用逆向工程的时候都会自己生成
------------------------------------------------------------------------------
<resultMap id="2" type="user">
<id property="id" column="id"></id>
<result property="userCode" column="userCode"></result>
<result property="userName" column="userName"></result>
<collection property="addressList" ofType="Address" resultMap="addressResult">
</collection>
</resultMap>
一对多的时候会在主表中创建多的集合,标注泛型
---------------------------------------------------------------------------------
==============================
SQL语句 :
==============================
<select id="getAddressByUserId" resultMap="2" parameterType="int">
SELECT u.*,a.id as aid ,a.contact,a.tel,a.addressDesc,a.postCode,a.userId FROM  smbms_user u,smbms_address a
WHERE u.id =a.userId
AND u.id = #{id}
</select>

==============================

返回主键值
==============================
useGeneratedKeys  = = >>>>     true
parameterType="cn.xsh.entity.User"          =====           parameterType="Map"
keyProperty="id"
_______________________________________________________________________________________________
<insert id="addUser" parameterType="cn.xsh.entity.User" keyProperty="id" useGeneratedKeys="true">
insert into user
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="name != null" >
name,
</if>
<if test="age != null" >
age,
</if>
<if test="address != null" >
address,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
<if test="age != null" >
#{age,jdbcType=INTEGER},
</if>
<if test="address != null" >
#{address,jdbcType=VARCHAR},
</if>
</trim>
</insert>
====================================
private SqlSession session = null;

@Before
public void init() throws IOException {
// SqlSession--->SqlSessionFatory----->SqlSessionFatoryBuilder
SqlSessionFactoryBuilder ssb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.cfg.xml");
SqlSessionFactory ssf = ssb.build(ins);
session = ssf.openSession();
}
@Test
public void tt(){
User user = new User();
System.out.println(user);
user.setAge(12);
int result = session.insert("cn.xsh.dao.UserMapper.addUser", user);
session.commit();
//  System.out.println("result=" + result);// result代表的是影响的行数
System.out.println("当前插入数据的主键为=" + user.getId());
}
======================================
======================================
======================================
======================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: