声明:内容来源于互联网,笔者主要进行了相关整理。
一、Mybatis复杂映射开发
1.1 一对一查询
一对一查询的模型(MapperScannerConfigurer)
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一的查询需求:查询一个订单,与此同时查询该订单所属的用户
创建数据库
create database my_order character set = utf8;
use my_order;
create table user(
id int(10),
username varchar(50),
password varchar(50),
birthday varchar(50),
primary key(id)
);
insert into user values (1,'zhangsan','123','153975063457');
insert into user values (2,'tom','123','153975063457');
create table orders(
id int(10),
ordertime varchar(50),
total double,
uid int(10),
primary key(id)
);
insert into orders values (1,'2019-10-12',3000,1);
insert into orders values (2,'2019-10-13',4000,1);
insert into orders values (3,'2019-10-14',5000,2);
一对一查询的语句
select * from orders o,user u where o.uid=u.id
编码过程
public class User {
private Integer id;
private String username;
private String password;
private String birthday;
//set,get,toString方法忽略
}
public class Order {
private Integer id;
private String orderTime;
private Double total;
private User user;
//set,get,toString方法忽略
}
public interface IOrderMapper {
//查询订单的同时还查询该订单所属的用户
List<Order> findOrderAndUser();
}
<mapper namespace="org.example.mybatis.high.mapper.IOrderMapper">
<resultMap id="orderMap" type="org.example.mybatis.high.pojo.Order">
<result property="id" column="id"></result>
<result property="orderTime" column="ordertime"></result>
<result property="total" column="total"></result>
<!--配置集合实体-->
<association property="user" javaType="org.example.mybatis.high.pojo.User">
<result property="id" column="uid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
</association>
</resultMap>
<!--
resultType:自动按照字段名和属性名完成映射封装。
resultMap:手动配置实体属性与表字段的映射关系。
-->
<select id="findOrderAndUser" resultMap="orderMap">
select * from orders o,user u where o.uid=u.id
</select>
</mapper>
1.2 一对多查询
一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多的查询需求:查询所有用户,与此同时查询该用户下的所有订单
一对多查询的语句
select * from user u left join orders o on u.id = o.uid
编码过程
public class User {
private Integer id;
private String username;
private String password;
private String birthday;上
private List<Order> orders = new ArrayList<>();
//set,get,toString方法忽略
}
public class Order {
private Integer id;
private String orderTime;
private Double total;
//set,get,toString方法忽略
}
public interface IUserMapper {
//查询用户的所有订单
List<User> findUserAndOrder();
}
<resultMap id="userMap" type="org.example.mybatis.high.pojo.User">
<result property="id" column="uid"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
<!--集合数据实体-->
<collection property="orders" ofType="org.example.mybatis.high.pojo.Order">
<result property="id" column="uid"></result>
<result property="orderTime" column="ordertime"></result>
<result property="total" column="total"></result>
</collection>
</resultMap>
<select id="findUserAndOrder" resultMap="userMap">
select * from user u left join orders o on u.id = o.uid
</select>
1.3多对多查询
用户表和角色表的关系为一个用户有多个角色,一个角色被多个用户使用。
多对多查询的需求:查询用户同时查询出该用户的所有角色
创建数据库表和数据
create table role(
id int(10),
rolename varchar(255),
primary key(id)
);
insert into role values (1,'CEO');
insert into role values (2,'CFO');
insert into role values (3,'COO');
create table user_role(
user_id int(10),
role_id int(10),
primary key(user_id,role_id)
);
insert into user_role values (1,1);
insert into user_role values (1,2);
insert into user_role values (2,2);
insert into user_role values (2,3);
多对多查询的语句
select u.*,r.*,r.id rid
from user u
left join user_role ur on u.id = ur.user_id
inner join role r on ur.role_id = r.id;
编码过程
List<User> findUserAndRole();
public class User {
private Integer id;
private String username;
private String password;
private String birthday;
private List<Role> roles = new ArrayList<>();
//set,get,toString方法忽略
}
public class Role {
private int id;
private String rolename;
//set,get,toString方法忽略
}
<resultMap id="roleMap" type="org.example.mybatis.high.pojo.User">
<result property="id" column="user_id"></result>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="birthday" column="birthday"></result>
<!--集合数据实体-->
<collection property="roles" ofType="org.example.mybatis.high.pojo.Role">
<result property="id" column="role_id"></result>
<result property="rolename" column="rolename"></result>
</collection>
</resultMap>
<select id="findUserAndRole" resultMap="roleMap">
select u.*,r.*,ur.* from user u left join user_role ur on u.id = ur.user_id
inner join role r on ur.role_id = r.id
</select>
编码过程中注意重复字段取值时,尽量通过关联表的外键字段来获取。避免无法区分主键。
二、Mybatis注解开发
1.Mybatis的常用注解
@Insert:新增
@Update:更新
@Delete:删除
@Select:查询
@Result:结果集封装
@Results:与@Result一起使用,封装多个结果集
@One:一对一结果集封装
@Many:一对多结果集封装
测试类中,先写入公共的方法,方便重复使用
private IUserMapper userMapper;
@Before
public void before() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userMapper = sqlSession.getMapper(IUserMapper.class);
}
2.@Insert使用
//添加用户
@Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
void addUser(User user);
@Test
public void addUser(){
User user = new User();
user.setId(3);
user.setUsername("test");
user.setPassword("1234");
user.setbirthday("12123456789");
userMapper.addUser(user);
}
3.@Update使用
//更新用户
@Update("update user set username =#{username} where id = #{id}")
void updateUser(User user);
@Test
public void updateUser(){
User user = new User();
user.setId(3);
user.setUsername("test test");
userMapper.updateUser(user);
}
4.@Delete使用
//删除用户
@Delete("delete from user where id = #{id}")
void deleteUser(Integer id);
@Test
public void deleteUser(){
userMapper.deleteUser(3);
}
5.@Select使用
//查询用户
@Select("select * from user")
List<User> findAll();
@Test
public void findUser(){
List<User> userList = userMapper.findAll();
for (User user:userList){
System.out.println(user);
}
}
6.@One使用
//查询订单及用户信息
@Results({
@Result(property = "id",column = "id"),
@Result(property = "orderTime",column = "orderTime"),
@Result(property = "total",column = "total"),
@Result(property = "user",column = "uid",javaType = User.class,
one = @One(select = "org.example.mybatis.high.mapper.IUserMapper.findUserById"))
})
@Select("select * from orders")
List<Order> findUserAndOrderByAnnotation();
@Test
public void findUserAndOrderByAnnotation() {
List<Order> orderList = orderMapper.findUserAndOrderByAnnotation();
for(Order order:orderList){
System.out.println(order);
}
}
7.@Many使用
//查询用户的所有订单
@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(property = "orders",column = "id",javaType = List.class,
many = @Many(select = "org.example.mybatis.high.mapper.IOrderMapper.findOrderByUid"))
})
@Select("select * from user")
List<User> findUserAndOrderByAnnotation();
//根据用户id查询订单
@Select("select * from orders where uid = #{uid}")
List<Order> findOrderByUid(int uid);
@Test
public void findUserAndOrderByAnnotation() {
List<User> userList = userMapper.findUserAndOrderByAnnotation();
for(User user:userList){
System.out.println(user);
}
}
8.多对多
//查询用户的同时还查询用户对应的权限信息
@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(property = "roles",column = "id",javaType = List.class,
many = @Many(select = "org.example.mybatis.high.mapper.IRoleMapper.findRoleByUid"))
})
@Select("select * from user")
List<User> findUserAndRoleByAnnotation();
@Select("select * from role r,user_role ur where r.id = ur.role_id and ur.user_id = #{uid}")
List<Role> findRoleByUid(int uid);
@Test
public void findUserAndRoleByAnnotation() {
List<User> userList = userMapper.findUserAndRoleByAnnotation();
for(User user:userList){
System.out.println(user);
}
}