当前位置: 首页 > news >正文

网站开发 项目介绍海外服务器官网

网站开发 项目介绍,海外服务器官网,上海网站建设费,上海工作网站orm jdbc我很高兴宣布Spring Data JDBC存储库项目的第一个版本。 这个开源库的目的是为基于Spring框架中 JdbcTemplate关系数据库提供通用#xff0c;轻量且易于使用的DAO实现#xff0c;与项目的Spring Data 框架兼容。 设计目标 轻巧#xff0c;快速且开销低。 只有少数几… orm jdbc 我很高兴宣布Spring Data JDBC存储库项目的第一个版本。 这个开源库的目的是为基于Spring框架中 JdbcTemplate关系数据库提供通用轻量且易于使用的DAO实现与项目的Spring Data 框架兼容。 设计目标 轻巧快速且开销低。 只有少数几个类 没有XML注释反射 这不是成熟的ORM 。 没有关系处理延迟加载脏检查缓存 在几秒钟内实现CRUD 对于JPA过大的小型应用程序 在需要简单性或考虑将来迁移到JPA时使用 对数据库方言差异的最小化支持例如结果的透明分页 特征 每个DAO为以下内容提供内置支持 通过RowMapper抽象到域对象/从域对象映射 生成的和用户定义的主键 提取生成的密钥 复合多列主键 不变的领域对象 分页请求结果子集 按几列排序与数据库无关 对多对一关系的可选支持 支持的数据库不断测试 MySQL 通过SqlGenerator类可以轻松扩展到其他数据库方言。 通过ID轻松检索记录 API 与Spring Data PagingAndSortingRepository抽象兼容 所有这些方法都为您实现 public interface PagingAndSortingRepositoryT, ID extends Serializable extends CrudRepositoryT, ID {T save(T entity);IterableT save(Iterable? extends T entities);T findOne(ID id);boolean exists(ID id);IterableT findAll();long count();void delete(ID id);void delete(T entity);void delete(Iterable? extends T entities);void deleteAll();IterableT findAll(Sort sort);PageT findAll(Pageable pageable); } 还完全支持Pageable和Sort参数这意味着您可以通过任意属性免费获得分页和排序 。 例如假设您有userRepository扩展了PagingAndSortingRepositoryUser, String接口由库为您实现并且在应用某种排序后您请求了USERS表的第5页每页10个 PageUser page userRepository.findAll(new PageRequest(5, 10,new Sort(new Order(DESC, reputation),new Order(ASC, user_name))) ); Spring Data JDBC存储库库将把此调用转换为PostgreSQL语法 SELECT * FROM USERS ORDER BY reputation DESC, user_name ASC LIMIT 50 OFFSET 10 …甚至Derby语法 SELECT * FROM (SELECT ROW_NUMBER() OVER () AS ROW_NUM, t.*FROM (SELECT *FROM USERSORDER BY reputation DESC, user_name ASC) AS t) AS a WHERE ROW_NUM BETWEEN 51 AND 60 无论使用哪个数据库都将获得PageUser对象作为返回对象您仍然必须自己提供RowMapperUser才能将其从ResultSet转换为域对象。如果您还不知道Spring Data项目那么PageT是一个很棒的抽象不仅封装了ListUser 而且还提供了元数据例如记录总数我们当前所在的页面等。 使用理由 由于将来您的代码将仅依赖于Spring Data Commons伞项目中的PagingAndSortingRepository和CrudRepository定义的方法 PagingAndSortingRepository您可以自由地从JdbcRepository实现从该项目切换到 JpaRepository MongoRepository GemfireRepository或GraphRepository 。 它们都实现相同的通用API。 当然不要指望从JDBC切换到JPA或MongoDB就像切换导入的JAR依赖项一样简单-但是至少您可以通过使用相同的DAO API最小化影响。 您需要一个快速简单的JDBC包装器库。 JPA甚至MyBatis都不过分 如果需要您想完全控制生成SQL 您想使用对象但是不需要延迟加载关系处理多级缓存脏检查……您需要CRUD等等 您想干吗 您已经在使用Spring或什至JdbcTemplate 但仍然觉得手工工作过多 您的数据库表很少 入门 有关更多示例和工作代码请不要忘记检查项目测试 。 先决条件 Maven坐标 dependencygroupIdcom.blogspot.nurkiewicz/groupIdartifactIdjdbcrepository/artifactIdversion0.1/version /dependency 不幸的是该项目尚未在Maven中央存储库中 。 目前您可以通过克隆将库安装在本地存储库中 $ git clone git://github.com/nurkiewicz/spring-data-jdbc-repository.git $ git checkout 0.1 $ mvn javadoc:jar source:jar install 为了启动您的项目必须存在DataSource bean并启用事务管理。 这是一个最小MySQL配置 EnableTransactionManagement Configuration public class MinimalConfig {Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource());}Beanpublic DataSource dataSource() {MysqlConnectionPoolDataSource ds new MysqlConnectionPoolDataSource();ds.setUser(user);ds.setPassword(secret);ds.setDatabaseName(db_name);return ds;}} 具有自动生成的密钥的实体 假设您有一个具有自动生成的密钥MySQL语法的以下数据库表 CREATE TABLE COMMENTS (id INT AUTO_INCREMENT,user_name varchar(256),contents varchar(1000),created_time TIMESTAMP NOT NULL,PRIMARY KEY (id) ); 首先您需要创建到该表的域对象User映射就像在任何其他ORM中一样 public class Comment implements PersistableInteger {private Integer id;private String userName;private String contents;private Date createdTime;Overridepublic Integer getId() {return id;}Overridepublic boolean isNew() {return id null;}//getters/setters/constructors/... } 除了标准的Java样板之外您还应该注意实现PersistableInteger 其中Integer是主键的类型。 PersistableT是一个来自Spring Data项目的接口这是我们对您的域对象的唯一要求。 最后我们准备创建CommentRepository DAO Repository public class CommentRepository extends JdbcRepositoryComment, Integer {public CommentRepository() {super(ROW_MAPPER, ROW_UNMAPPER, COMMENTS);}public static final RowMapperComment ROW_MAPPER //see belowprivate static final RowUnmapperComment ROW_UNMAPPER //see belowOverrideprotected Comment postCreate(Comment entity, Number generatedId) {entity.setId(generatedId.intValue());return entity;} } 首先我们使用Repository批注标记DAO bean。 它启用持久性异常转换。 通过CLASSPATH扫描也可以找到这种带注释的bean。 如您所见我们扩展了JdbcRepositoryComment, Integer 该库的中心类它提供了所有PagingAndSortingRepository方法的实现。 它的构造函数具有三个必需的依赖项 RowMapper RowUnmapper和表名。 您也可以提供ID列名称否则使用默认的id 。 如果您曾经使用过Spring的JdbcTemplate 则应该熟悉RowMapper界面。 我们需要以某种方式将ResultSet列提取到一个对象中。 毕竟我们不想使用原始的JDBC结果。 这很简单 public static final RowMapperComment ROW_MAPPER new RowMapperComment() {Overridepublic Comment mapRow(ResultSet rs, int rowNum) throws SQLException {return new Comment(rs.getInt(id),rs.getString(user_name),rs.getString(contents),rs.getTimestamp(created_time));} }; RowUnmapper来自此库它本质上与RowMapper相反接收一个对象并将其转换为Map 。 库稍后使用此映射来构造SQL CREATE / UPDATE查询 private static final RowUnmapperComment ROW_UNMAPPER new RowUnmapperComment() {Overridepublic MapString, Object mapColumns(Comment comment) {MapString, Object mapping new LinkedHashMapString, Object();mapping.put(id, comment.getId());mapping.put(user_name, comment.getUserName());mapping.put(contents, comment.getContents());mapping.put(created_time, new java.sql.Timestamp(comment.getCreatedTime().getTime()));return mapping;} }; 如果您从不更新数据库表仅读取插入在其他位置的一些参考数据则可以跳过RowUnmapper参数或使用MissingRowUnmapper 。 最后一个难题是postCreate()回调方法该方法在插入对象后调用。 您可以使用它来检索生成的主键并更新域对象如果域对象是不可变的则返回新的主键。 如果不需要它就不要重写postCreate() 。 根据此示例检查JdbcRepositoryGeneratedKeyTest以获取有效的代码。 到目前为止您可能会觉得与JPA或Hibernate相比有很多手动工作。 但是众所周知各种JPA实现和其他ORM框架都会引入大量开销并显示一些学习曲线。 这个微小的库有意让用户承担一些责任以避免复杂的映射反射注释……所有并非总是需要的隐式性。 该项目无意替代成熟稳定的ORM框架。 相反它试图填补原始JDBC和ORM之间的利基其中简单性和低开销是关键特征。 具有手动分配的密钥的实体 在此示例中我们将看到如何处理具有用户定义的主键的实体。 让我们从数据库模型开始 CREATE TABLE USERS (user_name varchar(255),date_of_birth TIMESTAMP NOT NULL,enabled BIT(1) NOT NULL,PRIMARY KEY (user_name) ); …和User域模型 public class User implements PersistableString {private transient boolean persisted;private String userName;private Date dateOfBirth;private boolean enabled;Overridepublic String getId() {return userName;}Overridepublic boolean isNew() {return !persisted;}public User withPersisted(boolean persisted) {this.persisted persisted;return this;}//getters/setters/constructors/...} 注意添加了特殊的persisted瞬态标志。 来自Spring Data项目的CrudRepository.save()合同要求一个实体知道其是否已保存 isNew() 方法–没有单独的create()和update()方法。 对于自动生成的键实现isNew()很简单请参见上面的Comment 但是在这种情况下我们需要一个额外的瞬态字段。 如果您讨厌这种解决方法并且只插入数据而从不更新则始终可以从isNew()返回true 。 最后是我们的DAO UserRepository bean Repository public class UserRepository extends JdbcRepositoryUser, String {public UserRepository() {super(ROW_MAPPER, ROW_UNMAPPER, USERS, user_name);}public static final RowMapperUser ROW_MAPPER //...public static final RowUnmapperUser ROW_UNMAPPER //...Overrideprotected User postUpdate(User entity) {return entity.withPersisted(true);}Overrideprotected User postCreate(User entity, Number generatedId) {return entity.withPersisted(true);} } USERS和user_name参数指定表名和主键列名。 我将保留mapper和unmapper的详细信息请参阅源代码 。 但是请注意postUpdate()和postCreate()方法。 它们确保一旦对象被持久保存就设置了persisted标志以便随后对save()调用将更新现有实体而不是尝试重新插入它。 根据此示例检查JdbcRepositoryManualKeyTest以获取有效的代码。 复合主键 我们还支持复合主键由几列组成的主键。 以该表为例 CREATE TABLE BOARDING_PASS (flight_no VARCHAR(8) NOT NULL,seq_no INT NOT NULL,passenger VARCHAR(1000),seat CHAR(3),PRIMARY KEY (flight_no, seq_no) ); 我希望您注意到PeristableT的主键类型 public class BoardingPass implements PersistableObject[] {private transient boolean persisted;private String flightNo;private int seqNo;private String passenger;private String seat;Overridepublic Object[] getId() {return pk(flightNo, seqNo);}Overridepublic boolean isNew() {return !persisted;}//getters/setters/constructors/...} 不幸的是我们不支持将所有ID值封装在一个对象中的小数值类就像JPA使用IdClass 因此您必须使用Object[]数组。 定义DAO类类似于我们已经看到的内容 public class BoardingPassRepository extends JdbcRepositoryBoardingPass, Object[] {public BoardingPassRepository() {this(BOARDING_PASS);}public BoardingPassRepository(String tableName) {super(MAPPER, UNMAPPER, new TableDescription(tableName, null, flight_no, seq_no));}public static final RowMapperBoardingPass ROW_MAPPER //...public static final RowUnmapperBoardingPass UNMAPPER //...} 需要注意的两件事我们扩展了JdbcRepositoryBoardingPass, Object[]并且按预期提供了两个ID列名称 flight_no, seq_no 。 我们通过提供由Object[]包裹的flight_no和seq_no 必须seq_no顺序值来查询此类DAO BoardingPass pass repository.findOne(new Object[] {FOO-1022, 42}); 毫无疑问这在实践中很麻烦因此我们提供了微小的辅助方法您可以静态导入 import static com.blogspot.nurkiewicz.jdbcrepository.JdbcRepository.pk; //...BoardingPass foundFlight repository.findOne(pk(FOO-1022, 42)); 根据此示例检查JdbcRepositoryCompoundPkTest以获取工作代码。 交易次数 该库与事务管理完全正交。 每个存储库的每种方法都需要运行事务并且要由您来设置它。 通常您将Transactional放在服务层上称为DAO bean。 我不建议将Transactional放在每个DAO bean上 。 快取 Spring Data JDBC存储库库不提供任何缓存抽象或支持。 但是 在Spring中使用缓存抽象将Cacheable层添加Cacheable DAO或服务之上非常简单。 另请参见 Spring中的Cacheable开销 。 会费 ..总是欢迎。 不要犹豫 提交错误报告并提出请求 。 现在最大的缺失功能是对MSSQL和Oracle数据库的支持。 如果有人可以看一下那将是非常棒的。 测试中 该库已使用Travis 。 测试套件包含265个测试 53个不同的测试每个测试针对5个不同的数据库运行MySQLPostgreSQLH2HSQLDB和Derby。 在填写错误报告或提交新功能时请尝试包括支持测试用例。 每个拉取请求都会在单独的分支上自动进行测试。 建造 分叉后 正式的存储库构建就像运行一样简单 $ mvn install 在JUnit测试执行期间您会注意到很多异常。 这是正常的。 一些测试是针对仅在Travis CI服务器上可用MySQL和PostgreSQL运行的。 当这些数据库服务器不可用时只需跳过整个测试 结果 Tests run: 265, Failures: 0, Errors: 0, Skipped: 106 异常堆栈跟踪来自根AbstractIntegrationTest 。 设计 库仅包含少数几个类如下图所示 JdbcRepository是实现所有PagingAndSortingRepository方法的最重要的类。 每个用户存储库都必须扩展此类。 同样每个此类存储库都必须至少实现RowMapper和RowUnmapper 仅当您要修改表数据时。 SQL生成委托给SqlGenerator 。 PostgreSqlGenerator. 和DerbySqlGenerator用于与标准生成器不DerbySqlGenerator的数据库。 执照 该项目是在Apache许可的 2.0版与Spring框架相同下发布的。 参考 NoBlogDefFound博客中的JCG合作伙伴 Tomasz Nurkiewicz 为程序员提供的概率分布 。 翻译自: https://www.javacodegeeks.com/2013/01/spring-data-jdbc-generic-dao-implementation-most-lightweight-orm-ever.htmlorm jdbc
http://www.sadfv.cn/news/299404/

