一、一对一查询
- 配置文件
// jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///wujun_test
jdbc.username=wujun
jdbc.password=wujun@2020
<!--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="jdbc.properties"></properties>
<!-- environments:运行环境 -->
<environments default="dev">
<!-- 一个environment代表一个环境,可以配置多个环境,例如[dev][test][prod]-->
<environment id="dev">
<!--当前事务交由JDBC进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED表示当前使用mybatis提供的数据库连接池
UNPOOLED表示不使用连接池,每次请求都会新建一个数据库连接 -->
<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="UserMapper.xml"></mapper>
</mappers>
</configuration>
<!--UserMapper.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:名称空间,与id组成sql的唯一标识-->
<mapper namespace="com.wujun.mapper.OrderMapper">
<!--手动配置实体属性与表字段的映射关系-->
<resultMap id="orderMap" type="com.wujun.pojo.Order">
<result property="id" column="id"></result>
<result property="orderName" column="order_name"></result>
<!--配置order实体中的user对象-->
<association property="user" javaType="com.wujun.pojo.User">
<result property="id" column="user_id"></result>
<result property="username" column="username"></result>
</association>
</resultMap>
<select id="findAll" resultMap="orderMap">
select * from `order` o, `user` u where o.user_id = u.id
</select>
</mapper>
- 创建两个实体类
package com.wujun.pojo;
import lombok.Data;
@Data
public class Order {
private Integer id;
private String orderName;
private User user;
}
package com.wujun.pojo;
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
}
- 创建Mapper接口
package com.wujun.mapper;
import com.wujun.pojo.Order;
import java.util.List;
public interface OrderMapper {
List<Order> findAll();
}
- 编写测试类
package com.wujun.test;
import com.wujun.mapper.OrderMapper;
import com.wujun.pojo.Order;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> all = mapper.findAll();
for (Order order : all) {
System.out.println(order);
}
}
}
- 测试结果
Order(id=1, orderName=订单1, user=User(id=1, username=吴俊1))
Order(id=2, orderName=订单2, user=User(id=2, username=吴俊2))
二、一对多查询
场景:以订单为维度,那么订单和用户的关系是一对一的,但是以用户为维度,那么用户和订单的关系就是一对多。
- 用户配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:名称空间,与id组成sql的唯一标识-->
<mapper namespace="com.wujun.mapper.UserMapper">
<!--手动配置实体属性与表字段的映射关系-->
<resultMap id="userMap" type="com.wujun.pojo.User">
<result property="id" column="userId"></result>
<result property="username" column="username"></result>
<!--配置user实体中的order集合-->
<collection property="orders" ofType="com.wujun.pojo.Order">
<result property="id" column="orderId"></result>
<result property="orderName" column="orderName"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
select u.id as userId, u.username as username, o.id as orderId, o.order_name as orderName
from `user` u left join `order` o on u.id = o.user_id
</select>
</mapper>
- 贪方便,所以在resources目录下新建一个com.wujun.mapper的文件夹,将UserMapper.xml和OrderMapper.xml都放入这个文件夹,这样就可以使用package标签进行映射了
<?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="jdbc.properties"></properties>
<!-- environments:运行环境 -->
<environments default="dev">
<!-- 一个environment代表一个环境,可以配置多个环境,例如[dev][test][prod]-->
<environment id="dev">
<!--当前事务交由JDBC进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED表示当前使用mybatis提供的数据库连接池
UNPOOLED表示不使用连接池,每次请求都会新建一个数据库连接 -->
<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="com.wujun.mapper"/>
</mappers>
</configuration>
- 实体类编写
package com.wujun.pojo;
import lombok.Data;
import java.util.List;
@Data
public class User {
private Integer id;
private String username;
private List<Order> orders;
}
- mapper接口编写
package com.wujun.mapper;
import com.wujun.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> findAll();
}
- 测试类编写
package com.wujun.test;
import com.wujun.mapper.UserMapper;
import com.wujun.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
}
- 测试结果
User(id=1, username=吴俊1, orders=[Order(id=1, orderName=订单1), Order(id=3, orderName=订单3)])
User(id=2, username=吴俊2, orders=[Order(id=2, orderName=订单2)])
User(id=3, username=吴俊3, orders=[])
三、多对多查询
场景:用户 -> 角色
一个用户可以拥有多个角色,一个角色也可以赋予多个用户
- 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:名称空间,与id组成sql的唯一标识-->
<mapper namespace="com.wujun.mapper.UserMapper">
<!--手动配置实体属性与表字段的映射关系-->
<resultMap id="userMap" type="com.wujun.pojo.User">
<result property="id" column="userId"></result>
<result property="username" column="username"></result>
<!--配置user实体中的role集合-->
<collection property="roles" ofType="com.wujun.pojo.Role">
<result property="id" column="roleId"></result>
<result property="roleName" column="roleName"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
select u.id as userId, u.username as username, r.id as roleId, r.role_name as roleName
from `user` u
left join `relation_user_role` rur on u.id = rur.user_id
left join role r on r.id = rur.role_id
</select>
</mapper>
- 测试结果
User(id=1, username=吴俊1, roles=[Role(id=1, roleName=角色1), Role(id=2, roleName=角色2)])
User(id=2, username=吴俊2, roles=[Role(id=1, roleName=角色1)])
User(id=3, username=吴俊3, roles=[])