spring对数据库的简单操作及方法

spring对数据库的操作使用JdbcTemplate来封装JDBC,结合Spring的注入特性可以很方便的实现对数据库的访问操作。

一、对数据库的访问操作

1、实体Bean

package com.bean;

public class Person {

	private Integer id;
	private String name;
	
	public Person() {
		super();
	}
		
	public Person(String name) {
		super();
		this.name = name;
	}

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
2、Spring配置文件applicationContext.xml

    
    

    
    

    
     
     
		
      
      
		
      
      
		
      
      
		
      
      
	
     
     
	
	
     
     
		
      
      
	
     
     

    
    
3、数据库访问接口PersonService.java
package com.hpe.dao;

import java.util.List;

import com.service;

public interface PersonService {

	/**
	 * 保存person
	 * @param person
	 * @return
	 */
	public abstract void save(Person person);

	/**
	 * 更新person
	 * @param person
	 * @return
	 */
	public abstract void update(Person person);

	/**
	 * 获取person
	 * @param personid
	 * @return
	 */
	public abstract Person getPerson(Integer personid);

	/**
	 * 获取所有person
	 * @return
	 */
	public abstract List
     
     
      
       getPersons();

	/**
	 * 删除指定id的person
	 * @param personid
	 */
	public abstract void delete(Integer personid);

}
     
     
4、数据库访问接口的实现类PersonServiceBean.java

package com.service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Transactional;

import com.bean;

public class PersonServiceBean implements PersonService {

	private JdbcTemplate jdbcTemplate;

	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public void save(Person person) {
		String sql = "insert into person(name,del_flg) values(?,0)";
		Object[] params = {person.getName()};
		jdbcTemplate.update(sql, params, new int[]{java.sql.Types.VARCHAR});
	}
	
	@Override
	public void update(Person person) {
		String sql = "update person set name=? where id=?";
		Object[] params = {person.getName(),person.getId()};
		jdbcTemplate.update(sql, params, new int[]{java.sql.Types.VARCHAR,java.sql.Types.INTEGER});
	}
	
	@Override
	public Person getPerson(Integer personid) {
		String sql = "select * from person where id=?";
		Object[] params = {personid};
		
		return (Person)jdbcTemplate.queryForObject(sql, params, new int[]{java.sql.Types.INTEGER},new RowMapper
    
    
     
     () {

			@Override
			public Person mapRow(ResultSet rs, int arg1) throws SQLException {
				Person person = new Person(rs.getString("name"));
				person.setId(rs.getInt("id"));
				return person;
			}
		});
		
		
	}
	
	@Override
	public List
     
     
      
       getPersons() {
		String sql = "select * from person";

		return (List
      
      
       
       )jdbcTemplate.query(sql, new RowMapper
       
       
        
        () {
			@Override
			public Person mapRow(ResultSet rs, int i) throws SQLException {
				Person person = new Person();
				person.setName(rs.getString("name"));
				person.setId(rs.getInt("id"));
				return person;
			}
		});
		
	}
	
	@Override
	public void delete(Integer personid) {
		String sql = "update person set del_flg=1 where id=?";
		Object[] params = {personid};
		jdbcTemplate.update(sql, params, new int[]{java.sql.Types.INTEGER});
	}
}

       
       
      
      
     
     
    
    
5、测试类
package com.test;

import static org.junit.Assert.*;

import java.util.List;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.service.PersonServiceBean;
import com.bean.Person;

public class test {

	static ApplicationContext ac;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}
	
	@Test
	public void testPersonSave() {
		PersonService ps = (PersonService) ac.getBean("personService");
		ps.save(new Person("XXX"));

	}
	
	@Test
	public void testGetPerson() {
		PersonService ps = (PersonService) ac.getBean("personService");
		Person p = ps.getPerson(4);
		System.out.println(p.getName());
	}
	
	@Test
	public void testUpdate() {
		PersonService ps = (PersonService) ac.getBean("personService");
		Person p = ps.getPerson(4);
		p.setName("111");
		ps.update(p);
	}
	
	@Test
	public void testDelete() {
		PersonService ps = (PersonService) ac.getBean("personService");
		ps.delete(4);
	}
	
	@Test
	public void testGetps() {
		PersonService ps = (PersonService) ac.getBean("personService");
		for(Person p:ps.getPersons()){
			System.out.println(p.getName());
		}
	}
}

二、基本的数据操作

1.更新数据

JdbcTemplate提供了若干update()方法,允许用户对数据表记录进行添加,更新和删除操作。
JdbcTemplate在内部通过PreparedStatement执行SQL语句,所以可以使用绑定参 数的SQL语句,每个占位符可接受一个参数。通过JdbcTemplate的int update(String sql, Object[] args)方法进行表数据的更新。
通过update(String sql, Object[] args)方法为SQL语句的占位符绑定参数时,并没有 显式指定对应字段的数据类型,此时,Spring直接让PreparedStatement根据参数 的类型进行“猜测”。
更好的一种做法是,使用int update(String sql, Object[] args, int[] argTypes)显式指定每个占位符所对应的字段数据类型,这样就可以保证类型安全。

除了以上两个update()方法外,JdbcTemplate还提供以下几个功能相似的重载方法。

  --int update(String sql):为不带占位符的SQL语句所提供的便利方法。

  --int update(String sql, PreparedStatementSetter pss): PreparedStatementSetter是一个回调接口,它定义了一个void setValues(PreparedStatement ps)接口方法。JdbcTemplate使用SQL语句创建出PreparedStatement实例后,将调用该回调 接口执行绑定参数的操作。

