mybatis开发--总结--简要说明

Org.oproject.framework简要说明

 

一、Oproject动态生成DAO接口实现类框架

 

用途/好处

         通过动态字节码生成技术,我们只需根据预定的规则定义我们的DAO接口,框架将在spring容器加载bean定义时为我们自动生成DAO接口的实现类,并将实现类注入到spring容器中。省去了我们自己编写DAO接口实现类的工作,节约时间,提高开发效率。

         既然是由框架来生成接口实现类,就必须按框架定义的规则来定义我们的DAO接口。

 

框架原理简要说明

         在spring 加载时,扫描指定的类路径的类文件,对每个类文件做如下处理

1、  判断是否为接口且接口标注为 @DynamicIbatisDAO (动态Ibatis DAO接口),

是则进行下面步骤;

2、  从接口的 @DynamicIbatisDAO 注解中获取指定的用于实现类的bean id,如

@DynamicIbatisDAO 中未指定,则从

@Component("constantTypeDAO")注解中获取。如仍未指定则抛出异常;

3、  从接口的 @DynamicIbatisDAO 注解中获取sqlMapClientTemplate 的

bean id。如未指定sqlMapClientTemplate 的bean id,抛出异常;

4、  采用ASM动态字节码生成技术生成DAO接口的实现类;

5、  以指定的bean id 将实现类注入到spring容器中。

          

框架使用规定

        

         SQL Mapper的要求:

1、  对应的SQL Mapper的 namespace 为DAO接口的短名去掉DAO三个字符的剩

余部分。如 com.wzh.dao.UserDAO  则 namespace应为 User。

2、  SQL Mapper 中的操作语句与DAO接口方法是一一对应的,SQL操作语句以方法名为id。

3、  分页查询中的获取总记录数的语句的id 为方法名+Count。

为什么这么规定?

