1.常用注解以及作用
MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,提供了一系列的注解用于简化开发和提高效率。以下是一些常用的MyBatis-Plus注解及其作用:
@TableName:用于标识实体类与数据库表之间的映射关系。可以通过指定表名、字段名等属性,实现实体类与数据库表的映射。
@TableId:用于标识实体类中的主键字段。可以通过指定主键生成策略、自定义主键生成器等属性,实现主键的生成和映射。
@TableField:用于标识实体类中的字段与数据库表中的字段之间的映射关系。可以通过指定字段名、是否为主键、是否为插入字段等属性,实现字段的映射和操作。
@Version:用于标识实体类中的乐观锁字段。可以通过乐观锁实现数据的并发控制,避免数据冲突和丢失。
@EnumValue:用于标识实体类中的枚举字段。可以通过指定枚举值与数据库存储值的映射关系,实现枚举字段的持久化。
@TableLogic:用于标识实体类中的逻辑删除字段。可以通过逻辑删除实现数据的软删除,保留数据的完整性和一致性。
@SqlParser:用于标识SQL解析规则。可以通过指定租户ID、多租户模式等属性,实现多租户的数据隔离和访问控制。
@Mapper:用于标识Mapper接口。可以通过自动扫描和装配,实现Mapper接口的自动注入和使用。
2.mybatisplus的条件构造器
MyBatis-Plus提供了强大的条件构造器(Wrapper)来构建动态查询条件,简化了在查询时拼接SQL的过程,提高了开发效率。以下是MyBatis-Plus中常用的条件构造器:
QueryWrapper:用于构建查询条件的条件构造器。可以通过eq、ne、like、in、between等方法,构建各种条件查询。
java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Alice").like("email", "@gmail.com").between("age", 20, 30);
List<User> userList = userMapper.selectList(queryWrapper);
UpdateWrapper:用于构建更新条件的条件构造器。可以通过set、eq、ne等方法,构建更新操作的条件。
java
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("age", 30).eq("name", "Alice");
userMapper.update(user, updateWrapper);
LambdaQueryWrapper:基于Lambda表达式的查询条件构造器。可以通过Lambda表达式来构建查询条件,类型安全且更加直观。
java
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "Alice").like(User::getEmail, "@gmail.com").between(User::getAge, 20, 30);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
LambdaUpdateWrapper:基于Lambda表达式的更新条件构造器。可以通过Lambda表达式来构建更新条件,类型安全且更加直观。
java
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.set(User::getAge, 30).eq(User::getName, "Alice");
userMapper.update(user, lambdaUpdateWrapper);
QueryChainWrapper:用于构建链式查询条件的条件构造器。可以通过链式调用来构建复杂的查询条件。
java
List<User> userList = new QueryChainWrapper<>(userMapper).eq("name", "Alice").like("email", "@gmail.com").list();
3.mybatisplus的iservice基本用法
MyBatis-Plus的IService是一个通用的Service接口,提供了常用的数据库操作方法,封装了一些常用的CRUD操作,简化了开发过程。以下是MyBatis-Plus中IService的基本用法:
继承IService接口:在自定义的Service接口中继承IService接口,并指定实体类类型。
java
public interface UserService extends IService<User> {
// 自定义的Service方法
void customMethod();
}
使用默认的CRUD方法:IService提供了一系列的默认方法,可以直接使用。例如,使用save方法保存实体对象,使用getById方法根据ID查询实体对象。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 自定义的Service方法
@Override
public void customMethod() {
// ...
}
}
自定义扩展方法:在自定义的Service接口中,可以定义和实现自己的扩展方法。例如,自定义一个customMethod方法。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 自定义的扩展方法
@Override
public void customMethod() {
// ...
}
}
使用IService的其他方法:IService还提供了一些其他的方法,如list、update、remove等,可以根据需要进行使用。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 自定义的Service方法
@Override
public void customMethod() {
// ...
}
// 使用IService的其他方法
public List<User> findUsersByName(String name) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name);
return list(queryWrapper);
}
}
4.mybatisplus的自定义sql
MyBatis-Plus提供了多种方式来实现自定义SQL语句的执行,灵活满足各种复杂的查询和更新需求。以下是MyBatis-Plus中实现自定义SQL的几种常用方式:
使用@Select、@Insert、@Update、@Delete注解:可以在Mapper接口的方法上使用注解来编写自定义SQL语句,并通过注解的方式实现对应的查询、插入、更新、删除操作。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersByAge(int age);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insertUser(User user);
@Update("UPDATE user SET age = #{age} WHERE id = #{id}")
int updateUserAgeById(@Param("id") Long id, @Param("age") int age);
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUserById(Long id);
}
使用@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider注解:可以通过Provider类来动态生成SQL语句,根据不同的条件生成不同的SQL。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@SelectProvider(type = UserSqlProvider.class, method = "selectUsersByAge")
List<User> selectUsersByAge(int age);
@InsertProvider(type = UserSqlProvider.class, method = "insertUser")
int insertUser(User user);
@UpdateProvider(type = UserSqlProvider.class, method = "updateUserAgeById")
int updateUserAgeById(@Param("id") Long id, @Param("age") int age);
@DeleteProvider(type = UserSqlProvider.class, method = "deleteUserById")
int deleteUserById(Long id);
}
java
public class UserSqlProvider {
public String selectUsersByAge(int age) {
return "SELECT * FROM user WHERE age > " + age;
}
public String insertUser(User user) {
return "INSERT INTO user(name, age) VALUES('" + user.getName() + "', " + user.getAge() + ")";
}
public String updateUserAgeById(@Param("id") Long id, @Param("age") int age) {
return "UPDATE user SET age = " + age + " WHERE id = " + id;
}
public String deleteUserById(Long id) {
return "DELETE FROM user WHERE id = " + id;
}
}
使用自定义XML映射文件:可以编写自定义的XML映射文件,通过XML配置SQL语句和参数的映射关系。
xml
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsersByAge" resultType="com.example.entity.User">
SELECT * FROM user WHERE age > #{age}
</select>
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
<update id="updateUserAgeById">
UPDATE user SET age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUserById">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<User> selectUsersByAge(int age);
int insertUser(User user);
int updateUserAgeById(@Param("id") Long id, @Param("age") int age);
int deleteUserById(Long id);
}
5.mybatisplus的增删改查注解开发
MyBatis-Plus提供了一系列的注解,用于简化增删改查操作的开发。以下是MyBatis-Plus中常用的增删改查注解及其用法:
@Insert:用于插入数据的注解。可以在Mapper接口的方法上使用@Insert注解,指定插入数据的SQL语句。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insertUser(User user);
}
@Update:用于更新数据的注解。可以在Mapper接口的方法上使用@Update注解,指定更新数据的SQL语句。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Update("UPDATE user SET age = #{age} WHERE id = #{id}")
int updateUser(User user);
}
@Delete:用于删除数据的注解。可以在Mapper接口的方法上使用@Delete注解,指定删除数据的SQL语句。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUserById(Long id);
}
@Select:用于查询数据的注解。可以在Mapper接口的方法上使用@Select注解,指定查询数据的SQL语句。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(Long id);
}
@Results:用于映射查询结果的注解。可以在Mapper接口的方法上使用@Results注解,指定查询结果与实体类之间的映射关系。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(Long id);
}
6.mybatisplus的增删改查xml开发
MyBatis-Plus支持使用XML文件来编写增删改查的SQL语句,提供了更灵活和可维护的开发方式。以下是MyBatis-Plus中使用XML文件进行增删改查开发的基本步骤:
创建Mapper接口:创建一个继承自BaseMapper的Mapper接口,并定义需要的查询方法。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<User> selectUsersByAge(int age);
int insertUser(User user);
int updateUser(User user);
int deleteUserById(Long id);
User selectUserById(Long id);
}
创建XML映射文件:在resources目录下创建与Mapper接口相对应的XML映射文件,编写SQL语句。
xml
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsersByAge" resultType="com.example.entity.User">
SELECT * FROM user WHERE age = #{age}
</select>
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user SET age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUserById" parameterType="java.lang.Long">
DELETE FROM user WHERE id = #{id}
</delete>
<select id="selectUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
配置MyBatis-Plus的XML映射文件路径:在application.properties或application.yml文件中配置MyBatis-Plus的XML映射文件路径。
properties
# application.properties
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
使用XML映射文件中的SQL语句:在Mapper接口中通过方法名与XML映射文件中的SQL语句进行关联。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<User> selectUsersByAge(int age);
int insertUser(User user);
int updateUser(User user);
int deleteUserById(Long id);
User selectUserById(Long id);
}
7.mybatisplus的逻辑删除
MyBatis-Plus提供了逻辑删除的功能,可以通过配置实现逻辑删除而不是物理删除数据。逻辑删除是指在数据库中添加一个标识字段,通过将该字段的值设置为已删除的状态来表示数据已被删除,而实际上并没有真正删除数据。以下是使用MyBatis-Plus实现逻辑删除的基本步骤:
在实体类中添加逻辑删除字段:在实体类中添加一个逻辑删除的字段,并使用@TableLogic注解标注该字段。
java
@TableLogic
private Integer deleted;
在Mapper接口中配置逻辑删除的方法:在Mapper接口中添加逻辑删除的方法,并使用@Update注解指定逻辑删除的SQL语句。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Update("UPDATE user SET deleted = 1 WHERE id = #{id}")
int logicDeleteById(Long id);
}
在application.properties或application.yml中配置逻辑删除的全局配置:在配置文件中添加逻辑删除的全局配置,开启逻辑删除功能。
properties
# application.properties
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
使用逻辑删除的方法:在代码中调用逻辑删除的方法进行数据删除操作。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public boolean removeById(Long id) {
return baseMapper.logicDeleteById(id) > 0;
}
}
8.mybatisplus的分页插件
MyBatis-Plus提供了强大的分页插件来简化分页查询的操作。分页插件可以自动拦截原始的SQL语句,根据分页参数生成对应的分页SQL语句,并执行分页查询操作。以下是使用MyBatis-Plus分页插件的基本步骤:
添加分页插件依赖:在项目的pom.xml文件中添加MyBatis-Plus的分页插件依赖。
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置分页插件:在application.properties或application.yml文件中配置分页插件。
properties
# application.properties
mybatis-plus.pagehelper.auto-dialect=true
使用分页查询方法:在Mapper接口中使用分页查询方法进行分页查询操作。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
IPage<User> selectUsersByPage(Page<User> page, int age);
}
调用分页查询方法:在代码中调用分页查询方法,并传入分页参数进行分页查询操作。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public IPage<User> selectUsersByPage(int pageNum, int pageSize, int age) {
Page<User> page = new Page<>(pageNum, pageSize);
return baseMapper.selectUsersByPage(page, age);
}
}
9.Mybatis的通用实体与MP转换
在使用MyBatis-Plus时,通常会定义实体类来映射数据库表的字段。如果已经有了使用MyBatis的通用实体类(如BaseEntity),需要将其转换为MyBatis-Plus的实体类(如BaseEntity)来使用MyBatis-Plus的功能。以下是将MyBatis的通用实体与MyBatis-Plus的实体类进行转换的基本步骤:
定义MyBatis的通用实体类:首先,定义使用MyBatis的通用实体类,包含需要映射的数据库字段。
java
public class BaseEntity {
private Long id;
private String name;
private Integer age;
// getter and setter
}
定义MyBatis-Plus的实体类:根据MyBatis的通用实体类定义对应的MyBatis-Plus的实体类,通常需要继承自BaseEntity,并添加@Table注解指定表名。
java
@TableName("user")
public class User extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
// additional fields or methods
}
使用BeanUtils进行转换:可以使用BeanUtils工具类来进行MyBatis的通用实体与MyBatis-Plus的实体类之间的转换。
java
public class EntityConvertUtils {
public static <T1, T2> T2 convert(T1 source, Class<T2> targetClass) {
T2 target = BeanUtils.instantiateClass(targetClass);
BeanUtils.copyProperties(source, target);
return target;
}
}
调用转换方法:在代码中调用转换方法,将MyBatis的通用实体转换为MyBatis-Plus的实体类。
java
BaseEntity baseEntity = new BaseEntity();
baseEntity.setId(1L);
baseEntity.setName("Alice");
baseEntity.setAge(30);
User user = EntityConvertUtils.convert(baseEntity, User.class);
10.mybatis的动态sql
MyBatis-Plus提供了强大的动态SQL功能,可以根据条件动态拼接SQL语句,实现灵活的查询和操作。以下是使用MyBatis-Plus的动态SQL的基本用法:
使用@SelectProvider注解:在Mapper接口的方法上使用@SelectProvider注解,并指定一个提供动态SQL的类。
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@SelectProvider(type = UserSqlProvider.class, method = "selectUsersByCondition")
List<User> selectUsersByCondition(String name, Integer age);
}
创建动态SQL提供类:创建一个类来提供动态SQL语句的方法。该类需要实现Provider接口,并提供一个动态SQL语句的方法。
java
public class UserSqlProvider implements Provider {
public String selectUsersByCondition(String name, Integer age) {
SQL sql = new SQL().SELECT("*").FROM("user");
if (name != null) {
sql.WHERE("name = #{name}");
}
if (age != null) {
sql.WHERE("age = #{age}");
}
return sql.toString();
}
}
调用动态SQL的方法:在代码中调用动态SQL的方法,并传入相应的参数。
java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public List<User> selectUsersByCondition(String name, Integer age) {
return baseMapper.selectUsersByCondition(name, age);
}
}