文章目录
MyBatis的多表操作(xml)
一对一查询
1. 一对一查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
2. 一对一查询的语句
对应的sql语句:select * from orders o,user u where o.uid=u.id;
对应的查询结果:
3. 创建Order和User实体
User实体
public class User {
private int id;//用户id
private String username;//用户名
private String password;//密码
private Date birthday;//生日
//省略set和get及ToString方法
}
Order实体
public class Order {
private int id;//订单id
private String orderTime;//订购时间
private double total;//价格
private User user;//代表当前订单从属哪一个客户
//省略set和get及ToString方法
}
4. 创建OrderMapper接口
public interface OrderMapper {
List<Order> findAll();
}
5. 配置OrderMapper.xml
<mapper namespace="com.xiafanjun.dao.OrderMapper">
<resultMap id="orderMap" type="order">
<!--
column是数据库中的字段名称
property是java封装的是实体中的属性名
-->
<id column="id" 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"/>
<result column="birthday" property="user.birthday"/>
</resultMap>
<select id="findAll" resultMap="orderMap">
select * from orders o,user u where o.uid=u.id
</select>
</mapper>
其中还可以配置如下:
<resultMap id="orderMap" type="order">
<!--
column是数据库中的字段名称
property是java封装的是实体中的属性名
-->
<id column="id" property="id"/>
<result column="ordertime" property="orderTime"/>
<result column="total" property="total"/>
<!--
property中的user是Order类中User类型的属性名
javaType中的user是com.xiafanjun.domain.Order,这里写user是因为在核心文件里起了别名叫user
-->
<association property="user" javaType="user">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
</association>
</resultMap>
第二种方式的可读性较强
核心配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--jdbc配置文件-->
<properties resource="jdbc.properties"/>
<!--定义别名-->
<typeAliases>
<typeAlias type="com.xiafanjun.domain.User" alias="user"/>
<typeAlias type="com.xiafanjun.domain.Order" alias="order"/>
</typeAliases>
<!--配置数据库环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--配置映射-->
<mappers>
<mapper resource="com/xiafanjun/mapper/userMapper.xml"/>
<mapper resource="com/xiafanjun/mapper/orderMapper.xml"/>
</mappers>
</configuration>
6. 测试结果
public void findAll() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
SqlSession sqlSession = build.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> orderList = mapper.findAll();//调用查询方法
for(Order order:orderList){//输出
System.out.println(order);
}
sqlSession.close();
}
一对多查询
1. 一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
2. 一对多查询的语句
对应的sql语句:select * from user u, orders o where u.id = o.uid;
对应的查询结果:
3. 修改User实体(Order实体不用修改)
User实体
public class User {
private int id;//用户id
private String username;//用户名
private String password;//密码
private Date birthday;//生日
private List<Order> orderList;//代表当前用户有哪些订单,一个用户可以对应多个订单
//省略set和get及ToString方法
}
4. 创建UserMapper接口
public interface UserMapper {
List<User> findAll();
}
5. 配置UserMapper.xml
<mapper namespace="com.xiafanjun.dao.UserMapper">
<resultMap id="userMap" type="user">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
<!--
封装Order实体
property是User类中,封装数据的集合的属性名
ofType是集合中的数据类型
-->
<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>
6. 测试结果
public void findAll() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用方法查询数据
List<User> userList = mapper.findAll();
for(User user:userList){
//输出用户名
System.out.println(user.getUsername());
List<Order> orderList = user.getOrderList();
for(Order order:orderList){
//输出用户的所有订单
System.out.println(order);
}
System.out.println("---------------------------S");
sqlSession.close();
}
}
多对多查询
1. 多对多查询的模型
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
2. 多对多查询的语句
对应的sql语句:select * from user u,user_role ur,role r where u.id = ur.userid and ur.roleid = r.id
查询的结果如下:
3. 创建Role实体,修改User实体
创建Role实体
public class Role {
private int id;//角色id
private String roleName;//角色名称
//省略set和get及ToString方法
}
修改User实体
public class User {
private int id;//用户id
private String username;//用户名
private String password;//密码
private Date birthday;//生日
private List<Role> roleList;//代表当前用户具备哪些角色
//省略set和get及ToString方法
}
4. 添加UserMapper接口方法
List<User> findAllUserAndRole();
5. 配置UserMapper.xml
<resultMap id="userAndRoleMap" type="user">
<id column="userid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
<!--封装Role数据-->
<collection property="roleList" ofType="role">
<id column="roleid" property="id"/>
<result column="rolename" property="roleName"/>
</collection>
</resultMap>
<select id="findAllUserAndRole" resultMap="userAndRoleMap">
select * from user u,user_role ur,role r where u.id = ur.userid and ur.roleid = r.id
</select>
6. 测试结果
public void findAllUserAndRole() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用方法查询数据
List<User> userList = mapper.findAllUserAndRole();
for(User user:userList){
//输出用户名
System.out.println(user.getUsername());
//获取角色列表
List<Role> roleList = user.getRoleList();
//输出角色
System.out.println(roleList);
sqlSession.close();
}
}
知识小结
MyBatis多表配置方式:
- 一对一配置:使用做配置
<resultMap id="orderMap" type="order">
<!--
column是数据库中的字段名称
property是java封装的是实体中的属性名
-->
<id column="id" property="id"/>
<result column="ordertime" property="orderTime"/>
<result column="total" property="total"/>
<!--
property中的user是Order类中User类型的属性名
javaType中的user是com.xiafanjun.domain.Order,这里写user是因为在核心文件里起了别名叫user
-->
<association property="user" javaType="user">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
</association>
</resultMap>
- 一对多配置:使用+做配置
<resultMap id="userMap" type="user">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
<!--
封装Order实体
property是User类中,封装数据的集合的属性名
ofType是集合中的数据类型
-->
<collection property="orderList" ofType="order">
<id column="oid" property="id"/>
<result column="ordertime" property="orderTime"/>
<result column="total" property="total"/>
</collection>
</resultMap>
- 多对多配置:使用+做配置
<resultMap id="userAndRoleMap" type="user">
<id column="userid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="birthday" property="birthday"/>
<!--封装Role数据-->
<collection property="roleList" ofType="role">
<id column="roleid" property="id"/>
<result column="rolename" property="roleName"/>
</collection>
</resultMap>