解释:框架在自动生成DAO的实现类时,内部代码是以DAO接口名(去掉DAO三个字符)为名称空间,以方法名为语句id,来获取对应的语句。

 

         接口申明要求:

 

         1、DAO接口声明必须定义 @DynamicIbatisDAO  注解,可以通过如下方式指定自动生成的实现类的bean id和sqlMapClientTemplate 的bean id。

         @DynamicIbatisDAO(value=”yourBeanId",sqlMapClientTemplate=”sqlMapClientTemplate”)

         Value的默认值为”” ,sqlMapClientTemplate的默认值为 “sqlMapClientTemplate”。

如果未采用上面的方式指定value值(实现类的bean id),框架默认从如下注解获取id。

@Component("")

如获不到id,将抛出异常。

        

         2、必须指定sqlMapClientTemplate 的 bean id(通过@DynamicIbatisDAO),

其默认值为sqlMapClientTemplate,如果和默认值一致,当然不需再显式指定。

        

         3、必须为接口。

 

         接口中方法声明的要求:

        

1、  查询只返回一个对象的方法

方法名要求:以 load、get、select、read开头,如User getUserById(int id)

方法参数要求:一个参数(查询条件)

返回值:和SQL Mapper中对应的语句的returnType一致。

说明:实际调用的是SqlMapClientTemplate.queryForObject方法。

        

2、  查询返回多个对象的List的方法

方法名要求:以 query 开头,ForList 结尾,如 ListqueryUserForList(String name)

方法参数要求:一个(查询条件)或三个参数(第一个为查询条件,第二、三个为

                               int型的分页参数:起始行、行数)

返回值:List

说明:其实际调用的是 SqlMapClientTemplate的如下两个方法。

List queryForList(final String statementName, final Object

parameterObject)

       List queryForList(

final String statementName, final ObjectparameterObject, finalint skipResults, finalint maxResults)

 

3、  分页查询

方法名要求:以query开头,ForPageResult结尾,

如 PageResultqueryUserForPageResult(String name,int startRow,int fetchsize)

                   方法参数要求:两个或三个

                            两个:int 类型,pageNumber、pageSize。

                            三个:第一个为条件参数,后两个为pageNumber、pageSize。

                   返回值:PageResult

                   说明:其实现为,先通过SqlMapClientTemplate.queryForObject获得符合条件的总

                              记录行数,计算出起始行,

然后通过SqlMapClientTemplate.queryForList方法获得对应的记录。

 

4、  单个Insert方法

方法名要求:以save、insert、add 开头,如 intaddUser(User user)

参数要求:一个参数(要写入的对象)

返回值:

说明:其实现调用的是SqlMapClientTemplate的

Object insert(final String statementName, final ObjectparameterObject)

方法。

5、  批量insert

方法名要求:以batchSave、batchInsert、batchAdd开头,如 void batchSaveUsers(List userList)

方法参数要求:一个,集合(要批量insert的对象集合)

返回值:void

说明:其实现是调用了 BatchExecuteUtils.batchInsert方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。

 

6、  单个update

方法名要求:以update开头,如 intupdateUser(User user)

方法参数要求: 一个,要update的对象类型。

返回值:当方法返回值定义为 int 时将返回操作影响的行数。如为其他类型将得不到值。

说明:其实现调用的是SqlMapClientTemplate.update(string,Object)方法。

 

7、  批量update

方法名要求:以batchUpdate开头,如 void batchUpdateUsers(ListuserList)

方法参数要求:一个,集合(要批量update的对象集合)

返回值:void

说明:其实现是调用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。

 

8、  单个delete

方法名要求:以delete、remove、del开头,如 intdeleteUser(User user)

方法参数要求:一个,要删除的对象或条件

返回值:当方法返回值定义为 int 时将返回操作影响的行数。如为其他类型将得不到值。

说明:其实现调用的是SqlMapClientTemplate.delete(string,Object)方法。

 

9、  批量delete

方法名要求:以batchDelete、batchRemove、batchDel开头,

如 void batchDeleteUsers(List userList)

方法参数要求:一个,集合(要批量delete的对象集合)

                   返回值:void

说明:其实现是调用了 BatchExecuteUtils.batchUpdate方法。BatchInsert方法调用SqlMapClientTemplate.execute,通过SqlMapExecutor 的批量方法实现批量写入。

 

 

<think>嗯,用户让我介绍一下MyBatisMyBatis-Plus的区别。首先,我得回忆一下这两个框架的基本概念。MyBatis是一个持久层框架,它通过XML或注解配置SQL映射,避免了JDBC的繁琐代码,但用户需要自己写SQL和实现CRUD操作。而MyBatis-Plus是在MyBatis基础上的增强工具,旨在简化开发,提高效率。 接下来,我需要确定用户的需求。他们可能是在选择技术栈,或者已经使用MyBatis但想要更高效的工具。用户可能是开发者,尤其是后端或全栈,可能对减少样板代码、提高生产力感兴趣。用户可能没有明确说出的是,他们想知道MyBatis-Plus具体带来了哪些便利,是否有学习成本,或者是否有其他优势,比如内置的分页插件、代码生成器等。 然后,我需要结构化的回答。先介绍两者各自的特点,再分点对比核心功能、开发效率、适用场景等。比如,MyBatis需要手动写CRUD,而MyBatis-Plus提供了BaseMapper,自动生成SQL。此外,MyBatis-Plus的代码生成器可以快速生成实体类、Mapper等,节省时间。还有内置的分页插件、乐观锁支持等,这些都是MyBatis不具备的。 还要注意可能的误解,比如MyBatis-Plus是否完全替代了MyBatis,或者是否需要额外学习很多新东西。应该说明MyBatis-Plus是对MyBatis的增强,兼容原有功能,同时添加了更多便捷特性。 另外,适用场景方面,如果项目需要高度定制化的SQL,或者已有复杂的MyBatis配置,可能更适合用原生MyBatis。而新项目或需要快速开发时,MyBatis-Plus会更合适。同时,需要提到如果团队熟悉MyBatis,过渡到MyBatis-Plus的学习成本较低,但如果是新手,可能需要先了解MyBatis的基础。 还要考虑用户可能的后续问题,比如性能差异、社区支持情况等。虽然用户没问,但可以简要提及,比如两者性能相当,MyBatis-Plus的社区活跃,文档齐全,适合国内开发环境。 最后,总结何时选择哪个框架,帮助用户根据项目需求做出决策。确保回答清晰,结构分明,重点突出,让用户能快速抓住关键区别。</think>MyBatisMyBatis-Plus 都是 Java 持久层框架,用于简化数据库操作,但它们在功能和使用体验上有显著差异。以下是两者的核心区别: --- ### **1. 定位与功能** - **MyBatis** - 是一个**基础 ORM 框架**(对象关系映射),需手动编写 SQL 和实现大部分 CRUD 操作。 - 核心功能:通过 XML 或注解配置 SQL 映射、参数绑定、结果集映射,支持动态 SQL。 - **灵活性高**,但需要开发者自行处理重复性代码(如分页、通用增删改查)。 - **MyBatis-Plus** -MyBatis 的**增强工具**,在保留 MyBatis 所有功能的基础上,提供大量开箱即用的功能。 - 核心增强:内置通用 Mapper、通用 Service、代码生成器、分页插件、乐观锁等。 - **开发效率更高**,通过少量配置即可实现大部分单表操作,减少重复代码。 --- ### **2. 核心差异对比** | **特性** | **MyBatis** | **MyBatis-Plus** | |------------------------|--------------------------------------|-----------------------------------------------| | **SQL 编写** | 需手动编写所有 SQL | 单表操作无需写 SQL(通过 `BaseMapper` 自动生成) | | **CRUD 实现** | 自行实现每个实体的增删改查 | 提供通用 `BaseMapper`,直接调用 `selectById()`, `insert()` 等方法 | | **代码生成器** | 无内置,需依赖其他工具(如 MyBatis Generator) | 内置代码生成器,快速生成 Entity、Mapper、Service 等 | | **分页插件** | 需手动实现或集成第三方插件 | 内置分页插件(`PaginationInterceptor`),一行配置即可使用 | | **乐观锁** | 需自行实现 | 内置 `@Version` 注解支持乐观锁 | | **逻辑删除** | 需手动处理 | 通过 `@TableLogic` 注解自动实现逻辑删除 | | **Lambda 表达式** | 不支持 | 支持 Lambda 表达式编写查询条件(避免硬编码字段名) | --- ### **3. 代码示例对比** - **MyBatis 实现查询** 需在 XML 中编写 SQL: ```xml <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` 调用时需要手动注入 Mapper 并调用方法。 - **MyBatis-Plus 实现查询** 直接通过 `BaseMapper` 方法调用,无需写 SQL: ```java User user = userMapper.selectById(1L); ``` --- ### **4. 适用场景** - **选择 MyBatis** - 需要高度定制化 SQL 的复杂项目(如多表关联、复杂查询)。 - 已有 MyBatis 项目,不希望引入新依赖。 - **选择 MyBatis-Plus** - 快速开发新项目(尤其是单表操作较多的场景)。 - 希望减少重复代码、提升开发效率。 - 需要内置功能(如分页、逻辑删除、性能分析等)。 --- ### **5. 总结** - **MyBatis**:灵活但需更多手动编码,适合对 SQL 控制要求高的场景。 - **MyBatis-Plus**:在 MyBatis 基础上进一步封装,提供“自动化”能力,适合追求开发效率的场景。 - **关系**:MyBatis-Plus 并非替代 MyBatis,而是扩展工具,完全兼容原生 MyBatis 的所有功能。 如果项目以单表操作为主或需要快速迭代,MyBatis-Plus 能显著提升效率;若涉及复杂 SQL 或多表关联,可结合 MyBatis 的灵活性使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值