mybatis抽取基类BaseMapper增删改查的实现

yizhihongxing

下面我将详细讲解如何使用mybatis抽取基类BaseMapper实现增删改查的完整攻略。

什么是BaseMapper

在使用MyBatis进行开发时,我们通常会对CRUD进行封装,然后在具体操作某个表时,通过继承该封装类来实现对该表的操作。但是,这样做的弊端就是复用性不高,每次都需要为每个表都写一遍操作代码,重复劳动十分麻烦。为了解决这个问题,我们可以自己实现一个BaseMapper类,其中包含一些常用的增删改查操作方法,然后其他表的Mapper类继承BaseMapper即可。

BaseMapper的实现

实现步骤

  1. 定义一个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);

    // ... 其他自定义查询方法
}
  1. 编写一个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接口中。

  1. 定义具体表的Mapper接口,并继承BaseMapper接口。
public interface UserMapper extends BaseMapper<User> {
    User getUserById(Integer id);
}

注意,在继承BaseMapper时,需要将泛型T指定为具体操作的实体类。

  1. 编写具体表的Mapper实现类。
public class UserMapperImpl extends BaseMapperImpl<User> implements UserMapper {
    @Override
    public User getUserById(Integer id) {
        return sqlSessionTemplate.selectOne(getMapperNamespace() + ".getUserById", id);
    }
}

在UserMapperImpl中,我们可以自定义一些与具体表相关的查询方法。

示例

下面,我将以User表为例进行演示。

  1. 创建User实体类。
public class User {
    private Integer id;
    private String name;
    private Integer age;
    // ... 省略getter和setter方法
}
  1. 创建User表的Mapper接口。
public interface UserMapper extends BaseMapper<User> {
    User getUserById(Integer id);
}
  1. 创建User表的Mapper实现类。
public class UserMapperImpl extends BaseMapperImpl<User> implements UserMapper {
    @Override
    public User getUserById(Integer id) {
        return sqlSessionTemplate.selectOne(getMapperNamespace() + ".getUserById", id);
    }
}
  1. 在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>
  1. 在MyBatis中注册UserMapper。
<mappers>
    <mapper class="com.example.mapper.UserMapper"/>
</mappers>
  1. 在代码中使用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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Sprint Boot @Size使用方法详解

    @Size是Spring Boot中的一个注解,用于标记一个字段或方法参数的长度必须在指定范围内。在本文中,我们将详细介绍@Size注解的作用和使用方法,并提供两个示例。 @Size注解的作用 @Size注解用于标记一个字段或方法参数的长度必须在指定范围内。当使用@Size注解标记一个字段或方法参数时,如果该字段或方法参数的长度不在指定范围内,则会抛出jav…

    Java 2023年5月5日
    00
  • 如何从官网下载Hibernate jar包的方法示例

    下面是从官网下载Hibernate jar包的方法: 第一步:进入官网 首先,我们需要进入Hibernate的官网:https://hibernate.org/ 第二步:选择版本 在官网主页上,我们可以看到各种Hibernate的相关信息,需要找到“Download”选项卡。在下载页中,选择我们需要下载的版本和平台,例如: https://hibernate…

    Java 2023年5月20日
    00
  • Java点餐小程序之黑心商人

    Java点餐小程序之黑心商人完整攻略 简介 这是一款基于Java实现的点餐小程序,允许用户查看、点餐、结算等操作,并包含了“黑心商人”功能,允许商家设置并收取“加急费”、“删单费”等不合理费用。作为一名程序员,我们应该注重代码的质量,不容忍这种黑心商业行为,本文将详细讲解该小程序的实现过程,并提供几条防止黑心商户的方法。 整体思路 该小程序主要分为前台用户界…

    Java 2023年5月23日
    00
  • java比较两个list是否相同equals的代码详解

    要比较两个List是否相同,可以使用Java内置的equals()方法,但是需要注意以下几点: equals()方法比较的是两个List的元素个数和元素值,因此需要保证元素位置、个数和值完全一致。 如果List中包含自定义对象,那么自定义对象需要自己实现equals()方法,才能保证正确比较。 比较两个List时,可以使用Collections工具类中的eq…

    Java 2023年5月26日
    00
  • scratch怎么上传源程序代码? scratch上传本地程序的技巧

    以下是详细的攻略: 如何上传源程序代码? 在Scratch网站中,用户可以通过将项目上传到服务器来保存项目和共享项目。在Scratch网站上完成的项目已经包含了所有程序的代码,但是如果用户想要上传本地的项目并分享他们的源代码,可以按照以下步骤: 在Scratch网站上登录账户并点击“上传”按钮。 在弹出的对话框中,单击“从文件上传”按钮。 寻找保存在本地计算…

    Java 2023年5月23日
    00
  • java使用OGEngine开发2048

    让我来为您详细讲解如何使用OGEngine开发2048游戏。 准备工作 在开发2048游戏之前,我们需要先准备好开发环境以及相关工具。以下是准备工作的步骤: 下载并安装JDK(Java Development Kit),确保安装的JDK版本高于1.8。 下载并安装Eclipse IDE(Integrated Development Environment),…

    Java 2023年6月15日
    00
  • 多端登录如何实现踢人下线需求实现

    实现多端登录下的踢人下线需求,可以采用以下几种方法: 基于Token和Session实现 方案简介:采用Token和Session配合,来实现多端登录下的踢人下线需求实现。 接口可以采用Token认证,每次客户端请求接口时,服务端进行Token验证并通过Session记录Token。 当用户进行登录操作时,客户端请求登录接口,服务端通过验证用户的账号和密码,…

    Java 2023年5月23日
    00
  • 深入浅出Java中重试机制的多种方式

    深入浅出Java中重试机制的多种方式 在开发中,有时会需要对某些操作进行多次尝试,以增加操作的稳定性和可靠性。这时,使用重试机制可以很好地解决这一问题。本文将详细介绍Java中重试机制的多种实现方式。 1. 基于while循环的重试机制 最简单的重试机制就是在while循环中执行某个操作,并在某些限定条件下进行多次尝试。例如以下示例代码: int count…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部