1. 配置信息
maven pom文件中增加依赖:
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.4</version>
</dependency>
<!--persistence依赖-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
在application.properties配置文件中配置
(1)开启mybatis的驼峰转换
mybatis.configuration.mapUnderscoreToCamelCase=true
(2)配置mybatis的通用mappers路径
mapper.mappers=com.server.common.mapper.CommonMapper
(3)配置mybatis的通用mapper的主键生成方式
mapper.identity=MYSQL
2. Application启动类中引入包变换
-
配置MapperScan的导入包时不要引用
import org.mybatis.spring.annotation.MapperScan
要引用
tk.mybatis.spring.annotation.MapperScan
3. Pojo实体类配置
Pojo中所有字段类型要写成封装类的类型,即long类型的数据要写成Long。
-
数据库中数据表的表名默认使用类名,驼峰转换会自动将UserInfo转换为user_info表名,若不使用默认的对应类名与表名的设置,则需要使用 @Table 为实体类Pojo配置对应于Mysql数据库中的数据表名。 比如MYSQL中有个user表,要在类前面配置表名。
@Table(name = "user") public class UserPojo {}
-
将主键设置为Id 并且设置主键的自增方式
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userId;
-
数据表中字段名默认使用Pojo中属性名的驼峰转下划线形式,如userName属性会对应数据表中user_name字段名,如果不采用默认方式来命名Pojo中属性名,则需要使用 @Column 来指定对应的数据表中的字段名。
@Column(name = "user_name") private Long userFullNameInfo;
在数据库的数据表中不存在的字段,要用 @Transient 注解标识,否则mybatis在生成动态sql语句时会因为数据库表中无对应字段而报错。
4. 定义通用Mapper接口类
自己定义通用Mapper接口,该接口继承自Mybatis的Mapper接口和MySqlMapper接口:
server.common.mapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface CommonMapper<T> extends Mapper<T>,MySqlMapper<T>{
}
注意:通用Mapper不能和业务Mapper放在同一目录下,会报错(错误信息未记录)
5. 定义业务Mapper接口,使用通用Mapper
继承通用Mapper时,必须指定明确的泛型类型。
public interface UserMapper extends CommonMapper<UserPojo> {}
6. 在代码中调用通用mapper的数据库操作方法
通用Mapper中提供的方法传入的参数一般是Pojo对象,实际的参数封装在Pojo对象内部,因此需要将Pojo中所有属性的类型定义为对象类型。
@Autowired
UserMapper userMapper
userMapper.insert(userPojo)
7. 通用Mapper的所有通用方法介绍
一、select
(1) List<T> select (T record)
说明: 根据实体中属性值查询,查询条件使用等号,所根据的属性值set进record对象中。
(2) T selectByPrimaryKey(Object key)
说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号,主键set进对应的实体对象中。
(3) List<T> selectAll()
说明:查询全部结果,select(null)方法能达到同样的效果。
(4) T selectOne(T record)
说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号,属性值set进record对象中。
(5) int selectCount(T record)
说明:根据实体中的属性查询总数,查询条件使用等号,属性值set进record实体对象中。
二、Insert
(1) int insert(T record)
说明:保存一个实体,null的属性也会保存,不会使用数据库默认值。
(2) int insertSelective(T record)
说明:保存一个实体,null的属性不会保存,会使用数据库默认值。
三、Update
(1) int updateByPrimaryKey(T record)
说明:根据主键更新实体全部字段,null值会被更新。主键值被set进record对象。
(2) int updateByPrimaryKeySelective(T record)
说明:根据主键更新属性不为null的值,主键值被set进record对象。
四、 Delete
(1) int delete(T record)
说明:根据实体属性作为条件进行删除,查询条件使用等号,属性值set进record对象。
(2) int deleteByPrimaryKey(Object key)
说明:根据主键字段进行删除,方法参数必须包含完整的主键属性,主键值set进key对象中。
五、 Example方法
下面给出一个根据componentInfoIds列表批量查询的例子:
Example modelExample = new Example(ComponentGenerateReflectPojo.class);
Example.Criteria modelCriteria = modelExample.createCriteria();
modelCriteria.andIn("resultComponentInfoId", componentInfoIds);
List<ComponentGenerateReflectPojo> modelComponentGenerateReflects = generateReflectMapper.selectByExample(modelExample);
(1)List<T> selectByExample(Object example)
说明:根据Example条件进行查询
重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
(2)int selectCountByExample(Object example)
说明:根据Example条件进行查询总数
(3)int updateByExample(@Param("record") T record, @Param("example") Object example)
说明:根据Example条件更新实体record包含的全部属性,null值会被更新
(4)int updateByExampleSelective(@Param("record") T record, @Param("example") Object example)
说明:根据Example条件更新实体record包含的不是null的属性值
(5)int deleteByExample(Object example)
说明:根据Example条件删除数据
六、 获取insert之后的自增主键
连接postgresql数据库时,要获取insert一条记录后该记录对应的自增主键,则只需要在pojo类的主键字段前增加注解:
@Id
@GeneratedValue(strategy = GenerationType.Identity, generator = "select currval('id'::regclass)")
@Column(insertable = false)
private Long id;
注解@Id用来指明该字段对应数据表中的主键;
注解@Column用来指明进行insert的pojo中该字段不需要set值
注解@GeneratedValue 参数一指明主键产生方式是自增,参数二指明返回该记录对应的当前主键信息。其中regeclass前对应的值在数据库对应的数据表属性中获取。
记录对应的主键信息在完成通用mapper的insert操作后被set进参数pojo中。