`
923080512
  • 浏览: 191415 次
  • 性别: Icon_minigender_1
  • 来自: 商丘
社区版块
存档分类
最新评论

MyBatis3 通用CRUD的研究[一]

阅读更多

问题:

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语句来看,我们的基接口可以这样写

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


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

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

  1. /**
  2. * MyBatis用POJO基类
  3. * 借用了JPA的注解标签 @Table和@Id 需要引入javax.persistence包(persistence.jar)
  4. * @author Allen.Hu
  5. *
  6. */
  7. public class MyBatisPojo implements Serializable{
  8. private static final long serialVersionUID = 1L;
  9. /**
  10. * 获取POJO对应的表名
  11. * 需要POJO中的属性定义@Table(name)
  12. * @return
  13. */
  14. public String tablename() {
  15. Table table = this.getClass().getAnnotation(Table.class);
  16. if(table != null)
  17. return table.name();
  18. else
  19. throw new RuntimeException("undefine POJO @Table, need Tablename(@Table)");
  20. }
  21. /**
  22. * 获取POJO对应的主键名称
  23. * 需要POJO中的属性定义@Id
  24. * @return
  25. */
  26. public String id() {
  27. for(Field field : this.getClass().getFields()) {
  28. if(field.isAnnotationPresent(Id.class))
  29. return field.getName();
  30. }
  31. throw new RuntimeException("undefine POJO @Id");
  32. }
  33. }

然后是动态sql的生成类 CUDTemplate

  1. import static org.apache.ibatis.jdbc.SqlBuilder.*;
  2. public class CUDTemplate<T extends MyBatisPojo> {
  3. public String delete(T obj) {
  4. String idname = obj.id();
  5. BEGIN();
  6. DELETE_FROM(obj.tablename());
  7. WHERE(idname + "=#{" + idname + "}");
  8. return SQL();
  9. }
  10. }


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

假设表 test

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

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

对应的Pojo类

  1. @Table(name = "test")
  2. public class Test extends MyBatisPojo {
  3. @Id
  4. private Integer id;
  5. @Column
  6. private String text;
  7. public void setId(Integer id) {
  8. this.id = id;
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setText(String text) {
  14. this.text = text;
  15. }
  16. public String getText() {
  17. return text;
  18. }
  19. }


对应的Mapper TestMapper

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


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

分享到:
评论
2 楼 zfms 2012-08-16  
有没哟源代码参考一下,建议上传源代码,谢谢。
1 楼 tsxtjian 2012-05-21  
楼主这篇文章果然很精辟,很有用!

相关推荐

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询

    "封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询"是一个典型的企业级Web应用开发实践,它整合了三个主流的Java开源框架,即Spring、Struts2和MyBatis3,用于实现数据的创建(Create)、读取(Read)、更新...

    mybatis基于Dao的crud操作源码

    Mybatis 是一个轻量级的Java持久层框架,它提供了SQL映射框架,使得开发者能够直接编写SQL语句,而不必依赖于ORM(对象关系映射)工具。本项目是基于Mybatis进行DAO(Data Access Object)层的CRUD(Create、Read、...

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context=...

    Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x

    我们将以"Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用Mapper3.5.x"为主题,详细解析这一过程。 首先,理解通用Dao的概念。Dao是数据访问对象,它的主要职责是封装数据库操作,使得业务层代码...

    ibatis mybatis crud 完整代码

    同时,我们也会涉及通用分页这一实用功能。 `iBatis` 是一款由 Apache Software Foundation 维护的开源项目,它最初由 Clinton Begin 创建。`iBatis` 提供了一种将SQL语句与Java代码解耦的方法,通过XML或注解来...

    mybatis-universal-crud:基于mybatis的通用crud操作框架

    该项目基于mybatis封装, 目前只支持mysql, 旨在提供一个对dao层通用的操作,支持普通java程序和spring程序. 1 特性: 关键字转义,防止sql注入; 注解支持; 查询, 普通条件查询, 连表查询, 懒加载; 更新, 替换更新...

    Mybatis通用DAO设计封装(mybatis)

    通过以上设计,我们可以构建出一个高效、灵活且易于维护的Mybatis通用DAO层。这种设计封装了数据库操作的细节,使得业务逻辑层可以更专注于业务本身,提升了开发效率。在实际项目中,可以根据具体需求进行适当的扩展...

    springboot + mybatis(通用mapper) + druid多数据源

    通用Mapper是MyBatis的一种扩展,提供了很多预定义的CRUD操作,简化了开发过程,减少了代码量。而Druid的多数据源支持,则允许程序同时连接并操作不同的数据库,这在处理分布式系统或需要分离读写操作的场景中非常...

    通用mybatis-MySQL增删改查CRUD源码

    MyBatis的通用CRUD** 在提供的源码中,很可能包含了一套通用的CRUD模板或者工具类,用于处理常见的数据库操作。例如,可能有如下的方法: - `insert()`:插入数据,通常会调用`insert(String sqlId, Object ...

    mybatis通用mapper笔记

    MyBatis通用Mapper是一种基于MyBatis框架的扩展插件,它能够为开发者提供一系列方便的CRUD(创建、读取、更新、删除)操作方法,极大地简化了日常开发中的数据库操作流程。通用Mapper支持自定义SQL,同时也提供了对...

    mybatis开发通用mapper共9页.pdf.zip

    【描述解析】:“mybatis开发通用mapper共9页.pdf.zip”描述与标题一致,表明这是一个PDF格式的压缩文件,内容聚焦于MyBatis通用Mapper的开发,且包含9页详细信息。由于没有提供具体细节,我们可以推测文档可能涵盖...

    ibatis struts2 spring3 mybatis 分页 crud 完整代码

    这里我们讨论的是一个基于Ibatis、Struts2、Spring3的整合应用,涵盖了数据访问、业务逻辑和控制层的关键技术,以及分页和CRUD操作的实现。下面我们将详细探讨这些知识点。 1. **Ibatis**:Ibatis是一个优秀的持久...

    springboot + mybatis(通用mapper) + HikariCP(比durid更快)多数据源

    在项目中引入 `通用Mapper`,这是一个基于 `MyBatis` 的插件,可以自动生成 CRUD 操作,大大减少了为每个表编写 XML 映射文件和对应的 Service 层代码的工作。通用Mapper提供了丰富的API,使得开发人员能够快速实现...

    TkMybatis通用Mapper逆向工程代码生成工具

    TkMybatis通用Mapper通过提供一系列预定义的CRUD操作,使得开发者可以快速进行数据操作,而无需编写大量重复的Mapper方法。 Ibatis是MyBatis的前身,是一个持久层框架,它允许开发者将SQL语句直接写在配置文件中,...

    Mybatis通用增删改查

    Mybatis通用Mapper是社区提供的一种增强工具,它通过注解的方式,简化了SQL的编写。开发者只需要在Mapper接口上添加相应的注解,就可以自动生成对应的SQL语句。例如,@Insert、@Update、@Delete和@Select可以分别...

    【自虐1.2】Srping+MyBatis完成CRUD

    接着,创建一个UserMapper接口,继承自BaseMapper(通常是一个通用的基类,包含CRUD的基本方法),并添加自定义的SQL查询方法。 ```java public interface UserMapper extends BaseMapper&lt;User&gt; { User ...

    springboot+mybatis通用注解

    在"springboot+mybatis通用注解"这个项目中,开发者进行了深入的整合与封装,旨在进一步提升开发效率。通过自定义注解,我们可以实现动态生成SQL语句的功能。这样的设计减少了手动编写SQL语句的工作量,同时降低了...

    mybatis-通用Mapper-逆向工程-代码生成工具

    通用Mapper是MyBatis框架中的一个实用工具,它极大地简化了数据库操作的代码编写工作,尤其是在处理CRUD(创建、读取、更新、删除)操作时。MyBatis-通用Mapper通过逆向工程(Reverse Engineering)和代码生成工具,...

Global site tag (gtag.js) - Google Analytics