spring中JdbcTemplate的使用

一.首先JdbcTemplate有一个DataSource类型的属性,所以需要在spring的配置文件中为JdbcTemplate的实例配置dataSource属性:

<!-- 导入资源文件 -->
	<context:property-placeholder location="classpath:db.properties" />

	<!-- 配置 C3P0 数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="driverClass" value="${driverClass}"></property>
		<property name="initialPoolSize" value="${initPoolSize}"></property>
		<property name="maxPoolSize" value="${maxPoolSize}"></property>
	</bean>

	<!-- 配置 Spirng 的 JdbcTemplate -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

需要注意的是,JdbcTemplate类是spring 的jar包中的类,具体来说是spring-jdbc-xxx.RELEASE.jar包中的类,跟Hibernate没有半毛钱关系(与Hibernate有关系的是HibernateTemplate类,在spring-orm-xxx.RELEASE.jar包中)。从JdbcTemplate的名字中就能看出,这是spring支持的jdbc,是原生的jdbc,做了简单封装而已,并不是orm框架,类似于DBUtils工具类。

二.常用的JdbcTemplate的方法如下:

1. 插入/更新单条数据:

@Test
	public void testUpdate() {
		String sql = "update employee set name=? ,email=? where id=?";
		jdbcTemplate.update(sql, "heisenberg","ksh@126.com",4);
	}

插入/更新单条数据,用update(String sql, Object... args)方法,传入sql语句和参数列表,返回int类型,即操作的数据表的记录数。

如果是插入数据的话,sql语句是insert into...,如果是更新数据的话,sql语句是update... 。

2.批量插入/更新数据

	@Test
	public void testBatchUpdate() {
		String sql = "insert into employee (name,salary,email,dept_Id) values (?,?,?,?)";
		List<Object[]> batchArgs = new ArrayList<Object[]>();
		Object[] a = new Object[] { "aa", 4000, "aa@126.com", 3 };// 创建对象数组
		batchArgs.add(a);
		Object[] b = new Object[] { "bb", 5000, "bb@126.com", 4 };
		batchArgs.add(b);
		Object[] c = new Object[] { "cc", 6000, "cc@126.com", 2 };
		batchArgs.add(c);
		jdbcTemplate.batchUpdate(sql, batchArgs);
	}
批量插入/更新数据,用batchUpdate(String sql, List<Object[]> batchArgs)方法,传入sql语句和一个元素是Object数组的集合。一个Object数组就代表一条数据,因为插入数据的各个字段的类型可能不一样,而且大部分情况下都不全一样,所以才用Object数组,如果都是string型的话,就用String数组了。

3.查询单条数据,返回值类型为所查的表对应的实体类型

@Test
	public void testQueryForObject() {
		String sql = "select * from employee where id=?";
		RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
		Employee e = jdbcTemplate.queryForObject(sql, rowMapper, 1);
		System.out.println(e);
	}
查询单条数据,用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) 方法,传入sql语句、RowMapper对象(RowMapper是接口,有一个实现类BeanPropertyRowMapper,我们以此实现类创建RowMapper对象:new BeanPropertyRowMapper(Class<T> mappedClass) )以及参数列表,注意不是queryForObject(String sql, Class<T> requiredType, Object... args)方法,这里比较容易混淆。

4.批量查询多条数据,返回值类型list,元素类型是所查表对应的实体类类型

@Test
	public void testQuery() {
		String sql = "select * from employee where id>?";
		RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
		List<Employee> list = jdbcTemplate.query(sql, rowMapper, 3);
		System.out.println(list);
	}

批量查询多条数据,用query(String sql, RowMapper<T> rowMapper, Object... args),传入sql语句、RowMapper对象及参数列表。

结合查单条数据的方式,可知传入RowMapper对象查询单条或者多条数据的方法需要工程创建实体类来接受方法返回值。

5.批量查询多条数据或查询单条数据,返回值类型list,元素类型Map<String,Object>,键是数据库表中的字段名,可能对应实体类属性名(如果有实体类的话),也可能不对应(实体类属性与数据库表字段可能不是一一对应的,可能有多有少),值是数据库表的字段值。

@Test
	public void testQueryForList() {
		List<Map<String, Object>> list= jdbcTemplate.queryForList("SELECT * FROM employee where id>?", 3);
		Map<String, Object> map = list.get(0);
		System.out.println(map.get("name"));
	}
如果要查询单条数据,则sql语句中id=3即可。这个方法比较特殊,但也很实用,利用此方法查询单条或多条数据不用工程创建实体类,比较轻盈。

6.查询表的记录数

@Test
	public void testCount() {
		String sql = "select count(id) from employee";
		Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
		System.out.println(count);
	}

查询表的记录数用的是queryForObject(String sql, Class<T> requiredType),传入sql语句及Integer的类实例即可,返回值的类型是Integer型。如果传入的是Long.class,则返回值的类型是Long类型。事实上,Integer的最大值有21亿多,所以一般传Integer.class就可以了。

7.查询表的某一个字段

@Test
	public void testCount() {
		String sql = "select name from employee";
		List<String> nameList = jdbcTemplate.queryForList(sql, String.class);
		System.out.println(nameList);
	}
查询表的某个字段用的是queryForList(String sql, Class<T> elementType),传入sql语句及所查字段的类型的clazz实例(可能是String.class也可能是integer.class)即可,返回一个List,里面的元素则是各条记录对应的字段值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值