今天在學習Hibernate的時候感受到JPA對於單表操作的方便,經過搜索資料發現Mybatis現在其實也已經支持了類似的操作,這個就是通用Mapper,記錄一下免得後面又忘記(學東西總是學了就忘。。。。唉)
首先原生Mybatis雖然好用,但是有一些地方很難受,比如:
1.mapper.xml文件中有大量的SQL語句,即使是使用註解SQL語句全部堆在dao層,數據庫有個字段改了,就得跑去修改
2.數據庫可移植性差,Oracle中的PLSQL和mysql的函數是不同的,一旦切換就得去重寫SQL
3.生成的代碼量過大
4.批量操作,批量插入,批量更新都需要手動寫
快速入門
引入依賴
<!-- 通用Mapper --> <dependency> <groupId>com.github.abel533</groupId> <artifactId>mapper</artifactId> <version>2.3.4</version> </dependency>
配置插件(Mapper在Mybatis的攔截器)
<plugins> <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"> <!--主鍵自增回寫方法,默認值MYSQL --> <property name="IDENTITY" value="MYSQL" /> <!--通用Mapper默認接口,我們定義的Mapper需要實現該接口 --> <property name="mappers" value="com.github.abel533.mapper.Mapper" /> </plugin> </plugins>
編寫UserMapper接口繼承Mapper(Dao層)
配置實體類與表的關係:
package cn.mybatis.pojo;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="tb_user")
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
// 用戶名
private String userName;
// 密碼
private String password;
// 姓名
private String name;
// 年齡
private Integer age;
// 性別,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 創建時間
private Date created;
// 更新時間
private Date updated;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getuserName() {
return userName;
}
public void setuserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getUpdated() {
return updated;
}
public void setUpdated(Date updated) {
this.updated = updated;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", name=" + name
+ ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created
+ ", updated=" + updated + "]";
}
}
編寫測試類
package cn.mapper.test;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.mybatis.dao.UserMapper;
import cn.mybatis.pojo.User;
import com.github.abel533.entity.Example;
public class TestMappers {
UserMapper usermapper;
String resource = "mybatis-config.xml";
InputStream inputStream;
SqlSessionFactory sqlsessionFactory;
SqlSession sqlSession;
@Before
public void setUp() throws Exception {
inputStream = Resources.getResourceAsStream(resource);
sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlsessionFactory.openSession();
// 動態代理實現
usermapper = this.sqlSession.getMapper(UserMapper.class);
}
/**
* 查詢1個用戶
*/
@Test
public void test() {
User user = new User();
user.setuserName("zhangsan");
User one = this.usermapper.selectOne(user);
System.out.println(one);
}
/**
* 查找用戶,接收一個User對象。
*/
@Test
public void testselect(){
User user = new User();
user.setSex(2);
List<User> list = this.usermapper.select(null);
for (User user2 : list) {
System.out.println(user2);
}
System.out.println("-------------");
List<User> list2 = this.usermapper.select(user);
for (User user2 : list2) {
System.out.println(user2);
}
}
/**
* 查詢總條數
*/
@Test
public void testSlecteCount(){
int count = this.usermapper.selectCount(null);
System.out.println(count);
System.out.println("--------");
User user = new User();
user.setSex(1);
int count2 = this.usermapper.selectCount(user);
System.out.println(count2);
}
/**
* 根據主鍵查詢
*/
@Test
public void testSelectByPrimaryKey(){
User user = this.usermapper.selectByPrimaryKey(1L);
System.out.println(user);
}
@Test
public void testInsert(){
User user = new User();
user.setAge(22);
user.setPassword("11111");
// this.usermapper.insert(user);
this.usermapper.insertSelective(user);
// 提交
this.sqlSession.commit();
}
@Test
public void testDelete(){
User user = new User();
user.setAge(22);
int i = this.usermapper.delete(user);
this.sqlSession.commit();
System.out.println(i);
}
@Test
public void testUpdate(){
User user = new User();
user.setId(18L);
user.setuserName("kk0");;
int i = this.usermapper.updateByPrimaryKeySelective(user);
this.sqlSession.commit();
System.out.println(i);
}
@Test
public void testSelectByExample(){
Example example = new Example(User.class);
example.createCriteria().andEqualTo("sex", 1).andBetween("age", 10, 22);
example.or(example.createCriteria().andLike("name", "李"));
example.setOrderByClause("age desc");
List<User> list = this.usermapper.selectByExample(example);
for (User user : list) {
System.out.println(user);
}
}
}
總結:通用mapper 的要求:
1.默認表名爲類名(@Table())
2.默認字段名就是類屬性名(在駝峯規則內),如果不一致,使用@Column註解
3.主鍵字段必須聲明@Id
4.實現ID的回寫@GeneratedValue(strategy=GenerationType.IDENTITY)