105、【JavaEE】【Mybatis】注解开发

2021-10-21  本文已影响0人  yscyber

1、概述

2、基本增删改查

MyBatis-17
CREATE TABLE xxx(
  id INT NOT NULL,
  name VARCHAR(3) NOT NULL
);
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class Xxx {

    private Integer id;

    private String name;

}
import com.yscyber.mybatis.seven.pojo.Xxx;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface XxxRepo {

    @Select("SELECT id,name" +
            " FROM xxx")
    List<Xxx> listAllXxxs();

    @Insert("INSERT INTO xxx(id,name)" +
            " VALUES(#{id},#{name})")
    int insertXxx(Xxx xxx);

    @Delete("DELETE FROM xxx" +
            " WHERE id=#{id}")
    int deleteXxxById(Integer id);

    @Update("UPDATE xxx" +
            " SET id=#{param2.id},name=#{param2.name}" +
            " WHERE id=#{param1}")
    int updateXxxById(Integer id, Xxx xxx);

}
<?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 resource="jdbc.properties"/>
    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        
        <setting name="cacheEnabled" value="true"/>

        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
    </settings>

    <typeAliases>
        <package name="com.yscyber.mybatis.seven.pojo"/>
    </typeAliases>
    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
        </plugin>
    </plugins>

    <environments default="dev">
        <!-- 配置数据源 -->
        <environment id="dev">
            <transactionManager type="JDBC" />
            <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 class="com.yscyber.mybatis.seven.repo.XxxRepo"/>
    </mappers>
    
</configuration>
    @Test
    public void test1() {
        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();

            XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);

//            List<Xxx> xxxList = xxxRepo.listAllXxxs();
//            for (Xxx xxx : xxxList) {
//                System.out.println(xxx);
//            }

//            xxxRepo.insertXxx(new Xxx(5, "..."));
//            sqlSession.commit();

//            xxxRepo.deleteXxxById(5);
//            sqlSession.commit();

//            xxxRepo.updateXxxById(10, new Xxx(10, "..."));
//            sqlSession.commit();

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

import com.yscyber.mybatis.seven.pojo.Xxx;

import org.apache.ibatis.annotations.*;

import java.util.List;

public interface XxxRepo {

    @Select("SELECT id,name" +
            " FROM xxx")
    List<Xxx> listAllXxxs();

    @Insert("INSERT INTO xxx(id,name)" +
            " VALUES(#{id},#{name})")
    int insertXxx(Xxx xxx);

    @Delete("DELETE FROM xxx" +
            " WHERE id=#{id}")
    int deleteXxxById(Integer id);

    @Update("UPDATE xxx" +
            " SET id=#{obj.id},name=#{obj.name}" +
            " WHERE id=#{id}")
    int updateXxxById(@Param("id") Integer id, @Param("obj") Xxx xxx);

}

2、复杂查询

MyBatis-18

2.1、一对一

-- 两表的主键保持一致代表一个学生

CREATE TABLE lg_student_basic_info (
basic_info_id INT,
basic_info_name VARCHAR(15) NOT NULL,
basic_info_gender CHAR(1) NOT NULL,
CONSTRAINT PRIMARY KEY pk_lg_student_basic_info(basic_info_id)
);

CREATE TABLE lg_student_extended_info (
extended_info_id INT,
extended_info_hometown_province VARCHAR(10),
CONSTRAINT PRIMARY KEY pk_lg_student_extended_info(extended_info_id)
);
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class StudentExtendedInformation {

    private Integer id;

    private String hometownProvince;

}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class StudentBasicInformation {

    private Integer id;

    private String name;

    private String gender;

    private StudentExtendedInformation extendedInformation;

}
import com.yscyber.mybatis.eight.pojo.StudentExtendedInformation;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentExtendedInformationRepo {

    @Results(id = "studentExtendedInformationResultMap", value = {
            @Result(property = "id", column = "extended_info_id", id = true),
            @Result(property = "hometownProvince", column = "extended_info_hometown_province")
    })
    @Select("SELECT extended_info_id,extended_info_hometown_province" +
            " FROM lg_student_extended_info")
    List<StudentExtendedInformation> listAllStudentExtendedInformation();


    @ResultMap("studentExtendedInformationResultMap")
    @Select("SELECT extended_info_id,extended_info_hometown_province" +
            " FROM lg_student_extended_info" +
            " WHERE extended_info_id=#{id}")
    StudentExtendedInformation getStudentExtendedInformationById(Integer id);

}
import com.yscyber.mybatis.eight.pojo.StudentBasicInformation;
import com.yscyber.mybatis.eight.pojo.StudentExtendedInformation;

import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

public interface StudentBasicInformationRepo {

