mybatis 通用Mapper

转:http://blog.csdn.net/weijiaxiaobao/article/details/51181580

1. 引入通用Mapper的依赖

[html]  view plain  copy
  1. <dependency>  
  2.     <groupid>org.mybatis</groupid>  
  3.     <artifactid>mybatis</artifactid>  
  4.     <version>${mybatis.version}</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupid>org.mybatis</groupid>  
  8.     <artifactid>mybatis-spring</artifactid>  
  9.     <version>${mybatis-spring.version}</version>  
  10. </dependency>  
  11.   
  12. <dependency>  
  13.     <groupid>tk.mybatis</groupid>  
  14.     <artifactid>mapper</artifactid>  
  15.     <version>${mapper.version}</version>  
  16. </dependency>  
  17. <dependency>  
  18.     <groupid>javax.persistence</groupid>  
  19.     <artifactid>persistence-api</artifactid>  
  20.     <version>${persistence-api.version}</version>  
  21. </dependency>  
  22. <!--分页插件 -->  
  23. <dependency>  
  24.     <groupid>com.github.pagehelper</groupid>  
  25.     <artifactid>pagehelper</artifactid>  
  26.     <version>${pagehelper.version}</version>  
  27. </dependency>  


2. 与spring集成的配置


[html]  view plain  copy
  1. <!-- 配置mybatis的SessionFactory -->  
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  3.     <property name="dataSource" ref="dataSource">  
  4.     <property name="typeAliasesPackage" value="org.wei.dao.entity">  
  5.     <property name="plugins">  
  6.         <array>  
  7.             <bean class="com.github.pagehelper.PageHelper">  
  8.               <property name="properties">  
  9.                 <value>  
  10.                   dialect=postgresql  
  11.                   reasonable=true  
  12.                 </value>  
  13.               </property>  
  14.             </bean>  
  15.         </array>  
  16.     </property>  
  17. </bean>  
  18.   
  19. <!-- 自动扫描注册Mybatis mapper -->  
  20. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">  
  21.     <property name="basePackage" value="com.wei.dao.mapper">  
  22.     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">  
  23. </bean>  


3. 实体类


[java]  view plain  copy
  1.       
  2. package com.wei.dao.entity;  
  3.   
  4. import java.io.Serializable;  
  5. import java.util.Date;  
  6.   
  7. import javax.persistence.Column;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.Table;  
  11.   
  12. @Table(name = "T_USER")  
  13. public class User implements Serializable {  
  14.   
  15.     private static final long serialVersionUID = 1L;  
  16.   
  17.     @Id  
  18.     @GeneratedValue(generator = "UUID")  
  19.     private String id;  
  20.     @Column  
  21.     private String name;  
  22.     @Column  
  23.     private String password;  
  24.     @Column  
  25.     private Date createDate;  
  26.   
  27.     public String getId() {  
  28.         return id;  
  29.     }  
  30.   
  31.     public String getName() {  
  32.         return name;  
  33.     }  
  34.   
  35.     public void setName(String name) {  
  36.         this.name = name;  
  37.     }  
  38.   
  39.     public String getPassword() {  
  40.         return password;  
  41.     }  
  42.     public Date getCreateDate() {  
  43.         return createDate;  
  44.     }  
  45.   
  46.     public void setCreateDate(Date createDate) {  
  47.         this.createDate = createDate;  
  48.     }  
  49.   
  50.     public void setPassword(String password) {  
  51.         this.password = password;  
  52.     }  
  53.   
  54.     public void setId(String id) {  
  55.         this.id = id;  
  56.     }  
  57.   
  58. }  


4. Mapper.java 

java文件盒xml的放到一个包下面,建议都写mapper和xml,这样可以利用缓存如果在xml里面配置了mybatis的缓存,因为mybatis的缓存是基于mapper域的,就是xml里面的那个scheme
[java]  view plain  copy
  1.       
  2. package com.wei.dao.mapper;  
  3.   
  4. import java.util.List;  
  5.   
  6. import org.springframework.stereotype.Repository;  
  7.   
  8. import tk.mybatis.mapper.common.Mapper;  
  9.   
  10. import com.wei.dao.entity.User;  
  11.   
  12. @Repository("userMapper")  
  13. public interface UserMapper extends Mapper<user> {  
  14.       
  15.     public List<user> selectByName(User user);  
  16. }  


5. Mapper.xml


[html]  view plain  copy
  1.       
  2. <?xml version="1.0" encoding="UTF-8" ?>  
  3.   
  4. <mapper namespace="com.wei.dao.mapper.UserMapper">  
  5.   
  6.     <select id="selectByName" resulttype="com.wei.dao.entity.User" parametertype="com.wei.dao.entity.User">  
  7.     select * from t_user where name=#{name} and create_Date=#{createDate};  
  8.     </select>  
  9. </mapper>  



6. junit测试


