`
sarin
  • 浏览: 1748068 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:172828
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:366557
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:188311
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:98752
社区版块
存档分类
最新评论

Spring数据库访问(HSQL)(三)

阅读更多
    本文接上一篇继续研究JDBC模板。
    之前说的都是插入操作,在我们使用自增主键的时候有时我们想立刻获得数据库为我们生成的主键值,那么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模板进行更深一步的讨论。(未完待续)
  • 大小: 77.5 KB
8
2
分享到:
评论
3 楼 sarin 2011-01-24  
pk3589 写道
这部分 觉得作者应该强调一下 数据库中的字段要和实体类中的属性名相对应,这样spring的jdbctemplate才能自动的 给类的属性填充值,

不知道说的对不对 有没有必要 

应该是set方法填值吧。
2 楼 pk3589 2011-01-24  
这部分 觉得作者应该强调一下 数据库中的字段要和实体类中的属性名相对应,这样spring的jdbctemplate才能自动的 给类的属性填充值,

不知道说的对不对 有没有必要 
1 楼 seyaa 2011-01-14  
不错 自己做些小程序 又不想使用安装的那类数据库 使用hsqldb + spring JdbcTemplate 挺不错的

相关推荐

    Spring数据库访问(HSQL)(四)

    NULL 博文链接:https://sarin.iteye.com/blog/875915

    微服务springcloud集成mybatis

    该项目通过springcloud集成了mybatis操作mysql数据库,项目主要分为7个model模块,配置模块(config),注册模块(discovery),监控模块(monitor),服务模块_mybatisService(通过mybatis操作mysql),服务模块_...

    Spring高级培训:Spring高级培训的样本项目

    通过Spring Boot和HSQL在内存DB中使用JDBC。 周六 通过Spring Boot和H2在内存DB(包括Web控制台)中使用JPA。 Spring Data REST 液基 H2数据库 饱和液基 通过Spring Boot和HSQL在内存DB中使用JDBC和 。 休息 通过...

    todo-spring-boot-jpa:Todo是使用HSQL和JPA实现为Spring Boot应用程序的RESTful任务管理API

    但是,该项目对于学习和尝试Spring Boot和嵌入式HSQL很有用。 Todo API的新版本位于 。 Todo RESTful API被实现为运行嵌入式版本Tomcat的应用程序。 出于演示目的,数据存储是可通过访问的内存数据库。 它使用进行...

    运行好,调试好的spring3.0 mvc_rest_demo.war

    请注意: 本demo已经自带了HSQL数据库,所以不需要配置数据库 ******************************* * 系统结构介绍 ******************************* dao层使用 ibatis3 并使用分页方言(Diaelct)进行数据分页,具体请查看...

    支持多数据库的ORM框架ef-orm.zip

    支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug...

    火炬博客系统7

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    火炬博客系统5

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    火炬博客系统6

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    JavaBlogFeedBurner:带有 Maven、Spring、Hibernate 的 Java 项目

    基于 Spring 和 Hibernate在开发模式下运行(使用嵌入式 HSQL 数据库): 使用嵌入式 Jetty 服务器运行此应用程序: mvn -P dev jetty:run -Dspring.profiles.active="dev" 这将在端口 8080 上启动嵌入式 Jetty ...

    CarService:使用Jersey + Spring + JPA-Hibernate的基于Java的简单RESTful服务

    第一次获取请求时,将从数据库中获取数据并放入缓存中。 后续请求将从缓存中获取数据,直到ttl(5分钟)为止。 更新也将更新缓存条目。 删除将从缓存中删除条目。 使用内存中的hsql DB进行此分配。 它将动态创建...

    ipl-dashboard

    Java Brains IPL仪表板 浏览您最喜欢的IPL球队,并... HSQL数据库 React JS AWS BeanStalk 使用的数据集 贡献 查看“问题”选项卡,以获取针对此存储库的功能改进和错误。 确保您观看以了解如何首先构建此应用程序!

    Electronic-Document-Management-System:使用 Spring 和 Hibernate 进行 EDMS 软件开发

    在开发模式下运行(使用嵌入式 HSQL 数据库): 使用嵌入式 Jetty 服务器运行此应用程序: mvn -P dev jetty:run -Dspring.profiles.active="dev" 这将在端口 8080 上启动嵌入式 Jetty 服务器,您可以在此处访问您的...

Global site tag (gtag.js) - Google Analytics