.Mybatis的注解开发(@Results、@Resut、@One、@Many)

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

猜你喜欢

转载自blog.csdn.net/GLOAL_COOK/article/details/113530831
今日推荐