`

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-Reference_zh_CN(Spring中文参考手册)

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate ...

    Spring中文帮助文档

    11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource...

    Spring 2.0 开发参考手册

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. ...

    Spring API

    11.5. 通过使用SimpleJdbc类简化JDBC操作 11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能...附录B 在Spring中开发Web Service

    spring chm文档

    11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. ...

    spring security 参考手册中文版

    12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106 作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能...附录B 在Spring中开发Web Service

    Spring面试题

    在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,...

    ssh(structs,spring,hibernate)框架中的上传下载

    3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。  通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。  以上是Spring+...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    Hbase+Spring boot实战分布式文件存储

    6-1 Phoenix简介 6-2 Phoenix安装 6-3 Phoenix实战:shell命令操作Phoenix 6-4 Phoenix实战:java jdbc操作Phoenix 6-5 通过mybatis操作Phoenix 6-6 通过mybatis操作Phoenix 6-7 Sqoop简介 6-8 Sqoop数据导入实战 6...

    Java语言基础下载

    在子窗体中访问并控制父窗体中对象 493 内容总结 495 独立实践 496 第二十五章:JavaScript介绍 497 学习目标 497 JavaScript语言概况 498 JavaScript和Java的区别 499 基于对象和面向对象 499 解释和编译 499 强...

    计算机专业毕业实习日记.docx

    以前Java程序员与数据库打交道都是通过JDBC,还要写 SQL语句,不过Hibernate彻底改变了这一切,它在JDBC之上又作了一次封装,从而实现了不用写SQL语句就可以实现操作数据库。 值得提醒的是,这三个框架都是轻量级的...

    Java学习笔记-个人整理的

    {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {1.4.1}整数与浮点数}{23}{subsection.1.4.1} {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{...

    Java面试宝典2010版

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【WEB】阐述JDBC操作数据库的步骤 36 【WEB】JSP内置对象 37 【WEB】JSP中的四种作用域 38 【WEB】转发(forward)和重定向(redirect)的区别 38 forward(转发): 38 redirect(重定向): 39 区别: 39 【WEB】...

    Activiti6.0教程例子下载

    4. TaskService: 在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。TaskService提供了对用户Task 和Form相关的操作。它提供了运行时任务查询、...

    Maven权威指南 很精典的学习教程,比ANT更好用

    总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装Maven 2.3.3. 在Linux上安装Maven 2.3.4. 在FreeBSD或...

Global site tag (gtag.js) - Google Analytics