下面我将详细讲解如何使用mybatis抽取基类BaseMapper实现增删改查的完整攻略。
什么是BaseMapper
在使用MyBatis进行开发时,我们通常会对CRUD进行封装,然后在具体操作某个表时,通过继承该封装类来实现对该表的操作。但是,这样做的弊端就是复用性不高,每次都需要为每个表都写一遍操作代码,重复劳动十分麻烦。为了解决这个问题,我们可以自己实现一个BaseMapper类,其中包含一些常用的增删改查操作方法,然后其他表的Mapper类继承BaseMapper即可。
BaseMapper的实现
实现步骤
- 定义一个BaseMapper接口。
public interface BaseMapper<T> {
T selectByPrimaryKey(Object key);
List<T> selectAll();
int insert(T entity);
int insertSelective(T entity);
int deleteByPrimaryKey(Object key);
int updateByPrimaryKey(T entity);
int updateByPrimaryKeySelective(T entity);
// ... 其他自定义查询方法
}
- 编写一个BaseMapper实现类。
public class BaseMapperImpl<T> implements BaseMapper<T>, MySqlMapper<T> {
@Autowired
protected SqlSessionTemplate sqlSessionTemplate;
public String getMapperNamespace() {
return T.getClass().getName();
}
@Override
public T selectByPrimaryKey(Object key) {
return sqlSessionTemplate.selectOne(getMapperNamespace() + ".selectByPrimaryKey", key);
}
@Override
public List<T> selectAll() {
return sqlSessionTemplate.selectList(getMapperNamespace() + ".selectAll");
}
@Override
public int insert(T entity) {
return sqlSessionTemplate.insert(getMapperNamespace() + ".insert", entity);
}
@Override
public int insertSelective(T entity) {
return sqlSessionTemplate.insert(getMapperNamespace() + ".insertSelective", entity);
}
@Override
public int deleteByPrimaryKey(Object key) {
return sqlSessionTemplate.delete(getMapperNamespace() + ".deleteByPrimaryKey", key);
}
@Override
public int updateByPrimaryKey(T entity) {
return sqlSessionTemplate.update(getMapperNamespace() + ".updateByPrimaryKey", entity);
}
@Override
public int updateByPrimaryKeySelective(T entity) {
return sqlSessionTemplate.update(getMapperNamespace() + ".updateByPrimaryKeySelective", entity);
}
// ... 其他自定义查询方法的实现
}
在BaseMapperImpl中,我们使用@Autowired注解注入了SqlSessionTemplate。该类是MyBatis对SqlSession做了一层封装的便捷类,提供了对SqlSession进行CRUD操作的方法。另外,我们还实现了MyBatis提供的MySqlMapper接口,可以将通用的增删改查方法添加到BaseMapper接口中。
- 定义具体表的Mapper接口,并继承BaseMapper接口。
public interface UserMapper extends BaseMapper<User> {
User getUserById(Integer id);
}
注意,在继承BaseMapper时,需要将泛型T指定为具体操作的实体类。
- 编写具体表的Mapper实现类。
public class UserMapperImpl extends BaseMapperImpl<User> implements UserMapper {
@Override
public User getUserById(Integer id) {
return sqlSessionTemplate.selectOne(getMapperNamespace() + ".getUserById", id);
}
}
在UserMapperImpl中,我们可以自定义一些与具体表相关的查询方法。
示例
下面,我将以User表为例进行演示。
- 创建User实体类。
public class User {
private Integer id;
private String name;
private Integer age;
// ... 省略getter和setter方法
}
- 创建User表的Mapper接口。
public interface UserMapper extends BaseMapper<User> {
User getUserById(Integer id);
}
- 创建User表的Mapper实现类。
public class UserMapperImpl extends BaseMapperImpl<User> implements UserMapper {
@Override
public User getUserById(Integer id) {
return sqlSessionTemplate.selectOne(getMapperNamespace() + ".getUserById", id);
}
}
- 在UserMapper.xml中编写sql语句。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userMap" type="com.example.entity.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="userMap" parameterType="java.lang.Integer">
select * from user where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="userMap">
select * from user
</select>
<insert id="insert" parameterType="com.example.entity.User">
insert into user(name, age) values (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.example.entity.User">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null">
name,
</if>
<if test="age != null">
age,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="age != null">
#{age,jdbcType=INTEGER},
</if>
</trim>
</insert>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user where id = #{id,jdbcType=INTEGER}
</delete>
<update id="updateByPrimaryKey" parameterType="com.example.entity.User">
update user
set name = #{name,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKeySelective" parameterType="com.example.entity.User">
update user
<set>
<if test="name != null">
name = #{name,jdbcType=VARCHAR},
</if>
<if test="age != null">
age = #{age,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<select id="getUserById" resultMap="userMap" parameterType="java.lang.Integer">
select * from user where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
- 在MyBatis中注册UserMapper。
<mappers>
<mapper class="com.example.mapper.UserMapper"/>
</mappers>
- 在代码中使用UserMapper进行增删改查操作。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
// 查询所有用户
List<User> userList = userMapper.selectAll();
System.out.println(userList);
// 根据id查询用户
User user = userMapper.getUserById(1);
System.out.println(user);
// 添加用户
User newUser = new User();
newUser.setName("test");
newUser.setAge(22);
int result = userMapper.insertSelective(newUser);
System.out.println(result);
// 更新用户
User updateUser = new User();
updateUser.setId(1);
updateUser.setName("test_update");
updateUser.setAge(23);
result = userMapper.updateByPrimaryKeySelective(updateUser);
System.out.println(result);
// 删除用户
result = userMapper.deleteByPrimaryKey(1);
System.out.println(result);
至此,我们通过实现BaseMapper类,实现了对User表的增删改查操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis抽取基类BaseMapper增删改查的实现 - Python技术站