通用mapper的使用步骤:
1、添加依赖:mapper-spring-boot-starter
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2、配置连接数据库的四个参数
server: port: ${port:9091} spring: application: name: user-service datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/springcloud username: root password: 123456 mybatis: type-aliases-package: com.zwhxpp.user.pojo
因为用了Common Mapper,所以要指定别名包的扫描
3、编写启动类,在启动类中通过@MapperScan配置包扫描,扫描mapper包中的UserMapper接口
@SpringBootApplication @MapperScan("com.zwhxpp.user.mapper") @EnableDiscoveryClient public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } }
注意:@MapperScan是tk.mybatis包下的。import tk.mybatis.spring.annotation.MapperScan;
4、编写实体类
@Data @Table(name = "tb_user") public class User{ @Id @KeySql(useGeneratedKeys = true)//开启主键自动回填 private Long id; private String userName;// 用户名 private String password;// 密码 private String name;// 姓名 private Integer age;// 年龄 private Integer sex;// 性别,1男性,2女性 private Date birthday; // 出生日期 private Date created;// 创建时间 private Date updated;// 更新时间 private String note;// 备注 }
由于是直接与数据库交互,所以要用到Common Mapper中的注解:@Table、@Id、@KeySQL
import tk.mybatis.mapper.annotation.KeySql;
@KeySql(useGeneratedKeys = true)//开启主键自动回填
当主键是自增的情况下,添加一条记录的同时,其主键是不能使用的,但是有时我们需要该主键,我们设置useGeneratedKeys="true",这样在之后的java代码中我们就可以获取该主键对应的对象的属性值。useGeneratedKeys 取值范围true|false 默认值是:false。 含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。
5、编写UserMapper接口,去操作数据库
import com.zwhxpp.user.pojo.User; import tk.mybatis.mapper.common.Mapper; public interface UserMapper extends Mapper<User> { }
6、编写UserService类,调用Mapper接口的方法进行数据库操作
@Service public class UserService { @Autowired private UserMapper userMapper; public User queryById(Long id){ User user = userMapper.selectByPrimaryKey(id); System.out.println(user); return user; } }
7、编写UserController
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User queryById(@PathVariable Long id){ /*try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }*/ User user = userService.queryById(id); return user; } }
通用Mapper的方法:
BaseMapper
@RegisterMapper public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker { }
@RegisterMapper
public interface BaseMapper<T> extends BaseSelectMapper<T>, BaseInsertMapper<T>, BaseUpdateMapper<T>, BaseDeleteMapper<T> {
}
@RegisterMapper
public interface BaseSelectMapper<T> extends SelectOneMapper<T>, SelectMapper<T>, SelectAllMapper<T>, 、SelectCountMapper<T>,
SelectByPrimaryKeyMapper<T>,ExistsWithPrimaryKeyMapper<T> {
}
1、BaseSelectMapper的方法:
Mapper继承BaseMapper(基础Mapper),BaseMapper继承BaseSelectMapper(基础selectMapper)
1)、接口:`SelectByPrimaryKeyMapper<T>`
方法:`T selectByPrimaryKey(Object key);`
说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
2)、接口:`SelectMapper<T>`
方法:`List<T> select(T record);`
说明:根据实体中的属性值进行查询,查询条件使用等号
3)、接口:`SelectAllMapper<T>`
方法:`List<T> selectAll();`
说明:查询全部结果,select(null)方法能达到同样的效果
4)、接口:`SelectOneMapper<T>`
方法:`T selectOne(T record);`
说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
5)、接口:`SelectCountMapper<T>`
方法:`int selectCount(T record);`
说明:根据实体中的属性查询总数,查询条件使用等号
2、BaseInsertMapper的方法:
Mapper继承BaseMapper(基础Mapper),BaseMapper继承BaseInsertMapper(基础InsertMapper)
1)、接口:`InsertMapper<T>`
方法:`int insert(T record);`
说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
2)、接口:`InsertSelectiveMapper<T>`
方法:`int insertSelective(T record);`
说明:保存一个实体,null的属性不会保存,会使用数据库默认值
3、BaseUpdateMapper的方法:
1)、接口:`UpdateByPrimaryKeyMapper<T>`
方法:`int updateByPrimaryKey(T record);`
说明:根据主键更新实体全部字段,null值会被更新
2)、接口:`UpdateByPrimaryKeySelectiveMapper<T>`
方法:`int updateByPrimaryKeySelective(T record);`
说明:根据主键更新属性不为null的值
4、BaseDeleteMapper的方法
1)、接口:`DeleteMapper<T>`
方法:`int delete(T record);`
说明:根据实体属性作为条件进行删除,查询条件使用等号
2)、接口:`DeleteByPrimaryKeyMapper<T>`
方法:`int deleteByPrimaryKey(Object key);`
说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
ExampleMapper
@RegisterMapper public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker { }
@RegisterMapper
public interface ExampleMapper<T> extends SelectByExampleMapper<T>, SelectOneByExampleMapper<T>, SelectCountByExampleMapper<T>,
DeleteByExampleMapper<T>,UpdateByExampleMapper<T>, UpdateByExampleSelectiveMapper<T> {
}
ExampleMapper的方法:
1)、接口:`SelectByExampleMapper<T>`
方法:`List<T> selectByExample(Object example);`
说明:根据Example条件进行查询
重点:这个查询支持通过`Example`类指定查询列,通过`selectProperties`方法指定查询列
2)、接口:`SelectOneByExampleMapper<T>`
方法:`T selectOneByExample(Object example);`
说明:根据Example条件进行查询一条记录
3)、接口:`SelectCountByExampleMapper<T>`
方法:`int selectCountByExample(Object example);`
说明:根据Example条件进行查询总数
4)、接口:`UpdateByExampleMapper<T>`
方法:`int updateByExample(@Param("record") T record, @Param("example") Object example);`
说明:根据Example条件更新实体`record`包含的全部属性,null值会被更新
5)、接口:`UpdateByExampleSelectiveMapper<T>`
方法:`int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);`
说明:根据Example条件更新实体`record`包含的不是null的属性值
6)、接口:`DeleteByExampleMapper<T>`
方法:`int deleteByExample(Object example);`
说明:根据Example条件删除数据
RowBoundsMapper
@RegisterMapper public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker { } @RegisterMapper public interface RowBoundsMapper<T> extends SelectByExampleRowBoundsMapper<T>, SelectRowBoundsMapper<T> { }
1)、接口:`SelectRowBoundsMapper<T>`
方法:`List<T> selectByRowBounds(T record, RowBounds rowBounds);`
说明:根据实体属性和RowBounds进行分页查询
2)、接口:`SelectByExampleRowBoundsMapper<T>`
方法:`List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);`
说明:根据example条件和RowBounds进行分页查询