MyBatis3 通用CRUD的研究[一]

尝试了下MyBatis3,感觉不错,比自己写的那个ORM框架完善~~(好吧..我臭屁了)

问题:

MyBatis3提供了一种半自动化的ORM解决方案,比Hibernate这种全自动解决方案多了不少的灵活性和可操控性,试用了下感觉还不错,就是有个问题在于,MyBatis的所有处理都需要提供一个xml配置或者注解形式的语句,虽然动态SQL很强大,但是一般项目使用时,最多的CRUD操作,大多模式都是固定的

select:select * from [tablename]

insert:insert into [tablename]([field list]) values([values list])

update:update [tablename] set [field]=[value]... where [id]=[key]

delete:delete from [tablename] where [id]=[key]

这几种CRUD操作占了大部分,但是以MyBatis来说,每个表都要重新写一遍这几条相同的SQL又是一件非常烦人的事情,而且,那臃肿的xml配置文件看着就很烦啊

 

目的:

提供一个Mapper基接口,可以自动进行4种基本的CRUD操作,而不需要相应的xml文件

 

目前研究成果:

insert/update/delete操作可以非常完美的完成,select操作目前还需要多一条语句

 

首先,MyBatis使用名叫Mapper的接口来抽象化SQL操作,2种基本的方式:xml配置和注解配置

xml配置方式肯定没法达到自动继承的目的,放弃

来看看注解方式,MyBatis提供了2个注解标记 @Select 和 @SelectProvider,select标记只能处理字符串常量,放弃..

@SelectProvider可以使用一个SQL提供程序来生成相应的SQL语句,恩,这个很好很强大,我们可以设计一个基接口来生成我们需要的SQL

 

首先拿比较简单的Delete语句来看,我们的基接口可以这样写

/**
 * MyBatis CRUD基接口
 * @author ALLEN.HU
 *
 * @param <T> 处理的POJO对象
 */
public interface BaseMapper<T extends MyBatisPojo> {
	@DeleteProvider(type = CUDTemplate.class,method = "delete")
	public void delete(T obj);
}


 

想要从一个POJO上自动生成SQL语句需要2个必须的部分,一个是表名,一个是主键名

先做一个POJO的基类,方便以后调用,也方便泛型的处理 MyBatisPojo

/**
 * MyBatis用POJO基类
 * 借用了JPA的注解标签 @Table和@Id 需要引入javax.persistence包(persistence.jar)
 * @author Allen.Hu
 *
 */
public class MyBatisPojo implements Serializable{

	private static final long serialVersionUID = 1L;

	/**
	 * 获取POJO对应的表名
	 * 需要POJO中的属性定义@Table(name)
	 * @return
	 */
	public String tablename() {
		Table table = this.getClass().getAnnotation(Table.class);
		if(table != null)
			return table.name();
		else
			throw new RuntimeException("undefine POJO @Table, need Tablename(@Table)");
	}

	/**
	 * 获取POJO对应的主键名称
	 * 需要POJO中的属性定义@Id
	 * @return
	 */
	public String id() {
		for(Field field : this.getClass().getFields()) {
			if(field.isAnnotationPresent(Id.class))
				return field.getName();
		}
		
		throw new RuntimeException("undefine POJO @Id");

	}
}

然后是动态sql的生成类 CUDTemplate

import static org.apache.ibatis.jdbc.SqlBuilder.*;

public class CUDTemplate<T extends MyBatisPojo> {
	public String delete(T obj) {
		String idname = obj.id();
		
		BEGIN();
		
		DELETE_FROM(obj.tablename());
		WHERE(idname + "=#{" + idname + "}");
		
		return SQL();
	}
}


有了这三个简单的类/接口,在实际使用中,就不再需要烦人的xml配置了,继承MyBatisPojo的实体配合继承BaseMapper的映射器,就能直接使用对应的delete方法了

假设表 test

create table "RSMNG"."dbo"."test"(
        "id" int identity not null,
       "text" varchar(100) not null,
        constraint "PK_test" primary key ("id")
    )

就2个字段,一个id作为主键,一个text

对应的Pojo类

@Table(name = "test")
public class Test extends MyBatisPojo {
 @Id
 private Integer id;
 
 @Column
 private String text;

 public void setId(Integer id) {
  this.id = id;
 }
 
 public Integer getId() {
  return id;
 }

 public void setText(String text) {
  this.text = text;
 }

 public String getText() {
  return text;
 }
}


对应的Mapper TestMapper

/**
* 从BaseMapper继承的话,不需要再去实现基本方法
*/
public interface TestMapper extends BaseMapper<Test> {
 
}


实际使用时,只需要调用testMapper.delete(Test)函数就能执行相应的删除动作了

 

完整代码下次一起放上

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis Plus 是在 MyBatis 的基础上进行的二次封装,提供了一套通用CRUD(增删改查)代码操作。通过使用 MyBatis Plus,我们可以大大简化数据库操作的代码编,并且极大提升了开发效率。 在 MyBatis Plus ,我们只需要定义一个实体类,通过注解的方式指定数据表的映射关系,就可以自动生成包括增加、删除、更新、查询的通用操作方法。同时,MyBatis Plus 也支持使用简单的条件构造器进行查询操作,并且可以通过代码生成器生成实体类、Mapper 接口、XML 映射文件等。 对于增加操作,我们只需要调用对应的插入方法,并传入需要插入的实体对象即可。对于删除操作,我们可以通过主键或者条件构造器来删除满足条件的记录。更新操作使用了乐观锁的机制,在更新时会检查数据的版本号,防止并发导致的数据错误。查询操作可以通过主键、条件构造器或者分页进行查询,为了提高性能,还可以使用缓存进行查询结果的缓存。 MyBatis Plus 不仅提供了基本的 CRUD 操作,还可以进行条件构造器的自定义,支持 Lambda 表达式进行查询操作,提供了分页、乐观锁等功能,灵活性很高。同时,MyBatis Plus 也支持自定义 SQL 语句的编,可以满足复杂业务场景下的需求。 总的来说,MyBatis Plus 提供了一套通用CRUD 代码操作,大大简化了数据访问层的开发工作,提升了开发效率和代码质量。它是一个成熟而强大的持久层框架,被广泛应用于各种 Java 后端项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值