`

Spring中JDBC操作简单总结

阅读更多
引言
  Spring版本:4.2.5,代码编写时间:2016-03-16。
  本人原创,转载请保留本人信息:http://wallimn.iteye.com。

  简单起见,没有使用接口,整个示例仅涉及4个文件。代码逻辑很简单,基本不用解释。

一、Spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
 		http://www.springframework.org/schema/beans 
 		http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 简单起见,使用Spring自带的数据源 -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="org.h2.Driver"></property>
		<property name="url" value="jdbc:h2:tcp://localhost/C:/h2-201510/jdbc"></property>
		<property name="username" value="sa"></property>
		<property name="password" value=""></property>
	</bean>

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 
	注意:由于要使用NamedParameterJdbcTemplate,
	UserDaoImpl要从NamedParameterJdbcDaoSupport类派生 
	-->
	<bean id="userDao" class="com.wallimn.study.UserDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>
</beans>


二、用户类User.class
package com.wallimn.study;

public class User {
	private String id;
	private String username;
	private String password;
	
	public void setId(String id){
		this.id = id;
	}

	public String getId() {
		return id;
	}
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		//return super.toString();
		return String.format("ID:%s\t\t\t用户名:%s\t\t密码:%s", id,username,password);
	}
}


三、数据操作类UserDaoImpl.class
package com.wallimn.study;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;

/**
 * 用户管理类,演示jdbc模板使用。
 * 使用JdbcTemplate模板(不支持命令参数等高级特性),需继承JdbcDaoSupport,
 * 使用NamedParameterJdbcTemplate,需继承NamedParameterJdbcDaoSupport,
 * 两个模板和Dao是有对应关系的。
 * @author Administrator
 *
 */
public class UserDaoImpl extends NamedParameterJdbcDaoSupport {

	/**
	 * 创建测试用表,后面的测试以这个表为基础 <br/>
	 * 时间:2016-3-15,作者:http://wallimn.iteye.com
	 */
	public void createUserTable() {
		String sql = null;
		try {
			sql = "drop table user";
			this.getJdbcTemplate().execute(sql);
		} catch (Exception e) {
			e.printStackTrace();
		}
		sql = "create table user(id varchar(32) primary key,username varchar(32),password varchar(256))";
		this.getJdbcTemplate().execute(sql);
	}

	/**
	 * 使用匿名参数
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUser(User user) {
		String sql = "insert into user values(?,?,?)";
		this.getJdbcTemplate().update(sql, user.getId(), user.getUsername(),
				user.getPassword());
	}
	/**
	 * 使用命名参数、Bean
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUserBean(User user) {
		String sql = "insert into user values(:id,:username,:password)";
		this.getNamedParameterJdbcTemplate().update(sql,
				new BeanPropertySqlParameterSource(user));
	}

	/**
	 * 使用命名参数、Map
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUserMap(Map<String,Object> user) {
		String sql = "insert into user values(:id,:username,:password)";
		this.getNamedParameterJdbcTemplate().update(sql,
				new MapSqlParameterSource(user));
	}

	/**
	 * 批量操作,一次性增加多个用户
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUser1(final List<User> users) {
		if(users==null || users.size()==0)return;
		String sql = "insert into user values(?,?,?)";
		//使用匿名类
		BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){

			@Override
			public int getBatchSize() {
				return users.size();
			}

			@Override
			public void setValues(PreparedStatement stat, int idx)
					throws SQLException {
				stat.setString(1, users.get(idx).getId());
				stat.setString(2, users.get(idx).getUsername());
				stat.setString(3, users.get(idx).getPassword());
			}
		};
		this.getJdbcTemplate().batchUpdate(sql, setter);
	}
	
	/**
	 * 批量操作,一次性增加多个用户
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUsers2(final List<User> users) {
		if(users==null || users.size()==0)return;
		String sql = "insert into user values(?,?,?)";
		//使用匿名类

		ParameterizedPreparedStatementSetter<User> setter = new ParameterizedPreparedStatementSetter<User>(){

			@Override
			public void setValues(PreparedStatement stat, User user)
					throws SQLException {
				stat.setString(1, user.getId());
				stat.setString(2, user.getUsername());
				stat.setString(3, user.getPassword());
			}
			
		};
		this.getJdbcTemplate().batchUpdate(sql,users,users.size(), setter);
	}
	
	/**
	 * 批量操作,一次性增加多个用户
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void addUsers3(final List<User> users) {
		if(users==null || users.size()==0)return;
		String sql = "insert into user values(:id,:username,:password)";
		//使用匿名类
		SqlParameterSource[] source = SqlParameterSourceUtils.createBatch(users.toArray());
		this.getNamedParameterJdbcTemplate().batchUpdate(sql, source);
	}
	

	/**
	 * 删除指定ID的用户
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param id
	 */
	public void deleteUser(String id) {
		String sql = "delete from user where id=?";
		this.getJdbcTemplate().update(sql, id);
	}

	/**
	 * 删除所有用户
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 */
	public void deleteAllUser() {
		String sql = "delete from user";
		this.getJdbcTemplate().update(sql);
		
	}

	/**
	 * 修改用户信息
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param user
	 */
	public void updateUser(User user) {
		String sql = "update user set username=?,password=? where id=?";
		this.getJdbcTemplate().update(sql, user.getUsername(),
				user.getPassword(), user.getId());
	}

	/**
	 * 根据ID查询用户名
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param id
	 * @return
	 */
	public String queryUserName(String id) {// 简单查询,按照ID查询,返回字符串
		String sql = "select username from user where id=?";
		// 返回类型为String(String.class)
		return this.getJdbcTemplate().queryForObject(sql, String.class, id);

	}

	/**
	 * 查询结果以List形式返回
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @return
	 */
	public List<Map<String,Object>> queryForList() {
		String sql = "select * from user";
		return this.getJdbcTemplate().queryForList(sql);
		
	}
	
	/**
	 * 查询结果不多于一条记录,以Map形式返回
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param id
	 * @return
	 */
	public Map<String,Object> queryForMap(String id) {
		String sql = "select * from user where id=?";
		return this.getJdbcTemplate().queryForMap(sql,id);
		
	}
	/**
	 * 查询结果不多于一条记录,以Map形式返回
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param id
	 * @return
	 */
	public String queryForObject(String id) {
		String sql = "select username from user where id=?";
		return this.getJdbcTemplate().queryForObject(sql,new Object[]{id},String.class);
		
	}
	
	/**
	 * 统计用户数量
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @return
	 */
	public String queryUserCount() {
		String sql = "select count(*) from user";
		return this.getJdbcTemplate().queryForObject(sql,String.class);
		
	}
	
	/**
	 * 查找指定ID的用户,使用RowMapper将结果转化为User类型
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @param id
	 * @return
	 */
	public User queryUser(String id) {
		String sql = "select * from user where id=?";
		return this.getJdbcTemplate().queryForObject(sql, new UserRowMapper(),
				id);
	}

	/**
	 * 返回所有用户,使用RowMapper将结果转化为User类型
	 * <br/>
	 * 时间:2016-3-16,作者:http://wallimn.iteye.com
	 * @return
	 */
	public List<User> findAll() {// 复杂查询返回List集合
		String sql = "select * from user";
		return this.getJdbcTemplate().query(sql, new UserRowMapper());

	}

	/**
	 * 将ResultSet转化为Bean的类。
	 * @author Administrator
	 *
	 */
	class UserRowMapper implements RowMapper<User> {
		public User mapRow(ResultSet rs, int rowNum) throws SQLException {

			User user = new User();
			user.setId(rs.getString("id"));
			user.setUsername(rs.getString("username"));
			user.setPassword(rs.getString("password"));
			return user;
		}

	}

}


四、测试类UserDaoTest.java
package com.wallimn.study;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDaoTest {

	private ApplicationContext applicationContext = null;
	
	public UserDaoTest(){
		applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
	/**
	 * DAO,简单起见,不使用接口。
	 */
	private UserDaoImpl userDao;
	private UserDaoImpl getUserDao(){
		if(userDao==null){
			userDao = (UserDaoImpl)applicationContext.getBean("userDao");
		}
		return userDao;
	}
	
	/**
	 * 返回GUID,用作主键
	 * <br/>
	 * 时间:2016-3-16,作者:wallimn@sohu.com
	 * @return
	 */
	private String getUUID(){
		return UUID.randomUUID().toString().replace("-", "").toLowerCase();
	}
	
	/**
	 * 创建测试用表
	 * <br/>
	 * 时间:2016-3-16,作者:wallimn@sohu.com
	 */
	 @Test
     public void testCreateTable(){
         this.getUserDao().createUserTable();
     }
	 /**
	  * 插入、删除用户测试
	  * <br/>
	  * 时间:2016-3-16,作者:wallimn@sohu.com
	  */
	 @Test
	 public void testAddAndDeleteUser(){
		 String id1 = this.getUUID();
		 String id2 = this.getUUID();
		 String id3 = this.getUUID();
		 String id4 = this.getUUID();
		 this.getUserDao().deleteAllUser();
		 User user=new User();
		 user.setId(id1);
		 user.setUsername("wallimn");
		 user.setPassword("wallimn@sohu.com");
		 this.getUserDao().addUser(user);
		 
		 user.setId(id2);
		 this.getUserDao().addUserBean(user);
		 
		 user.setId(id3);
		 this.getUserDao().addUserBean(user);
		 
		 Map<String,Object> m = new HashMap<String,Object>();
		 m.put("id", id4);
		 m.put("username", "张三");
		 m.put("password", "mypwd");
		 this.getUserDao().addUserMap(m);
		 System.out.println("==插入四个用户,结果如下==");
		 this.showUsers();
		 
		 this.getUserDao().deleteUser(id1);
		 System.out.println("==删除一个用户,结果如下==");
		 this.showUsers();
		 
		 
		 System.out.println("==查询测试,结果为List==");
		 List<Map<String,Object>> list = this.getUserDao().queryForList();
		 for(Map<String,Object> map :list){
			 System.out.println(map.get("username"));
		 }
		 
		 System.out.println("==查询测试,结果为Map==");
		 Map<String,Object> map = this.getUserDao().queryForMap(id3);
		 System.out.println(map.get("username"));
		 //如果没有查到数据,会报异常
		 //map = this.getUserDao().queryForMap("notexist");
		 //System.out.println(map.get("username"));

		 System.out.println("==查询测试,结果为String==");
		 String username = this.getUserDao().queryForObject(id3);
		 System.out.println(username);
		 //如果没有查到数据,会报异常
		 //username = this.getUserDao().queryForObject("notexist");
		 //System.out.println(username);
	 }
	 
	 @Test
	 public void testBatchInsert(){
		 this.getUserDao().deleteAllUser();
		 
		 List<User> users = new LinkedList<User>();
		 
		 for(int i=0; i <1000; i ++){
			 User u = new User();
			 u.setId(String.format("%04d", i));
			 u.setUsername("姓名"+i);
			 u.setPassword("密码"+i);
			 users.add(u);
		 }
		 
		 this.getUserDao().addUsers3(users);
		 
		 System.out.println("用户数量:"+this.getUserDao().queryUserCount());
	 }
	 
     
     /**
      * 显示所有用户,查看SQL执行情况。
      * <br/>
      * 时间:2016-3-16,作者:wallimn@sohu.com
      */
     private void showUsers(){
    	 List<User> users=this.getUserDao().findAll();
    	 for(User user : users){
    		 System.out.println(user);
    	 }
     }
     
}
分享到:
评论

相关推荐

    Spring Data JDBC与JDBC的区别

    `JdbcTemplate`是Spring提供的工具类,用于简化JDBC操作,例如执行SQL和处理结果集。`RowMapper`接口用于将结果集映射到Java对象。 集成Spring Data JDBC可以减少代码量,提高可维护性,并且由于Spring的其他模块...

    spring jdbc.zip

    总结来说,Spring JDBC通过JdbcTemplate和一系列辅助工具,极大地简化了Java应用中的数据库操作,使得开发者能够更加专注于业务逻辑,而不是被数据库访问的细节所困扰。同时,Spring JDBC还结合了Spring的其他模块,...

    spring4 jdbc star t

    Spring 4的JDBC支持让数据库操作变得简单且易于维护。通过`JdbcTemplate`,我们能优雅地执行SQL查询和更新,同时,结合Spring的事务管理和异常处理机制,确保了应用程序的健壮性。了解并熟练掌握这些知识点,将有助...

    Spring JDBC实现代码

    总结起来,Spring JDBC提供了一种更简洁、更安全的方式来处理JDBC操作,通过Spring的依赖注入和事务管理功能,可以更方便地进行数据库操作。在Spring 2.5中,结合MySQL数据库,我们可以利用JdbcTemplate执行SQL语句...

    spring-jdbc-2.5.6.jar

    JdbcTemplate是Spring JDBC的核心类,它封装了常见的JDBC操作,如查询、更新、插入和删除。使用JdbcTemplate,你可以通过简单的API调用来执行SQL语句,并且异常会被自动转换为更友好的Spring DataAccessException。 ...

    Spring JDBC 增删改查

    总结来说,Spring JDBC提供了强大且灵活的数据库访问工具,简化了JDBC的使用,使得开发者能够专注于业务逻辑,而不是底层的数据库操作细节。结合良好的事务管理和异常处理机制,Spring JDBC成为了Java开发中的重要...

    第十一章 Spring4 JDBC

    这个文件名可能表示这是关于Spring框架的第11部分内容,有可能包含了相关的代码示例、配置文件或数据库脚本,帮助读者更好地理解和实践Spring4中的JDBC操作。 总结,Spring4的JDBC模块提供了强大的工具,使开发者...

    extjs+spring+jdbc

    ExtJS + Spring + JDBC 是一个常见的企业级应用开发...总结来说,"extjs+spring+jdbc" 结合提供了从用户界面到数据存储的全方位解决方案。通过熟练掌握这三者,开发者可以构建出高效、稳定且易于维护的管理后台系统。

    springjdbc使用及mybatis-generator

    1. **Spring JDBC核心组件**:Spring JDBC的核心是JdbcTemplate,它是一个模板类,封装了基本的JDBC操作,如执行SQL查询、更新、存储过程等。通过使用JdbcTemplate,开发者可以避免编写大量重复的JDBC模板代码,例如...

    Spring_JDBC模板笔记

    虽然JdbcTemplate在简化JDBC操作方面做得很好,但相比ORM框架如Hibernate,它的使用仍需要编写更多的SQL语句。Hibernate提供了对象-关系映射,可以直接操作对象,降低了与SQL的耦合度,对于复杂查询和关联操作更为...

    SpringJdbc.rar

    `JdbcTemplate`是Spring JDBC的核心类,它通过模板方法模式简化了常见的JDBC操作,如查询、更新、插入和删除数据。`SimpleJdbcInsert`和`SimpleJdbcCall`则分别用于简化插入操作和调用存储过程。 集成Spring JDBC的...

    SpringStudy_JDBC.zip

    总结,Spring与JDBC的结合使得数据库操作变得更加高效、简洁。从简单的SQL执行到复杂的事务管理,再到ORM框架的集成,Spring都提供了全面的支持。同时,Spring Boot的引入更是降低了使用门槛,提升了开发体验。对于...

    spring-boot jdbc jsp Demo

    在本项目"Spring-Boot JDBC JSP Demo"中,我们将探讨如何使用Spring Boot框架整合JDBC和JSP技术来创建一个简单的Web应用程序。这个Demo旨在展示如何在Spring Boot环境中进行数据库操作并展示结果到用户界面。 首先...

    springjdbc的简单运用以及Dojo的小案例,包括了Dojo的相关资料包

    总结来说,这个案例涵盖了Spring JDBC的数据库操作基础和Dojo的客户端开发实践,提供了一个从后端数据获取到前端展示的完整流程。学习这个案例,可以帮助开发者理解和掌握Spring框架中的数据库访问层处理以及Dojo在...

    spring-data-jdbc-1.0.0.RC1.zip

    总结,Spring Data JDBC 1.0.0.RC1为开发者带来了高效、简洁的JDBC操作方式,降低了数据库访问的复杂性,提高了开发效率,是构建现代Java应用的理想选择。结合Spring Boot的自动化配置,它使得数据访问变得更加优雅...

    org.apache.servicemix.bundles.spring-jdbc-4.0.2.RELEASE_1.zip

    总结起来,这个压缩包包含了Apache ServiceMix中的Spring JDBC模块,用于简化数据库操作,以及一个Maven插件,用于优化Web项目的前端资源。这两个组件都是开源的,体现了开放源码社区对软件开发的贡献和价值。

    SpringBoot项目采用JDBC连接MySql示例

    总结起来,这个示例项目展示了如何在SpringBoot应用中通过JDBC连接MySQL数据库,并利用`JdbcTemplate`进行基本的数据库操作。了解这些知识点有助于构建和维护高效、稳定的数据库驱动的应用。在实际开发中,还可以...

    spring3.10实现jdbc存储deom

    总结来说,Spring 3.10的JDBC支持使得数据库操作变得简单而直观,通过`JdbcTemplate`可以方便地执行SQL语句,同时避免了手动管理资源的繁琐工作。配置正确的jar包依赖和设置好数据源后,就可以轻松地在Java应用中...

    spring jdbc

    在这个配置中,我们创建了一个`DataSource` bean来管理数据库连接,并通过`JdbcTemplate` bean封装了低级别的JDBC操作。 接下来,我们讨论如何使用`JdbcTemplate`执行CRUD操作: 1. **创建(Create)**: 创建新...

    springmvc+springjdbc+maven 后端架构

    Spring JDBC 提供了一个更高级别的抽象层,使得数据库操作更加简单和易管理。它简化了JDBC的配置和使用,通过模板方法和回调机制减少了代码量。Spring JDBC还支持事务管理,使开发者能够轻松处理数据库事务的提交和...

Global site tag (gtag.js) - Google Analytics