Data Access 之 MyBatis(八)- MyBatis 通用 Mapper(Part D)(上)

简介: Data Access 之 MyBatis(八)- MyBatis 通用 Mapper(Part D)

八、通用Mapper的二级缓存

8.1 通用Mapper缓存测试

在PorscheMapperTest测试类中增加一个testCache测试方法

@Test
public void testCache(){
    // 第一次执行selectAll
    List<Porsche> porscheList = porscheMapper.selectAll();
    for (int i = 0; i < 3; i++) {
        System.out.println("第一次查询到的前三条:" + porscheList.get(i).getPorName());
    }
    // 第二次执行selectAll
    List<Porsche> porsches = porscheMapper.selectAll();
    for (int i = 0; i < 3; i++) {
        System.out.println("第二次查询到的前三条:" + porsches.get(i).getPorName());
    }
}
复制代码

执行测试

image.png

调用了两次selectAll方法,控制台输出了两条SQL语句,说明并没有直接从缓存中提取数据

8.2 通用Mapper二级缓存配置

通用Mapper二级缓存的开启与原生MyBatis二级缓存的开启有相同的地方也有不同的地方

相同点:

  • 都需要在MyBatis全局配置文件中开启二级缓存
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
复制代码
  • 都需要Entity实体类实现Serializable接口

不同点

  • 原生MyBatis还需要在Mapper XML中的mapper标签下添加cache标签
  • 通用Mapper由于没有Mapper XML,所以他的做法是在Mapper接口上增加@CacheNamespace,以实现同样的效果

原生MyBatis的一级缓存和二级缓存可以参考QA 由浅入深持久层框架(七)- MyBatis Cache

配置完成之后再次对PorscheMapperTest中的testCache方法执行测试

image.png

九、通用Mapper的TypeHandler

9.1 简单类型和复杂类型

基本数据类型与引用数据类型

  • 基本数据类型:byte、short、int、long、double、float、char、boolean
  • 引用数据类型:接口、类、数组、枚举

简单类型与复杂类型

  • 简单类型:只有一个值的类型
  • 复杂类型:多个简单类型组合起来

9.2 通用Mapper处理复杂类型数据

9.2.1 搭建common-mapper-typehandler项目

新建一个项目common-mapper-typehandler,项目依赖以及配置文件可以参考common-mapper项目。

创建table_user表,并插入一条数据

DROP TABLE IF EXISTS `table_user`;
CREATE TABLE `table_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  `season` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of table_user
-- ----------------------------
BEGIN;
INSERT INTO `table_user` VALUES (1, 'stark', 'State of New York,New York City,Marbury Street', 'SPRING');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
复制代码

entity中创建User、Address实体类以及SeasonEnum枚举类

@Data
@Table(name = "table_user")
public class User {
    @Id
    private Integer userId;
    private String userName;
    private Address address;
    private SeasonEnum season;
}
复制代码
@Data
public class Address {
    private String province;
    private String city;
    private String street;
}
复制代码
public enum SeasonEnum {
    SPRING("spring"),SUMMER("summer"),AUTUMN("autumn"),WINTER("winter");
    private String seasonName;
    private SeasonEnum(String seasonName){
        this.seasonName = seasonName;
    }
    public String getSeasonName(){
        return this.seasonName;
    }
    public String toString(){
        return this.seasonName;
    }
}
复制代码

User实体类中Integer和String可以称作简单类型,Address和SeasonEnum属性可以称为复杂类型。

新建mapper包,增加UserMapper接口并继承通用Mapper的Mapper接口

public interface UserMapper extends Mapper<User> {
}
复制代码

新建service及impl包,增加UserService接口以及UserServiceImpl实现类,新增getUserById方法

public interface UserService {
    User getUserById(Integer id);
}
复制代码
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User getUserById(Integer id) {
        return userMapper.selectByPrimaryKey(id);
    }
}
复制代码

在test包中新增UserServiceTest,对UserService中的getUserById方法进行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")
public class UserServiceTest {
    @Autowired
    private UserService userService;
    @Test
    public void getUserById() {
        User user = userService.getUserById(1);
        System.out.println("查询到的内容为:" + user);
    }
}
复制代码

执行测试

image.png

输出的User对象address属性和season属性都是空的

这是因为通用Mapper默认把复杂类型Address和SeasonEnum忽略掉了,默认只处理简单类型

再来试试insert方法,在UserServiceTest中增加saveUser方法的测试

@Test
public void saveUser(){
    User use = new User();
    use.setUserName("banner");
    Address address = new Address();
    address.setProvince("State of New York");
    address.setCity("New York City");
    address.setStreet("Unkown");
    use.setAddress(address);
    use.setSeason(SeasonEnum.SPRING);
    userService.saveUser(use);
}
复制代码

执行测试

image.png

INSERT语句中address字段和season字段的值是null

通用Mapper默认情况下会忽略复杂类型,对复杂类型不进行“从类到表”的映射


相关文章
|
2月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
109 1
|
5月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
110 10
|
7月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
6月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
103 1
|
7月前
|
XML Java 数据库连接
Mybatis 模块拆份带来的 Mapper 扫描问题
Mybatis 模块拆份带来的 Mapper 扫描问题
70 0
|
8月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
8月前
|
Java 数据库连接 Maven
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
|
9月前
|
SQL Java 数据库连接
Mybatis如何使用mapper代理开发
Mybatis如何使用mapper代理开发
|
9月前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
732 0
|
9月前
|
SQL Java 数据库连接
Mybatis中一对多mapper配置
Mybatis中一对多mapper配置
130 0