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

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

阅读更多
    本文接上一篇继续研究Spring的JDBC模板。
    之前,我们使用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部分。
11
0
分享到:
评论
2 楼 sarin 2011-12-16  
aa87963014 写道
少了一个批量save 返回主键的封装

根据需求添加就可以了。呵呵
1 楼 aa87963014 2011-12-16  
少了一个批量save 返回主键的封装

相关推荐

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

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

    微服务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