1.1 项目目录
使用注解实现复杂映射开发
1.2 一对一查询
一对一查询语句
-- 先查询订单
Select * from orders;
-- 再根据订单oid外键,查询用户
select * from user where id = #{根据订单查询的oid}
1.2.1 代码示例
sqlMapConfig.xml
<?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>
<!--在内部配置属性 -->
<properties resource="db.properties">
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="LOG4J"/>
<!--开启全局延迟加载功能-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--
因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。
为true代表开启二级缓存;为false代表不开启二级缓存。
-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--定义实体类别名-->
<typeAliases>
<package name="cn.guardwhy.domain"/>
</typeAliases>
<!-- 一个核心配置文件 -->
<environments default="default">
<!-- 其中的一个运行环境,通过id来进行标识-->
<environment id="default">
<!--事务管理器 -->
<transactionManager type="JDBC"/>
<!--数据源 -->
<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>
<package name="cn.guardwhy.dao"/>
</mappers>
</configuration>
OrderMapper接口
@Select("select * from orders")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "ordertime", property = "ordertime"),
@Result(column = "total", property = "total"),
@Result(column = "oid", property = "oid"),
@Result(property = "user", javaType = User.class, column = "oid",
one = @One(select = "cn.guardwhy.dao.UserMapper.findById", fetchType = FetchType.EAGER))
})
// 1.查询所有订单,同时查询订单所属的用户信息
List<Orders> findAllWithUser();
UserMapper接口
@Select("select * from user where id = #{id}")
@Results({
@Result(column = "id", property = "id", id = true), // 映射主键
@Result(column = "user_name", property = "username"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "sex", property = "sex"),
@Result(column = "address", property = "address")
})
// 1.通过id查询用户
User findById(Integer id);
测试代码
// 查询一个订单,与此同时查询出该订单所属的用户
@Test
public void testOrderWithUser(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
// 3.调用方法
List<Orders> list = mapper.findAllWithUser();
for (Orders orders : list) {
System.out.println(orders);
}
// 4.关闭会话
sqlSession.close();
}
1.2.2 执行结果
1.3 一对多查询
一对多查询语句
-- 先查询用户
Select * from user;
-- 再根据用户id主键,查询订单列表
select * from orders where oid = #{用户id}
1.3.1 代码示例
UserMapper接口
// 查询所有用户,及关联的订单信息
@Select("select * from user")
@Results({
@Result(column = "id", property = "id", id = true), // 映射主键
@Result(column = "user_name", property = "username"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "sex", property = "sex"),
@Result(column = "address", property = "address"),
@Result(property = "ordersList", javaType = List.class, column = "id",
many = @Many(select = "cn.guardwhy.dao.OrderMapper.findByOid"))
})
List<User> findAllWithOrders();
OrderMapper接口
// 根据传递过来的用户id,查询该用户所具有的订单信息
@Select("select * from orders where id = #{oid}")
List<Orders> findByOid(Integer oid);
测试代码
// 查询一个用户,与此同时查询出该用户具有的订单
@Test
public void testUserWithOrders(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用方法
List<User> userList = mapper.findAllWithOrders();
for (User user : userList) {
System.out.println(user);
}
}
1.3.2 执行结果
1.4 多对多查询
多对多查询语句
-- 先查询用户
select * from user;
-- 再根据用户id主键,查询角色列表
select * from role r inner join user_role ur on r.id = ur.user_id where ur.role_id = #{用户id};
1.4.1 代码示例
UserMapper接口
// 查询所有用户及关联的角色信息
@Select("select * from user")
@Results({
@Result(column = "id", property = "id", id = true), // 映射主键
@Result(column = "user_name", property = "username"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "sex", property = "sex"),
@Result(column = "address", property = "address"),
@Result(property = "roleList", javaType = List.class, column = "id",
many = @Many(select = "cn.guardwhy.dao.RoleMapper.findByOid"))
})
List<User> findAllWithRole();
RoleMapper接口
// 根据传递过来的用户id,查询该用户所具有的角色信息
@Select("select * from role r inner join user_role ur on r.id = ur.user_id where ur.role_id = #{id}")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "role_name", property = "roleName"),
@Result(column = "role_detail", property = "roleDetail")
})
List<Role> findByOid(Integer id);
测试代码
// 3.多对多查询
@Test
public void testUserWithRole(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用方法
List<User> list = mapper.findAllWithRole();
// 4.遍历操作
for (User user : list) {
System.out.println(user);
}
}