1. 集成MyBatis

首先,需要在pom.xml文件中添加MyBatis和MyBatis-Spring的依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

然后,在Spring的配置文件中,配置数据源和MyBatis的SqlSessionFactoryBean:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="typeAliasesPackage" value="com.example.domain"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
  1. 工具类的设计

在MyBatis中,每个Mapper接口都需要对应一个Mapper XML文件,而每个Mapper接口的实现类都需要通过SqlSession来获取Mapper对象。为了简化操作,可以提供一个工具类,封装了常用的数据操作。

首先,定义一个BaseMapper接口,包含常用的增删改查方法:

public interface BaseMapper<T> {
    int insert(T entity);
    int update(T entity);
    int deleteById(Long id);
    T selectById(Long id);
    List<T> selectAll();
}

然后,定义一个BaseDao类,用来实现BaseMapper接口中的方法:

public abstract class BaseDao<T> implements BaseMapper<T> {
    private SqlSession sqlSession;

    public void setSqlSession(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public int insert(T entity) {
        return sqlSession.insert(getNamespace() + ".insert", entity);
    }

    @Override
    public int update(T entity) {
        return sqlSession.update(getNamespace() + ".update", entity);
    }

    @Override
    public int deleteById(Long id) {
        return sqlSession.delete(getNamespace() + ".deleteById", id);
    }

    @Override
    public T selectById(Long id) {
        return sqlSession.selectOne(getNamespace() + ".selectById", id);
    }

    @Override
    public List<T> selectAll() {
        return sqlSession.selectList(getNamespace() + ".selectAll");
    }

    protected abstract String getNamespace();
}

这个BaseDao类是一个抽象类,其中的getNamespace()方法需要在子类中实现,用来返回对应的Mapper XML文件中的namespace。

最后,定义一个具体的Dao类,继承BaseDao类,并实现getNamespace()方法:

public class UserDao extends BaseDao<User> {
    @Override
    protected String getNamespace() {
        return "com.example.mapper.UserMapper";
    }

    public List<User> selectByPage(int pageNum, int pageSize) {
        Map<String, Object> params = new HashMap<>();
        params.put("offset", (pageNum - 1) * pageSize);
        params.put("limit", pageSize);
        return getSqlSession().selectList(getNamespace() + ".selectByPage", params);
    }
}

这个UserDao类中还添加了一个selectByPage方法,用来实现分页查询。

  1. 测试代码

最后,编写一个测试类,测试BaseDao类和UserDao类中的方法是否能正常工作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class UserDaoTest {
    @Autowired
    private UserDao userDao;

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        userDao.insert(user);
        Assert.assertNotNull(user.getId());
    }

    @Test
    public void testUpdate() {
        User user = userDao.selectById(1L);
        user.setName("李四");
        userDao.update(user);
        user = userDao.selectById(1L);
        Assert.assertEquals("李四", user.getName());
    }

    @Test
    public void testDeleteById() {
        userDao.deleteById(1L);
        User user = userDao.selectById(1L);
        Assert.assertNull(user);
    }

    @Test
    public void testSelectById() {
        User user = userDao.selectById(1L);
        Assert.assertEquals("张三", user.getName());
    }

    @Test
    public void testSelectAll() {
        List<User> userList = userDao.selectAll();
        Assert.assertEquals(1, userList.size());
    }

    @Test
    public void testSelectByPage() {
        List<User> userList = userDao.selectByPage(1, 10);
        Assert.assertEquals(1, userList.size());
    }
}

在这个测试类中,分别测试了插入、修改、删除、查询、查询所有和分页查询这些方法。如果测试通过,说明工具类的设计是正确的


原文地址: https://www.cveoy.top/t/topic/fsdY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录