基本准备
创建项目,结构如下:
创建数据库
导入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
<scope>test</scope>
</dependency>
编写实体类
public class Order {
private int id;
private Date ordertime; //下单时间
private double total; //总金额
private User user; //当前订单属于哪一个用户
}
public class User {
private int id; //用户id
private String username; //用户名称
private String password; //用户密码
private Date birthday; //用户生日
//当前用户存在那些订单
private List<Order> orderList;
//描述的是当前用户具备哪些角色
private List<Role> roleList;
}
public class Role {
private int id; //角色id
private String roleName; //角色名称
private String roleDesc; //角色描述
}
1、一对一查询
编写OrderMapper.xml文件(重点配置)
(1)方法一 使用associate标签(匹配)
<?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">
<mapper namespace="com.dhh.mapper.OrderMapper"><!--调用名称 userMapper.findAll-->
<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>
<!--匹配
property:当前实体(order)中的属性名称(private User user)
javaType:当前实体(order)中的属性的类型(User)
-->
<association property="user" javaType="user">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<select id="findAll" resultMap="orderMap">
SELECT *,o.id oid FROM orders o,user u WHERE o.uid=u.id
</select>
</mapper>
(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">
<mapper namespace="com.dhh.mapper.OrderMapper"><!--调用名称 userMapper.findAll-->
<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>
<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.birthday"></result>
</resultMap>
<select id="findAll" resultMap="orderMap">
SELECT *,o.id oid FROM orders o,user u WHERE o.uid=u.id
</select>
</mapper>
2、一对多查询
编写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">
<mapper namespace="com.dhh.mapper.UserMapper"><!--调用名称 userMapper.findAll-->
<resultMap id="userMap" type="user">
<id column="uid" property="id"></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"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
select * from user
</select>
</mapper>
3、多对多查询
编写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">
<mapper namespace="com.dhh.mapper.UserMapper"><!--调用名称 userMapper.findAll-->
<resultMap id="userRoleMap" type="user">
<!--user的信息-->
<id column="uid" property="id"></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="role">
<id column="roleId" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
</resultMap>
<select id="findUserAndRoleAll" resultMap="userRoleMap">
select * from user u,user_role ur,role r where u.id=ur.userId and ur.roleId=r.id
</select>
</mapper>
4、测试代码如下:
package com.dhh.test;
import com.dhh.domain.Order;
import com.dhh.domain.User;
import com.dhh.mapper.OrderMapper;
import com.dhh.mapper.UserMapper;
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.ArrayList;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
@Test //多对多查询测试
public void test3() 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> userAndRoleAll= mapper.findUserAndRoleAll();
for (User user:userAndRoleAll) {
System.out.println(user);
}
sqlSession.close();
}
@Test //一对多查询测试
public void test2() 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> userList= mapper.findAll();
for (User user:userList) {
System.out.println(user);
}
sqlSession.close();
}
@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> orderList=mapper.findAll();
for (Order order:orderList) {
System.out.println(order);
}
sqlSession.close();
}
}
5、小结
MyBatis多表配置方式:
一对一:使用<resultMap>做配置
一对多:使用<resultMap>+<collection>做配置
多对多:使用<resultMap>+<collection>做配置
总结:坚持很难,放弃容易,再接再厉,一起进步!