3.查询数据

(1)使用RowCaIIbackHandler处理结果集
Spring提供了org.springframework.jdbc.core.RowCallbackHandler回调接口,通过该 接口可以定义如何从结果集中获取数据。RowCaIlbackHandler接口很简单,仅有一 个方法void processRow(ResultSet rs) throws SQLException。 Spring会遍历结果集, 对结果集中的每一行调用RowCallbackHandler回调接口处理数据。所以用户无 须 调用ResultSet的next()方法,而只需要定义好如何获取结果行数据的逻辑就可以了。

如果需要获取多条记录,依旧可以使用RowCallbackHandler完成任务,只需要稍微调整一下结果集的处理逻辑就可以了。

当结果集中没有数据时,并不会抛出异常。只是此时RowCallbackHandle:回调接口 中定义的处理逻辑没有得到调用罢了。

(2)使用RowMapper<T>处理结果集
Spring还提供了一个和RowCallbackHandler功能类似的RowMapper<T>接口,它也可以使用RowMapper<T>定义结果集映射逻辑,在结果集为多行记录时,该接口更 容易使用。RowMapper<T>也只有一个接口方法:T mapRow(ResultSet rs, int rowNum)

Spring还提供了一个和RowCallbackHandler功能类似的RowMapper<T>接口,它也可以使用RowMapper<T>定义结果集映射逻辑,在结果集为多行记录时,该接口更 容易使用。RowMapper<T>也只有一个接口方法:T mapRow(ResultSet rs, int rowNum)

4.查询单值数据

如果查询的结果集仅有一个值,如SELECT COUNT(*) FROM User等,就可以使用更 简单的方式获取结果的值。JdbcTemplate为获取结果集中的单值数据提供了3组方 法,分别用于获取int, long的单值,其他类型的单值以Object类型返回。

(1)int类型的单值查询方法

int queryForlnt(String sql)
int queryForInt(String sql, Object... args)
int queryForInt(String sql, Object[] args, int[] argTypes)

(2)long类型的单值查询方法

long queryForLong(String sql)
long queryForLong(String sql, Object... args)
long queryForLong(String sql, Object[] args, int[] argTypes)

(3)其他类型的单值查询接口

<T> T queryForObject(String sql, Class<T> requiredType)
<T> T queryForObject(String sql, Object[] args, Class<T>requiredType)
<T> T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType)
<T> T queryForObject(String sql, Object[] args, int[] argTypes,RowMapper<T> rowMapper)
<T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
<T> T queryForObject(String sql, RowMapper<T> rowMapper)>


使用带Class<T> requiredType参数的方法时,结果集必须仅拥有一行一列,且结果集可以被造型成T类型的对象。如果结果集包括多列,则需要使用带RowMapper<T> rowMapper的方法,在接口方法中手工完成对象构造。

5、批量更改数据

如果需要一次性插人或更新多条记录,当然可以简单地通过多次调用update()方法完成任务,但这不是最好的实现方案。更好的选择是使用JdbcTemplate批量更改数据的方法。一般情况下,后者拥有更好的性能,因为更新的数据将被批量发送到数据库中,它减少了对数据库访问的次数。
--public int[] batchUpdate(String[] sql)
多条SQL语句组成一个数组(这些SQL语句不带参数),该方法以批量方式执行这些 SQL语句。Spring在内部使用Jdbc提供的批量更新API完成操作,如果底层的Jdbc Driver不支持批量更新操作,Spring将采用逐条更新的方式模拟批量更新。
--public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss)
使用本方法对于同一结构的带参SQL语句多次进行数据更新操作。通过 BatchPreparedStatementSetter回调接口进行批量参数的绑定工作。而 BatchPreparedStatementSetter又定义了两个方法。
--int getBatchSize():指定本批次的大小。
--void setValues(PreparedStatement ps, int i):为给定的PreparedStatement设置参数。


学习笔记
Spring JdbcTemplate是Spring框架提供的一个对JDBC进行封装的工具类,它可以简化JDBC编程的复杂性,提供了一种更简便的方式来访问数据库。 JdbcTemplate的原理是将JDBC的访问进行封装,提供了一些常用的操作方法,例如查询、更新、批量操作等。它通过DataSource来获取JDBC的连接,并通过Connection对象进行JDBC的操作,最后释放连接资源。 使用JdbcTemplate进行数据库操作的步骤如下: 1. 配置数据源,配置JdbcTemplate。 2. 在代码中通过JdbcTemplate对象进行数据库操作。 下面是一个简单的例子: 配置数据源和JdbcTemplate: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> ``` 在代码中通过JdbcTemplate对象进行数据库操作: ```java @Autowired private JdbcTemplate jdbcTemplate; public void insertUser(User user) { String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; jdbcTemplate.update(sql, user.getName(), user.getAge()); } public List<User> getUsers() { String sql = "SELECT * FROM user"; List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); return users; } ``` 在上面的代码中,我们通过@Autowired注解注入了JdbcTemplate对象,并使用它来执行插入和查询操作。 通过JdbcTemplate,我们可以使用占位符来传递参数,也可以使用BeanPropertyRowMapper将查询结果映射为Java对象。 总的来说,Spring JdbcTemplate的原理是封装了JDBC的访问,提供了一种更便捷的方式来操作数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值