2.1 简单示例

示例针对 MySql 数据库(数据库对主键影响较大,和 insert 关系密切)。

数据库有如下表:

  1. CREATE TABLE `country` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `countryname` varchar(255) DEFAULT NULL COMMENT '名称',
  4. `countrycode` varchar(255) DEFAULT NULL COMMENT '代码',
  5. PRIMARY KEY (`Id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=10011 DEFAULT CHARSET=utf8 COMMENT='国家信息';

对应的 Java 实体类型如下:

  1. public class Country {
  2. @Id
  3. private Integer id;
  4. private String countryname;
  5. private String countrycode;
  6. //省略 getter 和 setter
  7. }

最简单的情况下,只需要一个 @Id 标记字段为主键即可。数据库中的字段名和实体类的字段名是完全相同的,这中情况下实体和表可以直接映射。

提醒:如果实体类中没有一个标记 @Id 的字段,当你使用带有 ByPrimaryKey 的方法时,所有的字段会作为联合主键来使用,也就会出现类似 where id = ? and countryname = ? and countrycode = ? 的情况。

第四章会介绍代码生成器,可以自动生成上面的实体和下面的接口代码

通用 Mapper 提供了大量的通用接口,这里以最常用的 Mapper 接口为例

该实体类对应的数据库操作接口如下:

  1. import tk.mybatis.mapper.common.Mapper;
  2. public interface CountryMapper extends Mapper<Country> {
  3. }

只要配置 MyBatis 时能注册或者扫描到该接口,该接口提供的方法就都可以使用。

该接口默认继承的方法如下:

  • selectOne
  • select
  • selectAll
  • selectCount
  • selectByPrimaryKey
  • 方法太多,省略其他…

从 MyBatis 中获取该接口后就可以直接使用:

  1. //从 MyBatis 或者 Spring 中获取 countryMapper,然后调用 selectAll 方法
  2. List<Country> countries = countryMapper.selectAll();
  3. //根据主键查询
  4. Country country = countryMapper.selectByPrimaryKey(1);
  5. //或者使用对象传参,适用于1个字段或者多个字段联合主键使用
  6. Country query = new Country();
  7. query.setId(1);
  8. country = countryMapper.selectByPrimaryKey(query);

如果想要增加自己写的方法,可以直接在 CountryMapper 中增加。

1. 使用纯接口注解方式时

  1. import org.apache.ibatis.annotations.Select;
  2. import tk.mybatis.mapper.common.Mapper;
  3. public interface CountryMapper extends Mapper<Country> {
  4. @Select("select * from country where countryname = #{countryname}")
  5. Country selectByCountryName(String countryname);
  6. }

这里只是举了个简单的例子,可以是很复杂的查询。

2. 如果使用 XML 方式,需要提供接口对应的 XML 文件

例如提供了 CountryMapper.xml 文件,内容如下:

  1. <!DOCTYPE mapper
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="tk.mybatis.sample.mapper.CountryMapper">
  5. <select id="selectByCountryName" resultType="tk.mybatis.model.Country">
  6. select * from country where countryname = #{countryname}
  7. </select>
  8. </mapper>

在接口中添加对应的方法:

  1. import tk.mybatis.mapper.common.Mapper;
  2. public interface CountryMapper extends Mapper<Country> {
  3. Country selectByCountryName(String countryname);
  4. }

在接口中添加其他方法的时候和只用 MyBatis 是完全一样的,但是需要注意,在对应的 XML 中,不能出现和继承接口中同名的方法!

多态!

在接口中,只要不是通过注解来实现接口方法,接口是允许重名的,真正调用会使用通用 Mapper 提供的方法。

例如在上面 CountryMapper 中提供一个带分页的 selectAll 方法:

  1. public interface CountryMapper extends Mapper<Country> {
  2. List<Country> selectAll(RowBounds rowBounds);
  3. }

在 Java 8 的接口中通过默认方法还能增加一些简单的间接调用方法,例如:

  1. public interface CountryMapper extends Mapper<Country> {
  2. //这个示例适合参考实现对乐观锁方法封装
  3. default void updateSuccess(Country country){
  4. Assert.assertEquals(1, updateByPrimaryKey(country));
  5. }
  6. }

在不熟悉 Java 语言和 MyBatis 特性前,不要轻易使用!