MyBatis使用簡單、靈活鸦泳,但是有一些特別常用的簡單SQL也要手寫冯丙,很浪費(fèi)時(shí)間肉瓦。使用通用Mapper后可以免去這種工作,提高開發(fā)效率胃惜。
快速使用
- 引入Jar(
pom.xml
)
<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>
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
- 實(shí)體類 (
Person.java
)
@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
)
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);
}
- 使用代碼
Person person = personMapper.selectByPrimaryKey(1);
優(yōu)點(diǎn)
-
為最常見的語句提供了內(nèi)置接口泞莉,不需要寫任何SQL語句。比如:
- selectOne
- select
- selectAll
- selectCount
- selectByPrimrayKey
- 方法太多船殉,省略其他...
針對一些稍微高級一點(diǎn)的查詢鲫趁,可以使用Example機(jī)制
Example example = new Example(Person.class);
example.createCriteria().andGreaterThan("age", 18);
List<Person> people = personMapper.selectByExample(example);
對應(yīng)的SQL語句是
SELECT id,name,age,gender FROM person WHERE ( ( age > ? ) )
- 也支持標(biāo)準(zhǔn)的MyBatis的接口使用方式
注解方式
@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
<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
mybatis.mapper-locations=classpath:mapper/*_mapper.xml
其他配置
- 與數(shù)據(jù)庫沒有對應(yīng)關(guān)系的字段
@Transient
private String otherThings; //非數(shù)據(jù)庫表中字段
- 配置TypeHandler
@ColumnType(typeHandler = AddressTypeHandler.class)
private Address address;
application.properties
mybatis.type-handlers-package=com.tenmao.handler
常見錯(cuò)誤
-
personMapper.selectByPrimaryKey(1)
執(zhí)行的SQL語句是
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)
因?yàn)闆]有配置PrimaryKey,所以在Person的id上配置注解@javax.persistence.Id
@Data
public class Person {
@javax.persistence.Id @GeneratedValue(generator = "JDBC")
private Integer id;
private String name;
private Integer age;
private Boolean gender;
}
提醒:如果實(shí)體類中沒有一個(gè)標(biāo)記
@Id
的字段捺弦,當(dāng)你使用帶有ByPrimaryKey
的方法時(shí)饮寞,所有的字段會(huì)作為聯(lián)合主鍵來使用,也就會(huì)出現(xiàn)類似where id = ? and countryname = ? and countrycode = ?
的情況列吼。
推薦實(shí)踐
- 簡單的SQL語句就直接使用通用mapper提供的接口
- 另外一些特別簡單的SQL也可以通過Example擴(kuò)展機(jī)制完成
- 更復(fù)雜的SQL語句幽崩,建議使用標(biāo)準(zhǔn)的MyBatis的實(shí)現(xiàn)方式