    @Results(id = "studentBasicInformationResultMap", value = {
            @Result(property = "id", column = "basic_info_id", id = true),
            @Result(property = "name", column = "basic_info_name"),
            @Result(property = "gender", column = "basic_info_gender"),
            @Result(property = "extendedInformation", column = "basic_info_id", javaType = StudentExtendedInformation.class, one = @One(select = "com.yscyber.mybatis.eight.repo.StudentExtendedInformationRepo.getStudentExtendedInformationById"))
    })
    @Select("SELECT basic_info_id,basic_info_name,basic_info_gender" +
            " FROM lg_student_basic_info" +
            " WHERE basic_info_id=#{id}")
    StudentBasicInformation getStudentBasicInformationById(Integer id);

}
<?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 resource="jdbc.properties"/>
    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        
        <setting name="cacheEnabled" value="true"/>

        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
    </settings>

    <typeAliases>
        <package name="com.yscyber.mybatis.eight.pojo"/>
    </typeAliases>
    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
        </plugin>
    </plugins>

    <environments default="dev">
        <!-- 配置数据源 -->
        <environment id="dev">
            <transactionManager type="JDBC" />
            <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 class="com.yscyber.mybatis.eight.repo.StudentExtendedInformationRepo"/>
        <mapper class="com.yscyber.mybatis.eight.repo.StudentBasicInformationRepo"/>
    </mappers>
    
</configuration>
    @Test
    public void test1() {
        try {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
            SqlSession sqlSession = sqlSessionFactory.openSession();

            StudentBasicInformationRepo studentBasicInformationRepo = sqlSession.getMapper(StudentBasicInformationRepo.class);
            StudentBasicInformation studentBasicInformation = studentBasicInformationRepo.getStudentBasicInformationById(1);
            System.out.println(studentBasicInformation);

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.2、一对多

-- 一个用户多个订单

-- 用户表
CREATE TABLE lg_user (
user_id INT,
user_nickname VARCHAR(20) NOT NULL,
user_phone_number VARCHAR(20) NOT NULL,
CONSTRAINT PRIMARY KEY pk_lg_user(user_id)
);

-- 订单表
CREATE TABLE lg_order (
order_id INT,
order_account DECIMAL(8,2) NOT NULL,
order_user_id INT NOT NULL,
CONSTRAINT PRIMARY KEY pk_lg_order(order_id)
);
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.math.BigDecimal;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class Order implements Serializable {

    private static final long serialVersionUID = 7010281991983231524L;

    private Integer id;

    private BigDecimal account;

}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString()
public class User implements Serializable {

    private static final long serialVersionUID = -6402364968509046679L;

    private Integer id;

    private String nickname;

    private String phoneNumber;

    private List<Order> orderList;

}
import com.yscyber.mybatis.nine.pojo.Order;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrderRepo {

    @Results(id = "orderResultMap", value = {
            @Result(property = "id", column = "order_id", id = true),
            @Result(property = "account", column = "order_account")
    })
    @Select("SELECT order_id,order_account" +
            " FROM lg_order" +
            " WHERE order_user_id=#{userId}")
    List<Order> listOrdersByUserId(Integer userId);

}
import com.yscyber.mybatis.nine.pojo.User;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserRepo {

// “一对多”的时候,@Result 中的 javaType 使用 List.class

    @Results(id = "userResultMap", value = {
            @Result(property = "id", column = "user_id"),
            @Result(property = "nickname", column = "user_nickname"),
            @Result(property = "phoneNumber", column = "user_phone_number"),
            @Result(property = "orderList", column = "user_id", javaType = List.class, many = @Many(select = "com.yscyber.mybatis.nine.repo.OrderRepo.listOrdersByUserId")),
    })
    @Select("SELECT user_id,user_nickname,user_phone_number" +
            " FROM lg_user" +
            " WHERE user_id=#{id}")
    User getUserById(Integer id);

}
<?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 resource="jdbc.properties"/>
    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        
        <setting name="cacheEnabled" value="true"/>

        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
    </settings>

    <typeAliases>
        <package name="com.yscyber.mybatis.nine.pojo"/>
    </typeAliases>
    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
        </plugin>
    </plugins>

    <environments default="dev">
        <!-- 配置数据源 -->
        <environment id="dev">
            <transactionManager type="JDBC" />
            <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 class="com.yscyber.mybatis.nine.repo.OrderRepo"/>
        <mapper class="com.yscyber.mybatis.nine.repo.UserRepo"/>
    </mappers>
    
</configuration>
    @Test
    public void test1() {
        try {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
            SqlSession sqlSession = sqlSessionFactory.openSession();

            UserRepo userRepo = sqlSession.getMapper(UserRepo.class);

            User user = userRepo.getUserById(1);
            System.out.println(user);

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3、注解开启二级缓存

@CacheNamespace
public interface UserRepo {...}

当然,前提仍是在核心配置文件中开启二级缓存:

<setting name="cacheEnabled" value="true"/>

4、局部延迟加载

MyBatis-19
import com.yscyber.mybatis.nine.pojo.User;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface UserRepo {

    @Results(id = "userResultMap", value = {
            @Result(property = "id", column = "user_id"),
            @Result(property = "nickname", column = "user_nickname"),
            @Result(property = "phoneNumber", column = "user_phone_number"),
            @Result(property = "orderList", column = "user_id", javaType = List.class, many = @Many(select = "com.yscyber.mybatis.nine.repo.OrderRepo.listOrdersByUserId", fetchType = FetchType.DEFAULT)),
    })
    @Select("SELECT user_id,user_nickname,user_phone_number" +
            " FROM lg_user" +
            " WHERE user_id=#{id}")
    User getUserById(Integer id);

}
上一篇 下一篇

猜你喜欢

热点阅读