[java]  view plain  copy
  1.       
  2. package org.wei.dao;  
  3.   
  4. import java.util.List;  
  5.   
  6. import org.junit.Test;  
  7. import org.junit.runner.RunWith;  
  8. import org.slf4j.Logger;  
  9. import org.slf4j.LoggerFactory;  
  10. import org.springframework.beans.factory.annotation.Autowired;  
  11. import org.springframework.test.context.ContextConfiguration;  
  12. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  13.   
  14. import com.wei.dao.entity.User;  
  15. import com.wei.dao.mapper.UserMapper;  
  16.   
  17. @RunWith(SpringJUnit4ClassRunner.class)  
  18. @ContextConfiguration("/spring-context.xml")  
  19. public class UserMapperTest {  
  20.     private Logger logger=LoggerFactory.getLogger(this.getClass());  
  21.     @Autowired  
  22.     private UserMapper userMapper;  
  23.       
  24.     @Test  
  25.     public void testUserInsert() {  
  26.         User user=new User();  
  27.         user.setName("王重阳123111");  
  28.         user.setPassword("11112222");  
  29.         userMapper.insert(user);  
  30.         logger.info("--------->testUserInsert end-------------");  
  31.     }  
  32.   
  33.     @Test  
  34.     public void testUserSelect() {  
  35.         List<user> select = userMapper.select(null);  
  36.         for(User user:select){  
  37.             logger.info("--------->"+user.getName()+"-------------");  
  38.         }  
  39.         logger.info("--------->testUserInsert end-------------");  
  40.     }  
  41. }  


通用Mapper的常用方法

//根据实体类不为null的字段进行查询,条件全部使用=号and条件
List<T> select(T record);

//根据实体类不为null的字段查询总数,条件全部使用=号and条件
int selectCount(T record);

//根据主键进行查询,必须保证结果唯一
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
T selectByPrimaryKey(Object key);

//插入一条数据
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insert(T record);

//插入一条数据,只插入不为null的字段,不会影响有默认值的字段
//支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
//优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
int insertSelective(T record);

//根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
int delete(T key);

//通过主键进行删除,这里最多只会删除一条数据
//单个字段做主键时,可以直接写主键的值
//联合主键时,key可以是实体类,也可以是Map
int deleteByPrimaryKey(Object key);

//根据主键进行更新,这里最多只会更新一条数据
//参数为实体类
int updateByPrimaryKey(T record);

//根据主键进行更新
//只会更新不是null的数据
int updateByPrimaryKeySelective(T record);

7. 通用Mapper默认的一些要求

体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:

  1. 表名默认使用类名,驼峰转下划线,如UserInfo默认对应的表名为user_info.

  2. 表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.

  3. 字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.

  4. 可以使用@Column(name = "fieldName")指定不符合第3条规则的字段名

  5. 使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.

  6. 建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.

  7. 默认情况下,实体类中如果不存在包含@Id注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).

  8. 实体类可以继承使用,可以参考测试代码中的com.github.abel533.model.UserLogin2类.

  9. 由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.

除了上面提到的这些,Mapper还提供了序列(支持Oracle)、UUID(任意数据库,字段长度32)、主键自增(类似MySQL,Hsqldb)三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。

这三种方式不能同时使用,同时存在时按照 序列>UUID>主键自增的优先级进行选择.下面是具体配置方法:

  1. 使用序列可以添加如下的注解:

    //可以用于数字类型,字符串类型(需数据库支持自动转型)的字段
    @SequenceGenerator(name="Any",sequenceName="seq_userid")
    @Id
    private Integer id;
    
  2. 使用UUID时:

    //可以用于任意字符串类型长度超过32位的字段
    @GeneratedValue(generator = "UUID")
    private String countryname;
    
  3. 使用主键自增:

    //不限于@Id注解的字段,但是一个实体类中只能存在一个(继承关系中也只能存在一个)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

6. 分页插件

接口
[java]  view plain  copy
  1. package com.wei.service;  
  2.   
  3. import com.github.pagehelper.PageInfo;  
  4. import com.wei.dao.entity.User;  
  5. import com.wei.service.vo.UserVo;  
  6.   
  7. public interface UserMapperService {  
  8.   
  9.     public PageInfo<user> select(UserVo userVo);  
  10.       
  11. }  
  12.   
  13.   
  14. package com.wei.service.impl;  
  15.   
  16. import java.util.List;  
  17.   
  18. import org.springframework.beans.BeanUtils;  
  19. import org.springframework.beans.factory.annotation.Autowired;  
  20. import org.springframework.stereotype.Service;  
  21.   
  22. import com.alibaba.fastjson.JSON;  
  23. import com.github.pagehelper.PageHelper;  
  24. import com.github.pagehelper.PageInfo;  
  25. import com.wei.dao.entity.User;  
  26. import com.wei.dao.mapper.UserMapper;  
  27. import com.wei.service.UserMapperService;  
  28. import com.wei.service.vo.UserVo;  
  29.   
  30. @Service  
  31. public class UserMapperServiceImpl implements UserMapperService {  
  32.   
  33.     @Autowired  
  34.     UserMapper userMapper;  
  35.   
  36.     @Override  
  37.     public PageInfo<user> select(UserVo userVo) {  
  38.         PageHelper.startPage(32);  
  39.         User user = new User();  
  40.         BeanUtils.copyProperties(userVo, user);  
  41.         List<user> select = userMapper.select(user);  
  42.         PageInfo<user> page = new PageInfo<user>(select);  
  43.         System.out.println("---------->JSON:" + JSON.toJSONString(page));  
  44.         return page;  
  45.     }  
  46. }  

猜你喜欢

转载自blog.csdn.net/u014695188/article/details/78241085