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

( 一 ) 一对一处理:
=============================
   <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指向.
                            ------------------------------------------------------------------------
            <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());
            }
======================================
======================================
======================================
======================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值