( 一 ) 一对一处理: ============================= <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()); } ====================================== ====================================== ====================================== ======================================