相关文章:

  • asp mysql做网站如何在电脑登录wordpress
  • 网站建设制作设计开发福建从化区住房和建设局网站
  • 建设一个招聘网站大概多少费用灵璧县建设局网站
  • 营销型网站开发流程包括设计官网页面需要多少钱
  • 建设一个电商网站安徽公司招聘网站
  • 快速搭建网站前端重庆市网站推广
  • 400网站建设价格微信开发者工具官网平台入口
  • zhihe网站建设 淘宝专业机械设计公司
  • 漂亮的手机网站模板WordPress万级数据优化
  • 南通网站建设seo佛山网站建设玲念建站
  • 网站变更备案给公司做网站 图片倾权
  • 网站建设前的功能单页html模板
  • 营销型网站是啥意思尊云服务器
  • asp.net做学校网站首页天津放心站内优化seo
  • 国外网站国内做二维码wordpress 网站改名
  • 做自己的网站流量怎么网站设计公司哪家专业
  • 网站推广公司 wordpress四川建设人才官方网站
  • 做网站的结论桔子seo网
  • 做网站美工赚钱吗怎么查看wordpress版本
  • 国外的室内设计网站作文生成器
  • 微信开放平台与个人网站怎么四川建设网app
  • 南宁网站建设长春网站建设公司企业模板
  • 网站备案信息被删除查商标官网
  • 禅城南庄网站制作wordpress 文章路径
  • 浙江网站建设服务公司医疗器械备案
  • 织梦做的的网站首页显示空白网站搭建的
  • 网站首页布局设计安庆网站建设专业
  • 网站重构案例学网络营销有前途吗
  • 做的好的购物网站框架网站模板
  • 门户网站建设价格免费网站制作软件的app