一路走来,关系数据库到非关系数据库,不觉已接触了不少的ORM框架也在这些ORM框架的基础上积累了一些通用的DAO,下面从 学习笔记(原理、优势、劣势) 和 个人总结(踩过的坑,注意事项) 两方面展开描述:
LINQ
LINQ全称Language Integrated Query
大学期间接触DotNet/C#一般会对LINQ有所了解,印象中是封装了DAO层的数据库连接,可以通过一些如select/where/group by等关键词以熟悉的代码形式进行数据CRUD操作
下面是官方的LINQ的官方描述
1 | LINQ to SQL 是 .NET Framework 3.5 版的一个组件,提供了用于将关系数据作为对象管理的运行时基础结构。 |
后来DotNET没深入学习了,工作的技术选型都是J2EE和一敏捷脚本类(Python)的方案,不做太多总结
Spring-JDBC
官方文档
Spring Framework JDBC会封装处理JDBC底层的细节,让JDBC更友好,具体如下
Spring-JDBC自动处理的
- Open connection.
- Prepare and execute the statement.
- Set up the loop to iterate through the results (if any).
- Process any exception.
- Handle transactions.
- Close the connection, statement and resultset.
用户需设置的 - Define connection parameters.
- Specify the SQL statement.
- Declare parameters and provide parameter values
- Do the work for each iteration.
Spring-JDBC的使用概要
JdbcTemplate - 这是经典的也是最常用的Spring对于JDBC访问的方案。这也是最低级别的封装, 其他的工作模式事实上在底层使用了JdbcTemplate作为其底层的实现基础。JdbcTemplate在JDK 1.4以上的环境上工作得很好。
NamedParameterJdbcTemplate - 对JdbcTemplate做了封装,提供了更加便捷的基于命名参数的使用方式而不是传统的JDBC所使用的“?”作为参数的占位符。这种方式在你需要为某个SQL指定许多个参数时,显得更加直观而易用。该特性必须工作在JDK 1.4以上。
SimpleJdbcTemplate - 这个类结合了JdbcTemplate和NamedParameterJdbcTemplate的最常用的功能,同时它也利用了一些Java5的特性所带来的优势,例如泛型、varargs和autoboxing等,从而提供了更加简便的API访问方式。需要工作在Java 5以上的环境中。
SimpleJdbcInsert 和 SimpleJdbcCall - 这两个类可以充分利用数据库元数据的特性来简化配置。通过使用这两个类进行编程,你可以仅仅提供数据库表名或者存储过程的名称以及一个Map作为参数。其中Map的key需要与数据库表中的字段保持一致。这两个类通常和SimpleJdbcTemplate配合使用。这两个类需要工作在JDK 5以上,同时数据库需要提供足够的元数据信息。
RDBMS 对象包括MappingSqlQuery, SqlUpdate and StoredProcedure - 这种方式允许你在初始化你的数据访问层时创建可重用并且线程安全的对象。该对象在你定义了你的查询语句,声明查询参数并编译相应的Query之后被模型化。一旦模型化完成,任何执行函数就可以传入不同的参数对之进行多次调用。这种方式需要工作在JDK 1.4以上。
优势:强大、优雅、轻量、持续更新维护,与JDBC相对,减少了大量的冗余DAO层代码
setMaxRows和setFetchSize
They do different things.
The setMaxRows = number of rows that can be returned overall.
setFetchSize = number that will be returned in each database roundtrip i.e.
setFetchSize Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement.
setMaxRows Sets the limit for the maximum number of rows that any ResultSet object generated by this Statement object can contain to the given number.
Spring JDBC +Spring JPA
缓存可以用第三方,例如ehcached,或者mc
拼接SQL
拼接SQL注意需特别注意字段值中存在转义字符(如”\”,”‘“)的情况,应使用类PreparedStatement中?方式替换变量执行CRUD操作
Hibernate
MyBatis
MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
Mybatis的功能架构分为三层:
- API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。 - 数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。 - 基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
Mybatis与Hibernate比较
Mybatis:小巧、方便、高效、简单、直接、半自动、移植性低
Hibernate:强大、方便、高效、复杂、绕弯子、全自动、移植性高
Mybatis应用场景
一直在用Hibnernate,抽取一个完善的DAO抽象类后会少很多工作,更受益与其更换数据库时超强的移植性,DAO层基本不作修改,更换数据库方言即可。但在以下场景时,Mybatis自有其可取之处:
- 当无法对数据库结构做到控制和修改,Mybatis的灵活性将比hibernate更适合;
- 当系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标,在这种情况下Mybatis会有更好的可控性和表现,可以进行细粒度的优化。