美文网首页
105、【JavaEE】【Mybatis】注解开发

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

作者: yscyber | 来源:发表于2021-10-21 19:56 被阅读0次

1、概述

  • 使用注解开发,就不需创建相应的映射配置文件。

  • 注解开发、映射配置文件开发各有优劣。
    注解开发和 XML 配置相比,从开发效率来说,注解编写更简单,效率更高;
    从可维护性来说,注解如果要修改,必须修改源码,会导致维护成本增加。XML 维护性更强。

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);

}

相关文章

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

    1、概述 使用注解开发,就不需创建相应的映射配置文件。 注解开发、映射配置文件开发各有优劣。注解开发和 XML 配...

  • Mybatis高级阶段

    Mybatis基于注解开发 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编...

  • 4.Mybatis-04 Mybatis 延迟加载策略,缓存及

    主要内容 Mybatis 延迟加载策略 Mybatis 缓存 Mybatis 注解开发 Mybatis 延迟加载策...

  • spring boot教程

    描述 集成mybatis 首先要引入mybatis依赖 注解式开发 编写dao层,在接口中使用注解开发。@Mapp...

  • 5/13day53_注解&分页综合练习

    回顾 MyBatis注解&综合练习 今日目标 一 MyBatis注解 ​ 这几年来注解开发越来越流行,Myba...

  • Mybatis基础 -- 注解开发

    一、Mybatis 常用注解 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少...

  • Mybatis的注解开发

    2.1 MyBatis的常用注解 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以...

  • SSM注解式开发

    Struts2 + Spring + Mybatis 注解式开发

  • MyBatis的注解开发

    MyBatis的注解开发MyBatis的映射配置除了使用xml配置以外,还支持注解配置sql语句问题: 为什么有了...

  • MyBatis--注解式开发

    MyBatis--注解式开发 MyBatis的注解,主要是用于替换映射文件。而映射文件中无非存放着增删改查的sql...

网友评论

      本文标题:105、【JavaEE】【Mybatis】注解开发

      本文链接:https://www.haomeiwen.com/subject/eoewoltx.html