- 浏览: 1756866 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173654
-
Android学习笔记
浏览量:368115
-
iBatis开发详解
浏览量:189258
-
Objective-C学习...
浏览量:99837
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
本文接上一篇继续研究Spring的JDBC模板。
之前,我们使用JDBC模板的方法是在每次调用方法时生成该对象,并使用了一个dataSource作为参数,这个dataSource是在生成DAO的实现类时Spring进行注入的。显然,这样的方式并不是最佳的做法,因为每次方法调用时都需要重新生成新的JDBC模板对象,那么现在,我们就来看看如何优化我们的程序。首先是简化JDBC模板的创建,那么我们就采用注入的方式来进行:
精简后的代码就非常短了,也非常的清晰。那么采用注入之后,需要修改Spring的配置文件,当然这也非常的简单:
除了这种使用方式,我们还可以直接扩展Spring的JdbcDaoSupport抽象类,那么只需让我们的DAO实现类扩展JdbcDaoSupport即可,配置文件中直接给DAO注入数据源即可,而且我们不需要再显式注入它们,因为JdbcDaoSupport已经为我们做了这些工作了,代码就得到了进一步的精简:
对应修改配置文件:
这样我们的DAO层代码就已经非常的精简了,维护性也提高了。同时,我们还可以扩展SimpleJdbcDaoSupport抽象类来获得一些Java 5的新特性支持,不过Spring 3中已经对JdbcTemplate进行了调整,想测试SimpleJdbcDaoSupport也很简单,可以直接使用getSimpleJdbcTemplate()方法获得简化的JDBC模板,然后进行操作。下面我们通过SipleJdbcTemplate来看看如何简化查询操作,首先修改一下我们的映射器。
改为实现ParameterizedRowMapper接口,覆盖的方法不变。但在Spring3中,SimpleJdbcTemplate使用RowMapper是新方法,ParameterizedRowMapper是已经废弃的方法了。这点要注意,那么我们继续使用Spring3中的RowMapper。
这样就不需要转型了,代码得到进一步的精简,这就是利用了Java 5的新特性:泛型。当然还有一种实现方式:
这样我们就不需要再额外创建RowMapper的实现类了,这样就会自动为我们映射属性了。再看看查询所有车辆的方法,也得到了大量的简化:
而单值查询的方式也可以继续精简:
更多简化的JDBC模板使用方法参考官方文档即可,都非常非常的简单了。下面一个内容就是命名参数的使用了。JDBC模板也支持命名参数风格的SQL语句,使用起来也很容易,比如我们的插入操作,就可以改为:
update方法还可以使用ParameterSource实现的参数,比如:
这两种方法都不是很简便,需要设置参数,下面就来简化操作:
使用自动为我们映射属性的BeanPropertySqlParamterSource就很简单了,一步到位了。批量插入操作同样可以使用命名参数的方式来进行:
Spring对JDBC的支持就介绍完了。(本部分内容完)后续将继续探讨Spring的数据库访问之ORM部分。
根据需求添加就可以了。呵呵
之前,我们使用JDBC模板的方法是在每次调用方法时生成该对象,并使用了一个dataSource作为参数,这个dataSource是在生成DAO的实现类时Spring进行注入的。显然,这样的方式并不是最佳的做法,因为每次方法调用时都需要重新生成新的JDBC模板对象,那么现在,我们就来看看如何优化我们的程序。首先是简化JDBC模板的创建,那么我们就采用注入的方式来进行:
package org.ourpioneer.vehicle.dao; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import org.ourpioneer.vehicle.bean.Vehicle; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; /** * VehicleDAO实现类 * * @author Nanlei * */ public class VehicleDAOImpl implements VehicleDAO { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void delete(Vehicle vehicle) { String sql = "delete from vehicle where ID=?"; jdbcTemplate.update(sql, vehicle.getId()); } public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; BeanPropertyRowMapper<Vehicle> vehicleRowMapper = BeanPropertyRowMapper .newInstance(Vehicle.class); return jdbcTemplate.queryForObject(sql, new Object[] { id }, vehicleRowMapper); } public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(), vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat()); } public void update(Vehicle vehicle) { String sql = "update vehicle set PLATE=?,CHASSIS=?,COLOR=?,WHEEL=?,SEAT=? where ID=?"; jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(), vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat(), vehicle.getId()); } public void insertBatch(final List<Vehicle> vehicles) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { public void setValues(PreparedStatement pstat, int i) throws SQLException { Vehicle vehicle = vehicles.get(i); pstat.setString(1, vehicle.getPlate()); pstat.setString(2, vehicle.getChassis()); pstat.setString(3, vehicle.getColor()); pstat.setInt(4, vehicle.getWheel()); pstat.setInt(5, vehicle.getSeat()); } public int getBatchSize() { return vehicles.size(); } }); } public List<Vehicle> findAll() { String sql = "select * from vehicle"; RowMapper<Vehicle> rows = BeanPropertyRowMapper .newInstance(Vehicle.class); return jdbcTemplate.query(sql, rows); } public int countVehicle() { String sql = "select count(*) from vehicle"; return jdbcTemplate.queryForInt(sql); } public String getChassis(int id) { String sql = "select COLOR from vehicle where ID=?"; return (String) jdbcTemplate.queryForObject(sql, new Object[] { id }, String.class); } }
精简后的代码就非常短了,也非常的清晰。那么采用注入之后,需要修改Spring的配置文件,当然这也非常的简单:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean>
除了这种使用方式,我们还可以直接扩展Spring的JdbcDaoSupport抽象类,那么只需让我们的DAO实现类扩展JdbcDaoSupport即可,配置文件中直接给DAO注入数据源即可,而且我们不需要再显式注入它们,因为JdbcDaoSupport已经为我们做了这些工作了,代码就得到了进一步的精简:
public class VehicleDAOImpl extends JdbcDaoSupport implements VehicleDAO { public void delete(Vehicle vehicle) { String sql = "delete from vehicle where ID=?"; getJdbcTemplate().update(sql, vehicle.getId()); } … … … }
对应修改配置文件:
<bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl"> <property name="dataSource" ref="dataSource" /> </bean>
这样我们的DAO层代码就已经非常的精简了,维护性也提高了。同时,我们还可以扩展SimpleJdbcDaoSupport抽象类来获得一些Java 5的新特性支持,不过Spring 3中已经对JdbcTemplate进行了调整,想测试SimpleJdbcDaoSupport也很简单,可以直接使用getSimpleJdbcTemplate()方法获得简化的JDBC模板,然后进行操作。下面我们通过SipleJdbcTemplate来看看如何简化查询操作,首先修改一下我们的映射器。
改为实现ParameterizedRowMapper接口,覆盖的方法不变。但在Spring3中,SimpleJdbcTemplate使用RowMapper是新方法,ParameterizedRowMapper是已经废弃的方法了。这点要注意,那么我们继续使用Spring3中的RowMapper。
public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; return getSimpleJdbcTemplate().queryForObject(sql, new VehicleRowMapper(), id); }
这样就不需要转型了,代码得到进一步的精简,这就是利用了Java 5的新特性:泛型。当然还有一种实现方式:
public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; return getSimpleJdbcTemplate().queryForObject(sql, BeanPropertyRowMapper.newInstance(Vehicle.class), id); }
这样我们就不需要再额外创建RowMapper的实现类了,这样就会自动为我们映射属性了。再看看查询所有车辆的方法,也得到了大量的简化:
public List<Vehicle> findAll() { String sql = "select * from vehicle"; return getSimpleJdbcTemplate().query(sql, BeanPropertyRowMapper.newInstance(Vehicle.class)); }
而单值查询的方式也可以继续精简:
public String getChassis(int id) { String sql = "select COLOR from vehicle where ID=?"; return getSimpleJdbcTemplate().queryForObject(sql, String.class, id); }
更多简化的JDBC模板使用方法参考官方文档即可,都非常非常的简单了。下面一个内容就是命名参数的使用了。JDBC模板也支持命名参数风格的SQL语句,使用起来也很容易,比如我们的插入操作,就可以改为:
public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)"; Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("plage", vehicle.getPlate()); parameters.put("chassis", vehicle.getChassis()); parameters.put("color", vehicle.getColor()); parameters.put("wheel", vehicle.getWheel()); parameters.put("set", vehicle.getSeat()); getSimpleJdbcTemplate().update(sql, parameters); }
update方法还可以使用ParameterSource实现的参数,比如:
public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)"; Map<String, Object> parameters = new HashMap<String, Object>(); … … … SqlParameterSource parameterSource = new MapSqlParameterSource(parameters); getSimpleJdbcTemplate().update(sql, parameterSource); }
这两种方法都不是很简便,需要设置参数,下面就来简化操作:
public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)"; SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(vehicle); getSimpleJdbcTemplate().update(sql, parameterSource); }
使用自动为我们映射属性的BeanPropertySqlParamterSource就很简单了,一步到位了。批量插入操作同样可以使用命名参数的方式来进行:
public void insertBatch(final List<Vehicle> vehicles) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)"; List<SqlParameterSource> parameters = new ArrayList<SqlParameterSource>(); for (Vehicle vehicle : vehicles) { parameters.add(new BeanPropertySqlParameterSource(vehicle)); } getSimpleJdbcTemplate().batchUpdate(sql, parameters.toArray(new SqlParameterSource[0])); }
Spring对JDBC的支持就介绍完了。(本部分内容完)后续将继续探讨Spring的数据库访问之ORM部分。
- vehicle.rar (26.8 KB)
- 下载次数: 161
评论
2 楼
sarin
2011-12-16
aa87963014 写道
少了一个批量save 返回主键的封装
根据需求添加就可以了。呵呵
1 楼
aa87963014
2011-12-16
少了一个批量save 返回主键的封装
发表评论
-
iBatis操作DDL和映射继承
2012-09-09 21:46 9266本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15746本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7698本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9323CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5792接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15987为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7748经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13109之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17617本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23382本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30806Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27505使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13438本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10729上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13835本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22063本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60084本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42623Spring的MVC模块是一种简洁的Web应用框架,实 ... -
iBatis查询select详解
2010-08-07 12:19 40529<select>是iBatis已经映射的语 ... -
iBatis查询API
2010-07-31 13:04 17691先说点基础的内容 ...
相关推荐
在"Spring数据库访问(HSQL)(三)"这个主题中,博主可能详细讲解了如何配置Spring与HSQL的集成,以及如何利用Spring的数据访问组件进行数据库操作。 首先,我们需要了解Spring的JdbcTemplate和HibernateTemplate...
3. 嵌入式数据源(org.springframework.jdbc.datasource.embedded.EmbeddedDatabase):主要用于本地文件系统数据库,如HSQL、H2、Derby等。 二、事务(Transaction) 事务用于提供数据完整性,并在并发访问下确保...
它通过注解或XML配置将Java类映射到数据库表,简化了数据访问层的开发。 4. Hibernate:Hibernate是JPA的一种实现,是一个流行的ORM框架。它提供了丰富的API和查询语言(HQL和 Criteria API),使得与数据库交互...
该项目通过springcloud集成了mybatis操作mysql数据库,项目主要分为7个model模块,配置模块(config),注册模块(discovery),监控模块(monitor),服务模块_mybatisService(通过mybatis操作mysql),服务模块_...
HSQldb 可以与各种Java应用程序框架如Spring、Hibernate等无缝集成,方便地在应用中使用数据库。 ### 官方手册 《hsqldb_guide.pdf》应该是HSQldb的官方用户指南,包含了详细的使用说明和API参考,是学习和使用...
通过Spring Boot和HSQL在内存DB中使用JDBC。 周六 通过Spring Boot和H2在内存DB(包括Web控制台)中使用JPA。 Spring Data REST 液基 H2数据库 饱和液基 通过Spring Boot和HSQL在内存DB中使用JDBC和 。 休息 通过...
这些起步依赖包含了启动特定功能所需的依赖集合,如`spring-boot-starter-web`用于构建Web应用,`spring-boot-starter-data-jpa`则用于数据库访问。 2. **自动配置(Auto Configuration)**:Spring Boot根据项目中...
这个名为"spring-jpa-hsqldb"的项目是一个很好的实例,它展示了如何将这三个组件整合在一起,用于创建一个简单的数据库驱动的应用程序。下面我们将深入探讨这些技术以及它们在项目中的应用。 首先,让我们了解...
【标题】"springMybatiesHsql"是一个基于Spring、MyBatis和HSQL数据库的Java核心CRUD项目。这个项目旨在提供一个基础框架,用于快速开发数据存储和检索功能,特别适合学习和实践Spring与MyBatis的集成以及使用内存...
但是,该项目对于学习和尝试Spring Boot和嵌入式HSQL很有用。 Todo API的新版本位于 。 Todo RESTful API被实现为运行嵌入式版本Tomcat的应用程序。 出于演示目的,数据存储是可通过访问的内存数据库。 它使用进行...
在Spring Boot框架中,JDBC(Java Database Connectivity)是一个常用的数据访问组件,它允许开发者直接执行SQL语句来与数据库进行交互。本篇文章将详细探讨Spring Boot JDBC的使用,包括如何配置、创建数据源、执行...
请注意: 本demo已经自带了HSQL数据库,所以不需要配置数据库 ******************************* * 系统结构介绍 ******************************* dao层使用 ibatis3 并使用分页方言(Diaelct)进行数据分页,具体请查看...
支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug...
每个起步依赖都包含了一组已经过调整和预配置的库,比如`spring-boot-starter-web`用于web开发,`spring-boot-starter-data-jpa`用于数据库访问。 2. **内嵌式Servlet容器**:SpringBoot可以内嵌Tomcat、Jetty等...
在Spring Boot中,JdbcTemplate是Spring框架提供的一个用于简化JDBC操作的工具类,它为开发者提供了更加方便、健壮的数据库访问接口。通过使用JdbcTemplate,我们可以避免编写大量重复的JDBC模板代码,比如打开和...
在Java开发领域,特别是针对企业级应用的持久层操作中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,被广泛应用于数据访问层。在配置Hibernate时,一个重要的参数是`hibernate.dialect`,即...
在服务器模式下,数据库作为一个独立的服务运行,允许多个客户端连接和并发访问。 4. **内存与磁盘存储** - HSQldb可以将数据存储在内存中,适合短期、临时的数据处理;也可以存储在磁盘上,适合长期的数据持久化...
总的来说,泛型DAO是Java开发中一个实用的设计模式,它结合了Hibernate的强大功能和泛型的灵活性,为开发人员提供了高效、可复用的数据库访问层。在Spring+Hibernate环境下,通过合理地实现和使用泛型DAO,可以大大...
首先,DAO(Data Access Object)模式是一种设计模式,它的主要作用是封装数据库访问的逻辑,使得业务层与数据访问层解耦。泛型DAO是DAO模式的一种改进,通过使用Java泛型,我们可以创建一个适用于任何类型的DAO接口...