- 浏览: 1758048 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173794
-
Android学习笔记
浏览量:368256
-
iBatis开发详解
浏览量:189386
-
Objective-C学习...
浏览量:99957
最新评论
-
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())
上一篇我们介绍了HSQL数据库的基本概念和操作,我们现在从HSQL的服务器模式开始,使用Spring来操作JDBC。HSQL内嵌了服务器模式的启动方式,不过需要使用java命令来运行,可以参考官方文档。为了演示的方便,我们使用程序启动服务器,做法也很简单。如下:
这样我们就可以通过运行主函数来启动HSQL的服务器了,这里需要做些说明,就是路径的问题,因为我们开发时都是操作源文件路径下的文件,那么我们使用源文件路径,而部署后代码执行类路径下资源,那么需要切换到类路径下的文件,因为这里是使用主函数运行,所以路径的获取可能会和非主函数方式运行有所不同,这个就视具体环境来确定了,此时运行该主函数,就可以看到HSQL服务器的启动信息了。
这里我们指定了启动一个数据库vehicle,并启用端口号2011,路径是开发使用的源文件路径。点击运行,看到如下信息:
之后我们在Spring中配置数据源。这就很简单了,使用Commons的DBCP组件来实现最简单的连接池,如下配置即可:
下面先从DAO模式入手,逐步来看Spring对JDBC的简化操作和JDBC模板的优雅。为了操作车辆对象,编写一个VehicleDAO接口,封装对象数据操作的方法:
DAO模式将数据交互完全封装,业务层面只需进行相关的逻辑操作并准备好封装的对象数据,DAO层就完成数据持久工作。写好接口,下面就是实现类,这里给出两个完整方法作为说明:
完成实现类,不要忘了在Spring中配置DAO,这也很简单:
下面就是测试了,用主函数进行测试:
测试时直接运行,数据暂存内存中,看到不到数据库脚本文件的改变,之后关闭HSQL服务器,会在log文件中看到我们这次添加的内容,再次启动HSQL服务器,数据就写入到了脚本文件中。这个过程是由于HSQL的缓存策略导致的。
这是用JDBC实现的DAO,还是相当的繁杂的,那么引入JDBC模板,开始逐步简化操作,下面来看第一种使用JDBC模板的方式:
之后改写DAO中的代码:
这种方式是把语句单独分离出来,既然是实现了接口,那么也可以采用内部类的方式来写,不过写内部类时,要求方法参数为final类型,如下:
第二种方式是使用StatementSetter来进行,具体做法和上面相似,如下:
第三种方式则是最简洁的方法,使用直接使用参数,比如:
使用对象数组方式是Spring 2中的做法,也是比较经典的做法,将参数都装备到对象数组中,统一传递给jdbeTemplate,使得数据库操作代码明显减少,格式也高度统一,便于维护,若用于Web项目,request对象中会有getParameterMap()方法,结合该方法,直接从Map中将参数封装为对象数组传递给jdbcTemplate使用,那么就会更加简洁。这个工具方法也很简单:
使用时,直接调用,将map传入,后面紧跟键名组("plate,chassis,color,wheel,seat”)即可,这样就能将参数值从Map中分离出来,数据库代码就会精简至几行。十分的方便。
而在Spring 3中,最后一种方式的jdbcTemplate调用参数变为可变参数形式。也就是说,上面的代码可以写为:
这样只要参数位置正确,有多少参数直接往后面放即可,简洁之简洁,方便之方便。
下一篇将继续详细介绍JDBC模板的使用,希望对使用者有用,欢迎交流。(未完待续)
后面文章中提供下载
package org.ourpioneer.vehicle.util; import org.hsqldb.Server; /** * 启动HSQL服务器实例 * * @author Nanlei * */ public class HsqlServer { private void startHsqlServer(String dbPath, String dbName, int port) { Server server = new Server(); // 0表示第0个数据库,Server模式可以启动10个数据库 server.setDatabasePath(0, dbPath + dbName); server.setDatabaseName(0, dbName); server.setPort(port); server.setSilent(true); server.start(); System.out.println("HSQLDB Server started!"); } public static void main(String[] args) { // 源代码路径 System.out.println(System.getProperty("user.dir")); // 类路径 System.out.println(Thread.currentThread().getContextClassLoader() .getResource(".").getPath()); String base = System.getProperty("user.dir"); String dbPath = base + "\\src\\main\\resources\\org\\ourpioneer\\vehicle\\db\\"; String dbName = "vehicle"; int port = 2011; new HsqlServer().startHsqlServer(dbPath, dbName, port); } }
这样我们就可以通过运行主函数来启动HSQL的服务器了,这里需要做些说明,就是路径的问题,因为我们开发时都是操作源文件路径下的文件,那么我们使用源文件路径,而部署后代码执行类路径下资源,那么需要切换到类路径下的文件,因为这里是使用主函数运行,所以路径的获取可能会和非主函数方式运行有所不同,这个就视具体环境来确定了,此时运行该主函数,就可以看到HSQL服务器的启动信息了。
这里我们指定了启动一个数据库vehicle,并启用端口号2011,路径是开发使用的源文件路径。点击运行,看到如下信息:
之后我们在Spring中配置数据源。这就很简单了,使用Commons的DBCP组件来实现最简单的连接池,如下配置即可:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:hsql://localhost:2011/vehicle;shutdown=true" /> <property name="username" value="ROOT" /> <property name="password" value="123" /> </bean>
下面先从DAO模式入手,逐步来看Spring对JDBC的简化操作和JDBC模板的优雅。为了操作车辆对象,编写一个VehicleDAO接口,封装对象数据操作的方法:
package org.ourpioneer.vehicle.dao; import org.ourpioneer.vehicle.bean.Vehicle; /** * VehicleDAO:封装数据操作方法 * * @author Nanlei * */ public interface VehicleDAO { public void insert(Vehicle vehicle); public void update(Vehicle vehicle); public void delete(Vehicle vehicle); public Vehicle findById(int id); }
DAO模式将数据交互完全封装,业务层面只需进行相关的逻辑操作并准备好封装的对象数据,DAO层就完成数据持久工作。写好接口,下面就是实现类,这里给出两个完整方法作为说明:
package org.ourpioneer.vehicle.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import org.ourpioneer.vehicle.bean.Vehicle; /** * VehicleDAO实现类 * * @author Nanlei * */ public class VehicleDAOImpl implements VehicleDAO { private DataSource dataSource; /** * 注入数据源 * * @param dataSource */ public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; Connection conn = null; Vehicle vehicle = null; try { conn = dataSource.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql); pstat.setInt(1, id); ResultSet rs = pstat.executeQuery(); if (rs.next()) { vehicle = new Vehicle(rs.getString("PLATE"), rs .getString("CHASSIS"), rs.getString("COLOR"), rs .getInt("WHEEL"), rs.getInt("SEAT")); vehicle.setId(rs.getInt("ID")); } rs.close(); pstat.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return vehicle; } /** * 添加Vehicle */ public void insert(Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; Connection conn = null; try { conn = dataSource.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql); 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()); pstat.executeUpdate(); pstat.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
完成实现类,不要忘了在Spring中配置DAO,这也很简单:
<bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl"> <property name="dataSource" ref="dataSource" /> </bean>
下面就是测试了,用主函数进行测试:
package org.ourpioneer.vehicle; import org.ourpioneer.vehicle.bean.Vehicle; import org.ourpioneer.vehicle.dao.VehicleDAO; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Demo { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml"); VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO"); Vehicle vehicle = new Vehicle("辽B-000000", "1A00000001", "RED", 4, 4); vehicleDAO.insert(vehicle); vehicle = vehicleDAO.findById(1); System.out.println(vehicle); } }
测试时直接运行,数据暂存内存中,看到不到数据库脚本文件的改变,之后关闭HSQL服务器,会在log文件中看到我们这次添加的内容,再次启动HSQL服务器,数据就写入到了脚本文件中。这个过程是由于HSQL的缓存策略导致的。
这是用JDBC实现的DAO,还是相当的繁杂的,那么引入JDBC模板,开始逐步简化操作,下面来看第一种使用JDBC模板的方式:
package org.ourpioneer.vehicle.jt; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.ourpioneer.vehicle.bean.Vehicle; import org.springframework.jdbc.core.PreparedStatementCreator; /** * Vehicle插入语句创建器 * * @author Nanlei * */ public class InsertVehicleStatementCreator implements PreparedStatementCreator { private Vehicle vehicle; public InsertVehicleStatementCreator(Vehicle vehicle) { this.vehicle = vehicle; } public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; PreparedStatement pstat = conn.prepareStatement(sql); 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()); return pstat; } }
之后改写DAO中的代码:
public void insert(Vehicle vehicle) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(new InsertVehicleStatementCreator(vehicle)); }
这种方式是把语句单独分离出来,既然是实现了接口,那么也可以采用内部类的方式来写,不过写内部类时,要求方法参数为final类型,如下:
public void insert(final Vehicle vehicle) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; PreparedStatement pstat = conn.prepareStatement(sql); 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()); return pstat; } }); }
第二种方式是使用StatementSetter来进行,具体做法和上面相似,如下:
public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(sql, new PreparedStatementSetter() { public void setValues(PreparedStatement pstat) throws SQLException { 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 void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(sql, new Object[] { vehicle.getPlate(), vehicle.getChassis(), vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat() }); }
使用对象数组方式是Spring 2中的做法,也是比较经典的做法,将参数都装备到对象数组中,统一传递给jdbeTemplate,使得数据库操作代码明显减少,格式也高度统一,便于维护,若用于Web项目,request对象中会有getParameterMap()方法,结合该方法,直接从Map中将参数封装为对象数组传递给jdbcTemplate使用,那么就会更加简洁。这个工具方法也很简单:
public static Object[] getObjectArrayFromMap(Map map, String key) { String[] keys = key.split(","); Object[] tmp = new Object[keys.length]; for (int i = 0; i < keys.length; i++) { tmp[i] = getObjectFromMap(map, keys[i].trim()); } return tmp; } public static Object getObjectFromMap(Map map, String key) { Object value = map.get(key); if (value != null && (value instanceof Object[])) { Object[] array = (Object[]) value; if (array != null && array.length > 0) { value = array[0]; } } return value; }
使用时,直接调用,将map传入,后面紧跟键名组("plate,chassis,color,wheel,seat”)即可,这样就能将参数值从Map中分离出来,数据库代码就会精简至几行。十分的方便。
而在Spring 3中,最后一种方式的jdbcTemplate调用参数变为可变参数形式。也就是说,上面的代码可以写为:
public void insert(final Vehicle vehicle) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(), vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat()); }
这样只要参数位置正确,有多少参数直接往后面放即可,简洁之简洁,方便之方便。
下一篇将继续详细介绍JDBC模板的使用,希望对使用者有用,欢迎交流。(未完待续)
评论
3 楼
gdcooler
2011-02-02
用spring的rowmapper啊。。。。一个一个set到实体里面太恶心了。。。
2 楼
sarin
2011-01-20
SunShineBoy 写道
应该提供demo下载!
后面文章中提供下载
1 楼
SunShineBoy
2011-01-20
应该提供demo下载!
发表评论
-
iBatis操作DDL和映射继承
2012-09-09 21:46 9280本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15775本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7706本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9326CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5807接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 16000为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7752经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13129之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17624本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23400本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30832Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27518使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14594本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13446本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13841本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22083本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60103本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42658Spring的MVC模块是一种简洁的Web应用框架,实 ... -
iBatis查询select详解
2010-08-07 12:19 40532<select>是iBatis已经映射的语 ... -
iBatis查询API
2010-07-31 13:04 17699先说点基础的内容 ...
相关推荐
在本篇博文中,我们将深入探讨Spring框架在数据库访问方面的应用,特别关注使用HSQL内存数据库的实践。Spring是Java领域最广泛使用的轻量级框架之一,它为开发者提供了全面的事务管理、数据访问集成以及IoC...
在"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接口...