- 浏览: 1756932 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173661
-
Android学习笔记
浏览量:368127
-
iBatis开发详解
浏览量:189264
-
Objective-C学习...
浏览量:99838
最新评论
-
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())
本文接上一篇继续研究JDBC模板。
之前说的都是插入操作,在我们使用自增主键的时候有时我们想立刻获得数据库为我们生成的主键值,那么jdbcTemplate是支持这个操作的,只是写起来麻烦一些,可以这么来做:
不过HSQL不支持这种写法,那么只能用原始的方法了。调用它特有的获取最后主键值的函数来查找了:
这样就会获取到生成主键的值。插入操作的最后一部分是批量插入,批量插入属于和数据库交互比较密集的操作,容易出现性能问题,而jdbc模板为我们提供了简便的方法来执行批量操作,我们来看:
测试时,也很简单:
到此,JDBC模板的更新操作就介绍完了,以插入操作为例来说明,逐步深入,使用JDBC模板的各种实现方式,其中以可变参数形式传递参数最为简单。下面来看看数据查询,这是概念比较多的一块儿。先从通用的方法来开始看:
用的还是内部类,用返回的结果集对象来填充bean,就得到了结果。第二种方法是使用RowMapper来映射字段到对象。这个也很简单,单独写一个RowMapper的实现:
那么在调用时,就可以使用jdbcTemplate的queryForObject方法了。比如:
第三种方法可以使用BeanPropertyRowMapper,这样就会自动为我们映射了,写起来更加简便。
到此都是单行数据的查询,都是很简单的操作,下面我们来看使用JDBC模板查询多行数据的方法。首先在DAO中添加一个findAll方法,并实现该方法,如下:
启动HSQL服务器,就可以直接在主函数中运行该方法,就能得到所有的查询结果了。
若使用RowMapper来自动映射,那么代码会大大简化,比如:
使用JDBC模板来查询多条记录也是这么简单,下面来看看如何使用JDBC模板来查询单个值,这也很简单,因为JDBC模板为我们提供了大量简化的API。比如我们只获取车辆的底盘号信息,要计算系统内车辆的数量,那么我们需要再为DAO定义两个方法:String getChassis(int id)和int countVehicle(),写出这两个方法的具体实现:
queryForObject()方法有很多重载的方法,这里我们使用的是传递sql语句,参数和返回值的类型,这样JDBC模板处理后的结果就是String类型的了,我们就可以直接获取到值了,这种查询方式适用于单值查询的情形,使用非常简单。对于集合函数,JDBC模板更加简化,为我们提供了queryForInt()方法和queryForLong()方法,那么我们直接使用该方法就可以获取到集合函数计算的结果了,当然,如果可以确定返回值的类型为Int和Long时,也可直接使用它们,而对于其它数据类型则需要使用queryForObject()方法了。
测试方法也很简单:
得到如下执行结果:
下一篇将继续探讨Spring中的数据库访问,对JDBC模板进行更深一步的讨论。(未完待续)
应该是set方法填值吧。
之前说的都是插入操作,在我们使用自增主键的时候有时我们想立刻获得数据库为我们生成的主键值,那么jdbcTemplate是支持这个操作的,只是写起来麻烦一些,可以这么来做:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); KeyHolder keyHolder = new GeneratedKeyHolder(); 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; } }, keyHolder); System.out.println("PK: " + keyHolder.getKey().intValue());
不过HSQL不支持这种写法,那么只能用原始的方法了。调用它特有的获取最后主键值的函数来查找了:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(), vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat()); int id = jdbcTemplate.queryForInt("CALL IDENTITY()"); System.out.println("PK: " + id);
这样就会获取到生成主键的值。插入操作的最后一部分是批量插入,批量插入属于和数据库交互比较密集的操作,容易出现性能问题,而jdbc模板为我们提供了简便的方法来执行批量操作,我们来看:
public void insertBatch(final List<Vehicle> vehicles) { String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 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 static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml"); VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO"); Vehicle vehicle1 = new Vehicle("辽B-000000", "1A00000001", "RED", 4, 4); Vehicle vehicle2 = new Vehicle("辽B-000001", "1A00000002", "RED", 4, 4); vehicleDAO.insertBatch(Arrays .asList(new Vehicle[] { vehicle1, vehicle2 })); }
到此,JDBC模板的更新操作就介绍完了,以插入操作为例来说明,逐步深入,使用JDBC模板的各种实现方式,其中以可变参数形式传递参数最为简单。下面来看看数据查询,这是概念比较多的一块儿。先从通用的方法来开始看:
public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); final Vehicle vehicle = new Vehicle(); jdbcTemplate.query(sql, new Object[] { id }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { vehicle.setId(rs.getInt("ID")); vehicle.setPlate(rs.getString("PLATE")); vehicle.setChassis(rs.getString("CHASSIS")); vehicle.setColor(rs.getString("COLOR")); vehicle.setWheel(rs.getInt("WHEEL")); vehicle.setSeat(rs.getInt("SEAT")); } }); return vehicle; }
用的还是内部类,用返回的结果集对象来填充bean,就得到了结果。第二种方法是使用RowMapper来映射字段到对象。这个也很简单,单独写一个RowMapper的实现:
package org.ourpioneer.vehicle.jt; import java.sql.ResultSet; import java.sql.SQLException; import org.ourpioneer.vehicle.bean.Vehicle; import org.springframework.jdbc.core.RowMapper; public class VehicleRowMapper implements RowMapper<Vehicle> { public Vehicle mapRow(ResultSet rs, int rowNum) throws SQLException { Vehicle vehicle = new Vehicle(); vehicle.setId(rs.getInt("ID")); vehicle.setPlate(rs.getString("PLATE")); vehicle.setChassis(rs.getString("CHASSIS")); vehicle.setColor(rs.getString("COLOR")); vehicle.setWheel(rs.getInt("WHEEL")); vehicle.setSeat(rs.getInt("SEAT")); return vehicle; } }
那么在调用时,就可以使用jdbcTemplate的queryForObject方法了。比如:
public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); Vehicle vehicle = (Vehicle) jdbcTemplate.queryForObject(sql, new Object[] { id }, new VehicleRowMapper()); return vehicle; }
第三种方法可以使用BeanPropertyRowMapper,这样就会自动为我们映射了,写起来更加简便。
public Vehicle findById(int id) { String sql = "select * from vehicle where ID=?"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); BeanPropertyRowMapper<Vehicle> vehicleRowMapper=BeanPropertyRowMapper.newInstance(Vehicle.class); Vehicle vehicle=jdbcTemplate.queryForObject(sql, vehicleRowMapper, id); return vehicle; }
到此都是单行数据的查询,都是很简单的操作,下面我们来看使用JDBC模板查询多行数据的方法。首先在DAO中添加一个findAll方法,并实现该方法,如下:
public List<Vehicle> findAll() { String sql = "select * from vehicle"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List<Vehicle> vehicles = new ArrayList<Vehicle>(); List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); for (Map<String, Object> row : rows) { Vehicle vehicle = new Vehicle(); vehicle.setId((Integer) row.get("ID")); vehicle.setPlate((String) row.get("PLATE")); vehicle.setChassis((String) row.get("CHASSIS")); vehicle.setColor((String) row.get("COLOR")); vehicle.setWheel((Integer) row.get("WHEEL")); vehicle.setSeat((Integer) row.get("SEAT")); vehicles.add(vehicle); } return vehicles; }
启动HSQL服务器,就可以直接在主函数中运行该方法,就能得到所有的查询结果了。
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml"); VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO"); List<Vehicle> vehicles = vehicleDAO.findAll(); for (Vehicle vehicle : vehicles) { System.out.println(vehicle); } }
若使用RowMapper来自动映射,那么代码会大大简化,比如:
public List<Vehicle> findAll() { String sql = "select * from vehicle"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); RowMapper<Vehicle> rows=BeanPropertyRowMapper.newInstance(Vehicle.class); List<Vehicle> vehicles=jdbcTemplate.query(sql, rows); return vehicles; }
使用JDBC模板来查询多条记录也是这么简单,下面来看看如何使用JDBC模板来查询单个值,这也很简单,因为JDBC模板为我们提供了大量简化的API。比如我们只获取车辆的底盘号信息,要计算系统内车辆的数量,那么我们需要再为DAO定义两个方法:String getChassis(int id)和int countVehicle(),写出这两个方法的具体实现:
public String getChassis(int id) { String sql = "select COLOR from vehicle where ID=?"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String color = (String) jdbcTemplate.queryForObject(sql, new Object[] { id }, String.class); return color; } public int countVehicle() { String sql = "select count(*) from vehicle"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); int count = jdbcTemplate.queryForInt(sql); return count; }
queryForObject()方法有很多重载的方法,这里我们使用的是传递sql语句,参数和返回值的类型,这样JDBC模板处理后的结果就是String类型的了,我们就可以直接获取到值了,这种查询方式适用于单值查询的情形,使用非常简单。对于集合函数,JDBC模板更加简化,为我们提供了queryForInt()方法和queryForLong()方法,那么我们直接使用该方法就可以获取到集合函数计算的结果了,当然,如果可以确定返回值的类型为Int和Long时,也可直接使用它们,而对于其它数据类型则需要使用queryForObject()方法了。
测试方法也很简单:
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml"); VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO"); int count = vehicleDAO.countVehicle(); System.out.println("Vehicle Count: " + count); String chassis = vehicleDAO.getChassis(1); System.out.println("Chassis For No.1: " + chassis); }
得到如下执行结果:
下一篇将继续探讨Spring中的数据库访问,对JDBC模板进行更深一步的讨论。(未完待续)
评论
3 楼
sarin
2011-01-24
pk3589 写道
这部分 觉得作者应该强调一下 数据库中的字段要和实体类中的属性名相对应,这样spring的jdbctemplate才能自动的 给类的属性填充值,
不知道说的对不对 有没有必要
不知道说的对不对 有没有必要
应该是set方法填值吧。
2 楼
pk3589
2011-01-24
这部分 觉得作者应该强调一下 数据库中的字段要和实体类中的属性名相对应,这样spring的jdbctemplate才能自动的 给类的属性填充值,
不知道说的对不对 有没有必要
不知道说的对不对 有没有必要
1 楼
seyaa
2011-01-14
不错 自己做些小程序 又不想使用安装的那类数据库 使用hsqldb + spring JdbcTemplate 挺不错的
发表评论
-
iBatis操作DDL和映射继承
2012-09-09 21:46 9266本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15749本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7699本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9324CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5792接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15988为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7749经过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 23383本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30806Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27507使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14564本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10730上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13835本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22065本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60085本文接上一篇继续 ... -
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是Java领域最广泛使用的轻量级框架之一,它为开发者提供了全面的事务管理、数据访问集成以及IoC...
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-jpa-hsqldb"的项目是一个很好的实例,它展示了如何将这三个组件整合在一起,用于创建一个简单的数据库驱动的应用程序。下面我们将深入探讨这些技术以及它们在项目中的应用。 首先,让我们了解...
这些起步依赖包含了启动特定功能所需的依赖集合,如`spring-boot-starter-web`用于构建Web应用,`spring-boot-starter-data-jpa`则用于数据库访问。 2. **自动配置(Auto Configuration)**:Spring Boot根据项目中...
【标题】"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模板代码,比如打开和...
SSH是基于Struts、Spring和Hibernate三个开源框架的组合,它在企业级应用开发中非常流行。为了构建SSH项目,需要依赖于一系列JAR包。 - **Struts**:Struts-core.jar、commons-fileupload.jar、commons-io.jar、...
在服务器模式下,数据库作为一个独立的服务运行,允许多个客户端连接和并发访问。 4. **内存与磁盘存储** - HSQldb可以将数据存储在内存中,适合短期、临时的数据处理;也可以存储在磁盘上,适合长期的数据持久化...
总的来说,泛型DAO是Java开发中一个实用的设计模式,它结合了Hibernate的强大功能和泛型的灵活性,为开发人员提供了高效、可复用的数据库访问层。在Spring+Hibernate环境下,通过合理地实现和使用泛型DAO,可以大大...
首先,DAO(Data Access Object)模式是一种设计模式,它的主要作用是封装数据库访问的逻辑,使得业务层与数据访问层解耦。泛型DAO是DAO模式的一种改进,通过使用Java泛型,我们可以创建一个适用于任何类型的DAO接口...