表:
orders表: user表:
实体类属性:
一.多表一对一配置
查询语句:select *,o.id iod from orders o,user u where o.uid=u.id
目的:把如图所示user属性封装到order实体类的user属性里
1.编写OrderMapper类->编写对应OrderMapper.xml映射文件->核心配置文件配置映射文件
<!--加载映射文件-->
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml"/>
<mapper resource="com/itheima/mapper/OrderMapper.xml"/>
</mappers>
2.编写映射文件sql语句
1.配置resultMap映射
方法1:直接使用“类型.属性”封装
<!--order使用了别名-->
<resultMap id="orderMap" type="order">
<!--
手动指定字段与实体属性的映射关系
column:数据表字段名称
property:实体的属性名称
-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<!--封装到user-->
<result column="uid" property="user.id"></result>
<result column="username" property="user.username"></result>
<result column="password" property="user.password"></result>
<result column="birthday" property="user.birthda"></result>
</resultMap>
方法2:使用<association>标签封装
<association property="user" javaType="user">
<result column="uid" property="id"/>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
</association>
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必须与接口的全限定名一致-->
<mapper namespace="com.itheima.mapper.OrderMapper">
<!--order使用了别名-->
<resultMap id="orderMap" type="order">
<!--
手动指定字段与实体属性的映射关系
column:数据表字段名称
property:实体的属性名称
-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<!--封装到user-->
<result column="uid" property="user.id"></result>
<result column="username" property="user.username"></result>
<result column="password" property="user.password"></result>
<result column="birthday" property="user.birthda"></result>
</resultMap>
<select id="findAll" resultMap="orderMap">
select *,o.id iod from orders o,user u where o.uid=u.id
</select>
</mapper>
3.测试类
@Test
public void test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace + id
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> all = mapper.findAll();
System.out.println(all);
//释放资源
sqlSession.close();
}
二.多表一对多配置
一个用户对应多个订单,一个订单只属于一个用户,查询一个用户,同时查询出该用户具有的订单
查询语句:select *,o.id oid from user u,orders o where u.id=o.uid
1.给user实体添加属性
//描述的是当前用户存在哪些订单
private List<Order> orderList;
2.编写对应的mapper类及映射文件sql语句
1.<select>标签用映射
2.结果映射使用<collection>标签封装List
<?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必须与接口的全限定名一致-->
<mapper namespace="com.itheima.mapper.UserMapper">
<resultMap id="userMap" type="user">
<id column="uid" property="id"/>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!--
配置集合信息
property:集合名称
ofType:当前集合中的类型数据
-->
<collection property="orderList" ofType="order">
<!--封装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>
3.测试类
@Test
public void test2() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace + id
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
//释放资源
sqlSession.close();
}
三.对多对查询配置
用户表和角色表过的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
select * from user u,sys_user_role ur,sys_role r where u.id=ur.userId and ur.roleId=r.id
图来自黑马程序员:
sys_role表 sys_user_role表 user表为原表
Role属性
User实体添加
1.直接上映射文件代码 测试类同上作调用方法修改即可
<resultMap id="userRoleMap" type="user">
<!--封装user的信息-->
<id column="userId" property="id"/>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!--user内部的roleList信息-->
<collection property="roleList" ofType="com.itheima.domain.Role">
<id column="roleId" property="id"/>
<result column="roleName" property="roleName"/>
<result column="roleDesc" property="roleDesc"/>
</collection>
</resultMap>
<select id="findUserAndRoleAll" resultMap="userRoleMap">
select * from user u,sys_user_role ur,sys_role r where u.id=ur.userId and ur.roleId=r.id
</select>
参考接口及配置文件
package com.itheima.mapper;
import com.itheima.domain.User;
import java.util.List;
public interface UserMapper {
public List<User> findAll();
public List<User> findUserAndRoleAll();
}
package com.itheima.mapper;
import com.itheima.domain.Order;
import java.util.List;
public interface OrderMapper {
public List<Order> findAll();
}
核心
<?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文件-->
<properties resource="jdbc.properties"></properties>
<!--定义别名-->
<typeAliases>
<typeAlias type="com.itheima.domain.User" alias="user"/>
<typeAlias type="com.itheima.domain.Order" alias="order"/>
<typeAlias type="com.itheima.domain.Role" alias="Role"/>
</typeAliases>
<!--自定义注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.itheima.handler.DateTypeHandler"/>
</typeHandlers>
<!--配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!--指定方言 例如oracle是rownum mysql是Limit-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
<!--数据源环境-->
<!--默认环境为developement-->
<environments default="developement">
<environment id="developement">
<!--配置事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源 这里使用POOLED池化方式-->
<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/itheima/mapper/UserMapper.xml"/>
<mapper resource="com/itheima/mapper/OrderMapper.xml"/>
</mappers>
</configuration>