1、概述
-
使用注解开发,就不需创建相应的映射配置文件。
-
注解开发、映射配置文件开发各有优劣。
注解开发和 XML 配置相比,从开发效率来说,注解编写更简单,效率更高;
从可维护性来说,注解如果要修改,必须修改源码,会导致维护成本增加。XML 维护性更强。
2、基本增删改查
![](https://img.haomeiwen.com/i20052341/d04f0df5bf87b57c.jpg)
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、复杂查询
- 使用注解开发的复杂查询,形式上有些像嵌套查询。
![](https://img.haomeiwen.com/i20052341/55f1d81b447892f8.jpg)
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、局部延迟加载
- 局部高于全局仍成立。
![](https://img.haomeiwen.com/i20052341/d7812a5aa57ea7af.jpg)
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);
}
网友评论