2.1 简单示例
示例针对 MySql 数据库(数据库对主键影响较大,和 insert 关系密切)。
数据库有如下表:
CREATE TABLE `country` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`countryname` varchar(255) DEFAULT NULL COMMENT '名称',
`countrycode` varchar(255) DEFAULT NULL COMMENT '代码',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=10011 DEFAULT CHARSET=utf8 COMMENT='国家信息';
对应的 Java 实体类型如下:
public class Country {
@Id
private Integer id;
private String countryname;
private String countrycode;
//省略 getter 和 setter
}
最简单的情况下,只需要一个 @Id
标记字段为主键即可。数据库中的字段名和实体类的字段名是完全相同的,这中情况下实体和表可以直接映射。
提醒:如果实体类中没有一个标记 @Id
的字段,当你使用带有 ByPrimaryKey
的方法时,所有的字段会作为联合主键来使用,也就会出现类似 where id = ? and countryname = ? and countrycode = ?
的情况。
第四章会介绍代码生成器,可以自动生成上面的实体和下面的接口代码
通用 Mapper 提供了大量的通用接口,这里以最常用的 Mapper 接口为例
该实体类对应的数据库操作接口如下:
import tk.mybatis.mapper.common.Mapper;
public interface CountryMapper extends Mapper<Country> {
}
只要配置 MyBatis 时能注册或者扫描到该接口,该接口提供的方法就都可以使用。
该接口默认继承的方法如下:
- selectOne
- select
- selectAll
- selectCount
- selectByPrimaryKey
- 方法太多,省略其他…
从 MyBatis 中获取该接口后就可以直接使用:
//从 MyBatis 或者 Spring 中获取 countryMapper,然后调用 selectAll 方法
List<Country> countries = countryMapper.selectAll();
//根据主键查询
Country country = countryMapper.selectByPrimaryKey(1);
//或者使用对象传参,适用于1个字段或者多个字段联合主键使用
Country query = new Country();
query.setId(1);
country = countryMapper.selectByPrimaryKey(query);
如果想要增加自己写的方法,可以直接在 CountryMapper
中增加。
1. 使用纯接口注解方式时
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;
public interface CountryMapper extends Mapper<Country> {
@Select("select * from country where countryname = #{countryname}")
Country selectByCountryName(String countryname);
}
这里只是举了个简单的例子,可以是很复杂的查询。
2. 如果使用 XML 方式,需要提供接口对应的 XML 文件
例如提供了 CountryMapper.xml
文件,内容如下:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="tk.mybatis.sample.mapper.CountryMapper">
<select id="selectByCountryName" resultType="tk.mybatis.model.Country">
select * from country where countryname = #{countryname}
</select>
</mapper>
在接口中添加对应的方法:
import tk.mybatis.mapper.common.Mapper;
public interface CountryMapper extends Mapper<Country> {
Country selectByCountryName(String countryname);
}
在接口中添加其他方法的时候和只用 MyBatis 是完全一样的,但是需要注意,在对应的 XML 中,不能出现和继承接口中同名的方法!
多态!
在接口中,只要不是通过注解来实现接口方法,接口是允许重名的,真正调用会使用通用 Mapper 提供的方法。
例如在上面 CountryMapper 中提供一个带分页的 selectAll 方法:
public interface CountryMapper extends Mapper<Country> {
List<Country> selectAll(RowBounds rowBounds);
}
在 Java 8 的接口中通过默认方法还能增加一些简单的间接调用方法,例如:
public interface CountryMapper extends Mapper<Country> {
//这个示例适合参考实现对乐观锁方法封装
default void updateSuccess(Country country){
Assert.assertEquals(1, updateByPrimaryKey(country));
}
}
在不熟悉 Java 语言和 MyBatis 特性前,不要轻易使用!