通用Mapper
使用步骤
- 导入相关jar包
(这是出了原来Spring及Mybatis的jar包外需要的一些jar包) - 配置applicationContext.xml
- 创建实体类
- 创建接口继承Mapper接口
- 创建服务层类及方法
- 进行测试
代码实例
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.hpe"></context:component-scan>
<!-- 加载外部资源文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 通过Spring管理SqlSessionFactory mapper接口 -->
<!-- 配置SqlSessionFactory为了使用 Spring来管理SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置mybatis核心配置文件的路径 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定批量创建别名的包 -->
<property name="typeAliasesPackage" value="com.hpe.po"></property>
<!-- 通过Mapper实现单表操作 -->
<property name="plugins">
<array>
<!-- pagehelper分页配置 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
offsetAsPageNum=true
<!-- 设置合理的分页,防止出现小于第一页,大于最后一页的异常情况出现。 -->
reasonable=true
</value>
</property>
</bean>
<!-- 配置mapper的拦截器 -->
<bean class="com.github.abel533.mapperhelper.MapperInterceptor">
<property name="properties">
<value>
<!-- 主键自增回写方法,默认值MYSQL -->
IDENTITY=MYSQL
mappers=com.github.abel533.mapper.Mapper
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- 批量创建Mapper接口实现类的Bean,可以不指定id
默认Bean是由id的,是Mapper接口的名称且首字母小写-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定需要创建实现类的Mapper接口所在的包
可以指定多个包,使用逗号隔开即可-->
<property name="basePackage" value="com.hpe.mapper"></property>
<!-- 需要指定SqlSessionFactory,使用sqlSessionFactoryBeanName
通过这种方式就可以等到Spring初始化完成后,再去构造SqlSessionFactory,否则无法连接数据库 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- Spring声明式事务管理:注解方式 -->
<!-- 1.配置事务管理器(XML及注解方式均需配置) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2.注册事务注解驱动
transaction-manager:自动检测事务处理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
User.java
package com.hpe.po;
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
// 1.@Table(name="user_info"),如果实体类名和数据库表名不一致,可以用该注解
// 2.@Column(name="name"),如果实体类属性名和数据库表列名不一致,可以用该注解
// 3.@Transient如果实体类多了一个数据库表中没有的属性,可以用该注解忽略掉此属性
// 4.@Id在没有指定哪个属性作为主键的时候,默认实体类中所有字段均为主键,可以用该注解标识为主键。
// 如果多个属性为联合主键,可以使用多个id注解
// 5.@GeneratedValue(strategy=GenerationType.IDENTITY)
// 为一个实体类生成一个唯一标识的主键(可以把生成的主键映射到标识为@id的属性上面)
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// 身份证号(比数据库表多了个属性)
/*@Transient
private String idCard;
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}*/
public User() {
}
public User(Integer id, String username, Date birthday, String sex, String address) {
super();
this.id = id;
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
// 下面是个属性对应的get、set方法及toString方法(省略)
}
UserMapper.java
package com.hpe.mapper;
import com.github.abel533.mapper.Mapper;
import com.hpe.po.User;
// 实现通用mapper实现对单表进行增删改查,需要继承Mapper接口
// 一旦继承了该接口,就拥有了通用的方法
public interface UserMapper extends Mapper<User>{
}
UserService.java
package com.hpe.service;
import java.util.List;
import com.github.abel533.entity.Example;
import com.hpe.po.User;
public interface UserService {
// 根据用户名查询用户信息
User selectUserByUserName(User user);
User selectOne(User user);
List<User> select(User user);
int selectCount(User user);
User selectByPrimaryKey(Integer i);
int insertUser(User user);
int insertSelective(User user);
int updateUserByKey(User user);
List<User> selectUserByExample(Example example);
}
UserServiceImpl.java
package com.hpe.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.abel533.entity.Example;
import com.hpe.mapper.UserMapper;
import com.hpe.po.User;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User selectUserByUserName(User user) {
return userMapper.selectOne(user);
}
@Override
public User selectOne(User user) {
return userMapper.selectOne(user);
}
@Override
public List<User> select(User user) {
return userMapper.select(user);
}
@Override
public int selectCount(User user) {
return userMapper.selectCount(user);
}
@Override
public User selectByPrimaryKey(Integer i) {
return userMapper.selectByPrimaryKey(i);
}
@Override
public int insertUser(User user) {
return userMapper.insert(user);
}
@Override
public int insertSelective(User user) {
return userMapper.insertSelective(user);
}
@Override
public int updateUserByKey(User user) {
return userMapper.updateByPrimaryKey(user);
}
@Override
public List<User> selectUserByExample(Example example) {
return userMapper.selectByExample(example);
}
}
测试方法(在Mapper接口上右键–>new junit case–>勾选setup–>选中需要测试的方法–>finish)
package com.hpe.test;
import static org.junit.Assert.*;
import java.util.Date;
import java.util.List;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.github.abel533.entity.Example;
import com.github.abel533.entity.Example.Criteria;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hpe.po.User;
import com.hpe.service.UserService;
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
public class UserMapperTest {
ApplicationContext context;
UserService userService;
@Before
public void setUp() throws Exception {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
userService = context.getBean(UserService.class);
}
// 根据用户名查询用户信息
@Test
public void test1(){
User user = new User();
user.setUsername("张三");
user.setAddress("北京市");
User result = userService.selectUserByUserName(user);
System.out.println(result);
}
// 测试通用mapper的所有方法
// selectOne:查询单条记录,根据不为null的字段,条件全部为=
@Test
public void testSelectOne() {
User user = new User(null, "张三", null, null, null);
User result = userService.selectOne(user);
System.out.println(result);
}
// select:查询多条记录,
@Test
public void testSelect() {
User user = new User(null, null, null, "1", null);
List<User> result = userService.select(user);
System.out.println(result);
}
// 查询总数:根据条件查询
@Test
public void testSelectCount() {
User user = new User(null, null, null, "2", null);
int result = userService.selectCount(user);
System.out.println(result);
}
// 根据主键查询
@Test
public void testSelectByPrimaryKey() {
User user = userService.selectByPrimaryKey(1);
System.out.println(user);
}
// 插入数据:
// 1.在SQL语句中属性为空也会产生相应的占位符.解决:有选择性的插入
// 2.在创建对象的时候设置上主键会成功
// 3.新增一条记录不会映像到传入的对象上面。解决方法:@GeneratedValue(strategy=GenerationType.IDENTITY)
@Test
public void testInsert() {
User user = new User(null, "tian", null, "2", "德州");
int result = userService.insertUser(user);
System.out.println(result);
// 获得新增的主键
System.out.println(user.getId());
}
// 有选择的插入数据:不会插入值为null的字段
@Test
public void testInsertSelective() {
User user = new User(null, "king", null, "2", null);
int result = userService.insertSelective(user);
System.out.println(result);
}
@Test
public void testDelete() {
fail("Not yet implemented");
}
@Test
public void testDeleteByPrimaryKey() {
fail("Not yet implemented");
}
// 根据主键更新用户信息
@Test
public void testUpdateByPrimaryKey() {
User user = new User(31, "李磊", new Date(), "1", "北京");
int result = userService.updateUserByKey(user);
System.out.println(result);
}
@Test
public void testUpdateByPrimaryKeySelective() {
fail("Not yet implemented");
}
@Test
public void testSelectCountByExample() {
fail("Not yet implemented");
}
@Test
public void testDeleteByExample() {
fail("Not yet implemented");
}
// 根据构建的查询条件做查询
// 底层实现原理:QBC (Query-by-criteria),构建查询条件
// 需求:根据用户名实现模糊查询SELECT * FROM user WHERE username LIKE '%xiao%'
@Test
public void testSelectByExample() {
Example example = new Example(User.class);
// 创建存放查询条件的对象
Criteria criteria = example.createCriteria();
// 添加查询条件
criteria.andLike("username", "%t%").andEqualTo("sex", "2");
example.setOrderByClause(" id DESC");
List<User> list = userService.selectUserByExample(example);
System.out.println(list);
}
@Test
public void testUpdateByExampleSelective() {
fail("Not yet implemented");
}
@Test
public void testUpdateByExample() {
fail("Not yet implemented");
}
// 分页
@Test
public void testPageHelper(){
// 设置起始页
PageHelper.startPage(1, 3);
// 查询所有用户数据(分页的数据源)
List<User> list = userService.select(new User());
// 实现分页需要创建PageInfo(相当于之前使用的Page对象),指定数据源
PageInfo<User> pageInfo = new PageInfo<>(list);
List<User> list2 = pageInfo.getList();
for (User user : list2) {
System.out.println(user);
}
}
// 根据查询条件分页
@Test
public void testPageHelper1(){
// 设置起始页
PageHelper.startPage(1, 3);
Example example = new Example(User.class);
Criteria criteria = example.createCriteria();
criteria.andLike("username", "%t%");
List<User> list = userService.selectUserByExample(example);
// 实现分页需要创建PageInfo(相当于之前使用的Page对象),指定数据源
PageInfo<User> pageInfo = new PageInfo<>(list);
List<User> list2 = pageInfo.getList();
for (User user : list2) {
System.out.println(user);
}
}
}