前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis & 通用Mapper

MyBatis & 通用Mapper

作者头像
十毛
发布2019-03-27 15:22:58
1.4K0
发布2019-03-27 15:22:58
举报

MyBatis使用简单、灵活,但是有一些特别常用的简单SQL也要手写,很浪费时间。使用通用Mapper后可以免去这种工作,提高开发效率。

快速使用

  • 引入Jar(pom.xml)
代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>
代码语言:javascript
复制
spring.datasource.url=jdbc:mysql://localhost:3306/tenmao?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
spring.datasource.username=tenmao_user
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 实体类 (Person.java)
代码语言:javascript
复制
@Data
@Table(name = "person")
@NameStyle(Style.camelhumpAndLowercase)
public class Person {
    @javax.persistence.Id
    @KeySql(useGeneratedKeys = true)
    private Integer id;
    private String name;
    private Integer age;
    private Boolean gender;
    @ColumnType(jdbcType = JdbcType.VARCHAR, typeHandler = StringListTypeHandler.class)
    private List<String> hobbies;
}
  • Mapper接口(PersonMapper.java)
代码语言:javascript
复制
package com.tenmao.tmapper.mapper;

import com.tenmao.tmapper.domain.Person;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

@org.apache.ibatis.annotations.Mapper
public interface PersonMapper extends Mapper<Person> {
    @Select("SELECT * FROM person WHERE name=#{name}")
    Person selectByName(@Param("name") String name);

    List<Person> selectByAge(@Param("age") int age);
}
  • 使用代码
代码语言:javascript
复制
Person person = personMapper.selectByPrimaryKey(1);

优点

  • 为最常见的语句提供了内置接口,不需要写任何SQL语句。比如:
    • selectOne
    • select
    • selectAll
    • selectCount
    • selectByPrimrayKey
    • 方法太多,省略其他...
  • 针对一些稍微高级一点的查询,可以使用Example机制
代码语言:javascript
复制
Example example = new Example(Person.class);
example.createCriteria().andGreaterThan("age", 18);

List<Person> people = personMapper.selectByExample(example);

对应的SQL语句是

代码语言:javascript
复制
SELECT id,name,age,gender FROM person WHERE ( ( age > ? ) )
  • 也支持标准的MyBatis的接口使用方式 注解方式
代码语言:javascript
复制
@org.apache.ibatis.annotations.Mapper
public interface PersonMapper extends Mapper<Person> {
    @Select("SELECT * FROM person WHERE name=#{name}")
    Person selectByName(@Param("name") String name);
}

XML文件方式

  • mapper/person_mapper.xml
代码语言:javascript
复制
<mapper namespace="com.tenmao.tmapper.mapper.PersonMapper">
    <select id="selectByAge" resultType="com.tenmao.tmapper.domain.Person">
        SELECT * FROM person WHERE age=#{age}
    </select>
</mapper>
  • application.properties
代码语言:javascript
复制
mybatis.mapper-locations=classpath:mapper/*_mapper.xml

其他配置

  • 与数据库没有对应关系的字段
代码语言:javascript
复制
@Transient
private String otherThings; //非数据库表中字段
  • 配置TypeHandler
代码语言:javascript
复制
@ColumnType(typeHandler = AddressTypeHandler.class)
private Address address;

application.properties

代码语言:javascript
复制
mybatis.type-handlers-package=com.tenmao.handler

常见错误

  • personMapper.selectByPrimaryKey(1)执行的SQL语句是
代码语言:javascript
复制
Preparing: SELECT id,name,age,gender FROM person WHERE id = ? AND name = ? AND age = ? AND gender = ?
Parameters: 1(Integer), 1(Integer), 1(Integer), 1(Integer)

因为没有配置PrimaryKey,所以在Person的id上配置注解@javax.persistence.Id

代码语言:javascript
复制
@Data
public class Person {
    @javax.persistence.Id @GeneratedValue(generator = "JDBC")
    private Integer id;
    private String name;
    private Integer age;
    private Boolean gender;
}

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

推荐实践

  • 简单的SQL语句就直接使用通用mapper提供的接口
  • 另外一些特别简单的SQL也可以通过Example扩展机制完成
  • 更复杂的SQL语句,建议使用标准的MyBatis的实现方式

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速使用
  • 优点
  • 其他配置
  • 常见错误
  • 推荐实践
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档