📖 English Documentation | 📖 中文文档
Mybatis插件,提供Mybatis处理JPA的能力。
<dependency>
<groupId>com.littlenb</groupId>
<artifactId>mybatis-jpa</artifactId>
<version>2.1.1</version>
</dependency>
对于常规的结果映射,不需要再构建ResultMap,ResultTypePlugin增加了Mybatis对结果映射(JavaBean/POJO)中JPA注解的处理。
映射规则:
-
名称匹配默认为驼峰(Java Field)与下划线(SQL Column)
-
使用@Column注解中name属性指定SQL Column
-
使用@Transient注解标记非持久化字段(不需要结果集映射的字段)
类型处理:
-
Boolean-->BooleanTypeHandler
-
Enum默认为EnumTypeHandler
使用@Enumerated(EnumType.ORDINAL) 指定为 EnumOrdinalTypeHandler
-
Enum实现ICodeEnum接口实现自定义枚举值
使用@CodeEnum(CodeType.INT) 指定为 IntCodeEnumTypeHandler
或@CodeEnum(CodeType.STRING) 指定为 StringCodeEnumTypeHandler
@CodeEnum 优先级 高于 @Enumerated
结果集嵌套:
- 支持OneToOne
- 支持OneToMany
e.g.
mybatis.xml
<configuration>
<plugins>
<plugin interceptor="com.mybatis.jpa.plugin.ResultTypePlugin">
</plugin>
</plugins>
</configuration>
JavaBean
@Entity
public class UserArchive {// <resultMap id="xxx" type="userArchive">
@Id
private Long userId;// <id property="id" column="user_id" />
/** 默认驼峰与下划线转换 */
private String userName;// <result property="username" column="user_name"/>
/** 枚举类型 */
@Enumerated(EnumType.ORDINAL)
private SexEnum sex;// <result property="sex" column="sex" typeHandler=EnumOrdinalTypeHandler/>
/** 枚举类型,自定义值 */
@CodeEnum(CodeType.INT)
private PoliticalEnum political;// <result property="political" column="political" typeHandler=IntCodeEnumTypeHandler/>
/** 属性名与列名不一致 */
@Column(name = "gmt_create")
private Date createTime;// <result property="createTime" column="gmt_create"/>
}// </resultMap>
mapper.xml
<!-- in xml,declare the resultType -->
<select id="selectById" resultType="userArchive">
SELECT * FROM t_sys_user_archive WHERE user_id = #{userId}
</select>
注册MappedStatement,基于注解,仅支持Insert和Update。
- selective: 默认值false(处理null属性)
-
selective: 默认值false(处理null属性)
-
where: SQL condition
e.g.
Spring 容器初始化完成后执行
@Service
public class DefinitionStatementInit {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@PostConstruct
public void init() {
Configuration configuration = sqlSessionFactory.getConfiguration();
StatementBuildable statementBuildable = new DefinitionStatementBuilder(configuration);
DefinitionStatementScanner.Builder builder = new DefinitionStatementScanner.Builder();
DefinitionStatementScanner definitionStatementScanner = builder.configuration(configuration).basePackages(new String[]{"com.mybatis.jpa.mapper"})
.statementBuilder(statementBuildable).build();
definitionStatementScanner.scan();
}
}
Mapper
@Mapper
@Repository
public interface UserUpdateMapper {
@InsertDefinition(selective = true)
int insert(User user);
@UpdateDefinition(selective = true, where = " user_id = #{userId}")
int updateById(User user);
}
更多示例请查看test目录代码。
QQ交流群:246912326