1、基于注解的简单操作
我们可以不用xxxMapper.xml了
把sqlMapConfig.xml的
换成这个:
2.基于注解的多表操作,一对一、一对多、多对多
代码的注释可参考xml的博客:https://blog.csdn.net/GLOAL_COOK/article/details/113523359
2.1一对一
之前是在xml这样写:
现在不要xxxMapper.xml,直接在xxxMapper接口写:
package com.itheima.mapper;
import com.itheima.domain.Order;
import com.itheima.domain.Sys_user;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/1 23:12
*/
public interface OrderMapper {
@Select("select * from orders")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "uid"),
@Result(
property = "sys_user", //写你下面要封装实体(Order)的属性名称(private Sys_user sys_user)
column = "uid", //写根据哪个字段去查询sys_user表的数据,就表示这里是select * from orders查到的uid再去请求下面的findById的意思
javaType = Sys_user.class, //写你这个Result要封装的实体类型
//select属性 代表查询哪个接口的方法获得数据,前提是findById是真的的存在的方法
one = @One(select = "com.itheima.mapper.UserMapper.findById")
)
})
public List<Order> findAll(); //演示一对一,一个订单对应一个用户,全部查出来而已
}
2.2 一对多
之前这样写:
现在这样:
2.3多对多
跟1对多差不多,多个中间表而已(不用建实体类)
之前xml是这样的:
现在是这样的:
3.代码:
domain:
package com.itheima.domain;
import java.util.Date;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/1 16:32
*/
public class Order {
private int id;
private Date ordertime;
private double total;
private int uid;
@Override
public String toString() {
return "Order{" +
"id=" + id +
", ordertime=" + ordertime +
", total=" + total +
", uid=" + uid +
", sys_user=" + sys_user +
'}';
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
//当前订单属于哪个用户(外键在实体类得用对象或者对象集合岚表示),1.演示一对一
private Sys_user sys_user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public Sys_user getSys_user() {
return sys_user;
}
public void setSys_user(Sys_user sys_user) {
this.sys_user = sys_user;
}
}
package com.itheima.domain;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/1 18:22
*/
public class Role {
private int id;
private String roleName;
private String roleDesc;
@Override
public String toString() {
return "Role{" +
"id=" + id +
", roleName='" + roleName + '\'' +
", roleDesc='" + roleDesc + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDesc() {
return roleDesc;
}
public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
}
}
package com.itheima.domain;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/1/28 12:18
*/
public class Sys_user {
private int id;
private String username;
private String email;
private String password;
private String phoneNum;
private List<Order> orderList; //2.演示1对多,一个用户多个订单
private List<Role> roleList;//3.演示多对多,多个用户多个角色
@Override
public String toString() {
return "Sys_user{" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
", phoneNum='" + phoneNum + '\'' +
", orderList=" + orderList +
", roleList=" + roleList +
'}';
}
public List<Role> getRoleList() {
return roleList;
}
public void setRoleList(List<Role> roleList) {
this.roleList = roleList;
}
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
}
com.itheima.mapper:
package com.itheima.mapper;
import com.itheima.domain.Order;
import com.itheima.domain.Sys_user;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/1 23:12
*/
public interface OrderMapper {
@Select("select * from orders")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "uid"),
@Result(
property = "sys_user", //写你下面要封装实体(Order)的属性名称(private Sys_user sys_user)
column = "uid", //写根据哪个字段去查询sys_user表的数据,就表示这里是select * from orders查到的uid再去请求下面的findById的意思
javaType = Sys_user.class, //写你这个Result要封装的实体类型
//select属性 代表查询哪个接口的方法获得数据,前提是findById是真的的存在的方法
one = @One(select = "com.itheima.mapper.UserMapper.findById")
)
})
public List<Order> findAll(); //1.演示一对一,一个订单对应一个用户,全部查出来而已
@Select("select * from orders where uid=#{id}")
public List<Order> findOrderById(int id); //2.演示一对多,给UserMapper调用的,就是查到user再把它的id传给这个方法
}
package com.itheima.mapper;
import com.itheima.domain.Role;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/2 13:21
*/
public interface RoleMapper {
@Select("select * from sys_user_role ur,sys_role r where ur.roleId=r.id and ur.userId=#{id}")
public List<Role> findRoleById(int id); //3.演示多对多要的调用方法,就是根据传过来的sys_user的id查role
}
package com.itheima.mapper;
import com.itheima.domain.Sys_user;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/1/30 11:06
*/
public interface UserMapper {
@Insert("insert into sys_user values(#{id},#{username},#{email},#{password},#{phoneNum})")
public void save(Sys_user sys_user);
@Delete("delete from sys_user where id=#{id}")
public void delete(int id);
@Update("update sys_user set username=#{username} ,password=#{password} where id=#{id}")
public void update(Sys_user sys_user);
@Select("select * from sys_user where id=#{id}")
public Sys_user findById(int id);
@Select("select * from sys_user")
public List<Sys_user> findAll();
//上面都是简单的CURD操作
//2.演示1对多
@Select("select * from sys_user")
@Results({
@Result(id = true,column = "id",property = "id"), //这里加个id=true给你知道这是id而已,不加也可以的
@Result(column = "username",property = "username"),
@Result(column = "email",property = "email"),
@Result(column = "password",property = "password"),
@Result(column = "phoneNum",property = "phoneNum"),
@Result(
property = "orderList",
column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.OrderMapper.findOrderById") //前提findOrderById已创建
)
})
public List<Sys_user> findUserAndOrderAll(); //2.演示一对多,上面不懂可看1.详细解说
//3.演示多对多,这里随便把一对多的订单也查出来把
@Select("select * from sys_user")
@Results({
@Result(id = true,column = "id",property = "id"), //这里加个id=true给你知道这是id而已,不加也可以的
@Result(column = "username",property = "username"),
@Result(column = "email",property = "email"),
@Result(column = "password",property = "password"),
@Result(column = "phoneNum",property = "phoneNum"),
@Result(
//这个是随带演示1对多的订单
property = "orderList",
column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.OrderMapper.findOrderById") //前提findOrderById已创建
),
@Result(
//这个是真的多对多,查角色的
property = "roleList",
column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.RoleMapper.findRoleById") //前提findRoleById已创建
)
})
public List<Sys_user> findUserAndRoleAll();//3.演示多对多,这里随便把一对多的订单也查出来把
}
测试代码service:
package com.itheima.service;
import com.itheima.domain.Order;
import com.itheima.domain.Sys_user;
import com.itheima.mapper.OrderMapper;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/2/1 23:15
*/
public class OrderService {
private OrderMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(OrderMapper.class);
}
@Test
//1对1
public void testfindAll(){
List<Order> orderList = mapper.findAll();
for (Order order : orderList) {
System.out.println(order);
}
}
}
package com.itheima.service;
import com.itheima.domain.Sys_user;
import com.itheima.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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author QLBF
* @version 1.0
* @date 2021/1/30 11:07
*/
public class UserService{
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession=sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void testSave(){
Sys_user sys_user=new Sys_user();
sys_user.setUsername("喜洋洋");
sys_user.setPhoneNum("555522");
mapper.save(sys_user);
}
@Test
public void testUpdate(){
Sys_user sys_user=new Sys_user();
sys_user.setId(12);
sys_user.setUsername("懒洋洋");
sys_user.setPhoneNum("1111");
mapper.update(sys_user);
}
@Test
public void testDelete(){
mapper.delete(12);
}
@Test
public void testFindById(){
Sys_user sys_user = mapper.findById(3);
System.out.println(sys_user);
}
@Test
public void testFindAll(){
List<Sys_user> sys_userList = mapper.findAll();
for (Sys_user sys_user : sys_userList) {
System.out.println(sys_user);
}
}
//下面开始复杂点的了
@Test
//2.演示一对多
public void test1vsduo(){
List<Sys_user> userAndOrderAll = mapper.findUserAndOrderAll();
for (Sys_user sys_user : userAndOrderAll) {
System.out.println(sys_user);
}
}
@Test
//3.演示多对多(顺路把1对多的订单也查出来)
public void testduoduiduo(){
List<Sys_user> userAndOrderAll = mapper.findUserAndRoleAll();
for (Sys_user sys_user : userAndOrderAll) {
System.out.println(sys_user);
}
}
}
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标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--自定义别名-->
<typeAliases>
<typeAlias type="com.itheima.domain.Sys_user" alias="Sys_user"></typeAlias>
<!--这里还可以配多个-->
</typeAliases>
<!--数据源环境-->
<environments default="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--加载映射关系-->
<mappers>
<!--指定接口所在的包,自定义的包哦-->
<package name="com.itheima.mapper"></package>
</mappers>
</configuration>
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast</groupId>
<artifactId>Mybatis_day5_anno</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
4.小结
(1)这里如果是一对一封装另一个对象直接用:javaType = Sys_user.class(写你这个Result要封装的实体类型)
(2)而如果是一对多和多对多得封装为对象集合要用:javaType = List.class