spring4329集成mybatis提供操作数据库的mybatis的工具类实现新增、修改、删除、查询、分页查询
- 集成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>
- 工具类的设计
在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方法,用来实现分页查询。
- 测试代码
最后,编写一个测试类,测试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 著作权归作者所有。请勿转载和采集!