一对一
-
定义一个用户user表(id, username, password)
定义一个订单orders表 (id, ordertime, total, uid)
-
在domain包中编写User和Order类
- Order中有属性
private User user;
- Order中有属性
-
在dao包中编写UserMapper、OrderMapper接口,并在OrderMapper中定义findAll方法
-
编写UserMapper.xml和OrderMapper.xml文件,并在OrderMapper.xml实现联合查询
- resultType改成resultMap
- resultMap中定义联合查询字段和实体属性的映射关系
<mapper namespace="com.dao.OrderMapper"> <resultMap id="orderMap" type="order"> <!-- 手动指定字段与实体属性的映射关系--> <id column="oid" property="id"/> <result column="ordertime" property="ordertime"/> <result column="total" property="total"/> <result column="uid" property="user.id"/> <result column="username" property="user.username"/> <result column="password" property="user.password"/> </resultMap> <!--联合查询--> <select id="findAll" resultMap="orderMap"> select *, o.id oid from user u, orders o where o.uid=u.id </select> </mapper>
-
定义核心配置文件
-
测试
// 获取核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获取session工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 获得session会话对象 SqlSession sqlSession = sqlSessionFactory.openSession(); OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); // 执行操作(参数就是配置文件中的id) List<Order> all = mapper.findAll(); for (Order o : all) { System.out.println(o); } // 释放资源 sqlSession.close();
一对一2
OrderMapper.xml映射文件中,第二种联合数据的封装方式:
- 有些鸡肋,个人感觉上面那种更简单。
<mapper namespace="com.dao.OrderMapper">
<resultMap id="orderMap" type="order">
<!-- 手动指定字段与实体属性的映射关系-->
<id column="oid" property="id"/>
<result column="ordertime" property="ordertime"/>
<result column="total" property="total"/>
<!-- 属性为user, javaType表示User实体-->
<association property="user" javaType="user">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
</association>
</resultMap>
<!--联合查询-->
<select id="findAll" resultMap="orderMap">
select *, o.id oid from user u, orders o where o.uid=u.id
</select>
</mapper>
一对多
用到的数据表和上面一样,因为一个用户可以有多个订单。
-
在User类中定义订单属性
private List<Order> orderList;
-
在UserMapper接口中定义
findAll
方法 -
在UserMapper.xml中写查询
<mapper namespace="com.dao.UserMapper"> <resultMap id="userMap" type="user"> <id column="uid" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <!-- 订单集合--> <collection property="orderList" ofType="order"> <id column="oid" property="id"/> <result column="ordertime" property="ordertime"/> <result column="total" property="total"/> </collection> </resultMap> <!--联合查询--> <select id="findAll" resultMap="userMap"> select *, o.id oid from user u, orders o where u.id=o.uid </select> </mapper>
-
测试
多对多
多对多关系需要引入一个中间表,所以有三个数据表:一个用户对应多个角色,一个角色对应多个用户
user(id, username, password)
user_role(user_id, role_id)
role(id, rolename)
多对多形式上和一对多一样。主要代码如下:
-
建上面三个表
-
编写Role和User类,并在User中定义属性角色集合
private List<Role> roleList;
-
在UserMapper接口中定义方法
public List<User> findAllUserAndRole();
-
定义UserMapper.xml映射文件
<mapper> <resultMap id="userRoleMap" type="user"> <id column="userId" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <collection property="roleList" ofType="role"> <id column="roleId" property="id"/> <result column="rolename" property="rolename"/> </collection> </resultMap> <select id="findAllUserAndRole" resultMap="userRoleMap"> select * from user u, role r, user_role ur where u.id=ur.userId and r.id=ur.roleId </select> </mapper>
-
定义核心配置文件
-
测试