`

SimpleJdbcTemplate 扩展

 
阅读更多

http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html

http://www.mkyong.com/spring/spring-named-parameters-examples-in-simplejdbctemplate/

 

 

 

package com.snailteam.team.model;

public interface Model {

}

 

 

 

package com.snailteam.team.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "tuser")
public class User implements Model {
	@Id
	public int id;
	@Column(name = "username")
	public String username;
	@Column(name = "password")
	public String password;
	@Column(name = "reg_date")
	public Date reg_date;
	@Column(name = "version")
	public Integer version;
	public String lastIp;
}

 

 

package com.snailteam.team.model;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.sql.DataSource;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

public class SimpleJdbcTemplateExt extends SimpleJdbcTemplate {

	public SimpleJdbcTemplateExt(DataSource dataSource) {
		super(dataSource);
	}

	public int insert(Model model) throws IllegalArgumentException,
			IllegalAccessException, SQLException {
		String tableName = "";
		Map<String, Object> parameters = this.model2Parameters(model);
		if (model.getClass().isAnnotationPresent(Table.class)) {
			Table table = model.getClass().getAnnotation(Table.class);
			tableName = table.name();
		}
		StringBuffer sb = new StringBuffer();
		sb.append("(");
		for (String key : parameters.keySet()) {
			sb.append("," + key);
		}
		sb.append(")");

		MapSqlParameterSource paramSource = new MapSqlParameterSource();
		paramSource.addValues(parameters);
		KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
		this.getNamedParameterJdbcOperations().update(
				"insert into " + tableName + sb.toString().replace("(,", "(")
						+ "values"
						+ sb.toString().replace(",", ",:").replace("(,", "("),
				paramSource, generatedKeyHolder);
		return generatedKeyHolder.getKey().intValue();
	}

	public Map<String, Object> model2Parameters(Model model)
			throws IllegalArgumentException, IllegalAccessException {
		Map<String, Object> parameters = new HashMap<String, Object>();
		for (Field f : model.getClass().getFields()) {
			f.setAccessible(true);
			if (f.isAnnotationPresent(Id.class)) {
				Object obj = f.get(model);
				if (obj != null)
					parameters.put("id", obj);
			} else if (f.isAnnotationPresent(Column.class)) {
				Column column = f.getAnnotation(Column.class);
				Object obj = f.get(model);
				if (obj != null)
					parameters.put(column.name(), obj);
			}

		}
		return parameters;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public <T> T select(final Class<T> classz, String sql,
			Map<String, Object> parameters) throws InstantiationException,
			IllegalAccessException {
		return (T) this.queryForObject(sql, new RowMapper() {
			public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
				try {
					T object = classz.newInstance();
					for (Field f : object.getClass().getFields()) {
						f.setAccessible(true);
						if (f.isAnnotationPresent(Id.class)) {
							f.set(object, rs.getObject("id"));
						} else if (f.isAnnotationPresent(Column.class)) {
							Column column = f.getAnnotation(Column.class);
							f.set(object, rs.getObject(column.name()));
						}
					}
					return object;
				} catch (InstantiationException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return null;
			}

		}, parameters);

	}

	public <T> T parameters2Model(Class<T> clazz, Map<String, Object> parameters)
			throws IllegalArgumentException, IllegalAccessException,
			InstantiationException {
		T model = clazz.newInstance();
		for (Field f : model.getClass().getFields()) {
			f.setAccessible(true);
			if (f.isAnnotationPresent(Id.class)) {
				f.set(model, parameters.get("id"));
			} else if (f.isAnnotationPresent(Column.class)) {
				Column column = f.getAnnotation(Column.class);
				f.set(model, parameters.get(column.name()));
			}

		}
		return model;
	}
}

 

 

package com.snailteam.team.dao;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.hibernate.id.UUIDHexGenerator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.snailteam.team.model.SimpleJdbcTemplateExt;
import com.snailteam.team.model.User;

@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext*.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class UserServiceTest {

	@Resource
	DataSource dataSource;

	@Test
	public void testInsert() throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException, SQLException {
		User tUser = new User();
		tUser.username = "xiaofancn";
		tUser.password = "apsdf";
		tUser.version = 3L;
		tUser.id = 5;
		tUser.reg_date = new Date();
		SimpleJdbcTemplateExt simpleJdbcTemplateExt = new SimpleJdbcTemplateExt(
				dataSource);
		System.out.println(simpleJdbcTemplateExt.insert(tUser));
	}

	@Test
	public void testSelect() throws SecurityException, NoSuchFieldException,
			IllegalArgumentException, IllegalAccessException, SQLException,
			InstantiationException {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("id", 1);
		SimpleJdbcTemplateExt simpleJdbcTemplateExt = new SimpleJdbcTemplateExt(
				dataSource);
		User user = simpleJdbcTemplateExt.select(User.class,
				"select * from vuser where id=:id", params);
		System.out.println(user);
	}
}

 

 

再来一个工具累

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;


import org.springframework.jdbc.InvalidResultSetAccessException;
import org.springframework.jdbc.support.rowset.SqlRowSet;

public class JdbcUntil {

	public static <T> T parameters2Model(Class<T> clazz,
			Map<String, Object> parameters) {
		T model = null;
		try {
			model = clazz.newInstance();
		} catch (InstantiationException e1) {
			println(e1.getMessage());
		} catch (IllegalAccessException e1) {
			println(e1.getMessage());
		}
		Field[] fields = model.getClass().getFields();
		for (Field f : fields) {
			if (parameters.get(f.getName()) == null
					|| parameters.get(f.getName()).equals("null"))
				continue;
			f.setAccessible(true);
			try {
				f.set(model, parameters.get(f.getName()));
			} catch (IllegalArgumentException e) {
				println(e.getMessage());
			} catch (IllegalAccessException e) {
				println(e.getMessage());
			}
		}
		return model;
	}

	public static <T> T resultSet2Model(Class<T> clazz, ResultSet rs) {
		T model = null;
		try {
			model = clazz.newInstance();
		} catch (InstantiationException e) {
			println(e.getMessage());
		} catch (IllegalAccessException e) {
			println(e.getMessage());
		} finally {
			if (model == null)
				return model;
		}
		Field[] fields = model.getClass().getFields();
		for (Field f : fields) {
			f.setAccessible(true);
			try {
				f.set(model, rs.getObject(f.getName()));
			} catch (IllegalArgumentException e) {
				try {
					if (f.getType().equals(Integer.class)) {
						f.set(model,
								Integer.valueOf("" + rs.getObject(f.getName())));
					} else if (f.getType().equals(Long.class)) {
						f.set(model,
								Long.valueOf("" + rs.getObject(f.getName())));
					}
				} catch (Exception e2) {
					println("转换" + f.getName() + "错误");
				}
			} catch (IllegalAccessException e) {
				println(e.getMessage());
			} catch (SQLException e) {
				println(e.getMessage());
			}
		}
		return model;
	}

	public static <T> T sqlRowSet2Model(Class<T> clazz, SqlRowSet parameters) {
		T model = null;
		try {
			model = clazz.newInstance();
		} catch (InstantiationException e) {
			println(e.getMessage());
		} catch (IllegalAccessException e) {
			println(e.getMessage());
		} finally {
			if (model == null)
				return model;
		}
		Field[] fields = model.getClass().getFields();
		for (Field f : fields) {
			f.setAccessible(true);
			try {
				f.set(model, parameters.getObject(f.getName()));
			} catch (InvalidResultSetAccessException e) {
				println(e.getMessage());
			} catch (IllegalArgumentException e) {
				println(e.getMessage());
			} catch (IllegalAccessException e) {
				println(e.getMessage());
			}
		}
		return model;
	}

	public static Map<String, Object> model2Parameters(Object obj,
			boolean needNull) {
		Map<String, Object> paraMap = new HashMap<String, Object>();
		for (Field f : obj.getClass().getFields()) {
			try {
				if (!needNull && !(f.get(obj) == null))
					paraMap.put(f.getName(), f.get(obj));
				else
					paraMap.put(f.getName(), f.get(obj));
			} catch (IllegalArgumentException e) {
				println(e.getMessage());
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return paraMap;
	}

	public static String rowsFetchIdString(List<Map<String, Object>> rows,
			String keyword) {
		Set<Object> filter = new HashSet<Object>();
		StringBuffer sb = new StringBuffer();
		for (Map<String, Object> row : rows) {
			if (row.get(keyword) == null || filter.contains(row.get(keyword)))
				continue;
			filter.add(row.get(keyword));
			sb.append(row.get(keyword) + ",");
		}
		sb.append("-9");
		return sb.toString();
	}

	public static void println(String info) {
		System.out.println(new Date() + "JdbcUntil -----" + "  " + info);
	}
}

 

分享到:
评论

相关推荐

    simple-jdbctemplate-1.5.3.zip_Java编程_Java_

    6. **扩展与进阶** - **与其他组件集成**:`SimpleJdbcTemplate`可以与Spring的其他组件如`AOP`、`DAO`等无缝配合,提升整体开发效率。 - **JdbcTemplate的高级用法**:`SimpleJdbcTemplate`是`JdbcTemplate`的轻...

    使用JDBC进行数据访问【springframwork】定义.pdf

    这是对JdbcTemplate的扩展,它引入了命名参数的概念,替代了传统的占位符"?",使得SQL语句的参数更易于理解和维护,特别是在处理大量参数时。该类需要JDK 1.4或更高版本。 3. **SimpleJdbcTemplate**: ...

    spring中使用JDBC

    `NamedParameterJdbcTemplate`是`JdbcTemplate`的一个扩展,它支持命名参数而不是位置参数,这使得SQL语句更易于理解和维护。在使用`NamedParameterJdbcTemplate`时,SQL语句中的参数用名字来标识,而非传统的问号...

    spring-orm源码

    Spring-ORM是Spring框架的一部分,主要负责数据库操作的抽象和集成,它支持多种持久层技术,如Hibernate、JPA、iBatis等。...这对于任何希望优化和扩展数据访问层的Java开发者来说都是宝贵的资源。

    spring 2.5.6 必须jar包

    它包括了JdbcTemplate和SimpleJdbcTemplate,这两个模板类简化了SQL查询和结果集处理。 6. **spring-aop.jar**:AOP(面向切面编程)模块支持定义和执行横切关注点,比如日志记录、性能监控、事务管理等。它可以将...

    spring-framework-3.0

    对于数据访问,Spring 3.0增强了对JDBC、Hibernate和JPA的支持,提供了统一的数据访问抽象,如`JdbcTemplate`和`SimpleJdbcTemplate`,简化了数据库操作。 7. **MVC框架** Spring 3.0的Web MVC框架引入了模型视图...

    spring4.0库

    7. **spring-jdbc-4.0.0.RELEASE.jar**:这个模块提供了对JDBC的抽象层,简化了数据库访问,包括DataSource的管理、JdbcTemplate和SimpleJdbcTemplate,以及事务管理的支持。 8. **spring-aop-4.0.0.RELEASE.jar**...

    《Spring In Action》

    1. **扩展性的配置命名空间**: Spring 2 引入了新的可扩展配置命名空间,使得配置更为灵活和强大。 2. **增强的AOP支持**: 支持更简单的AOP配置以及@AspectJ注解的支持。 3. **简化事务管理**: 提供了更简单的方式来...

    Spring2.5中文开发手册

    总而言之,《Spring2.5中文开发手册》将帮助读者深入理解Spring框架的核心概念,如依赖注入、AOP、MVC、数据访问以及测试等,并掌握如何利用Spring 2.5的新特性来构建高质量、可扩展的应用程序。通过学习手册中的...

    Spring-Reference_zh_CN.rar_spring_spring 2.5_spring framework_sp

    Spring是一个开源的应用程序框架,它为Java平台提供了全面的基础设施支持,使得开发者能够更方便地构建可维护、可测试和可扩展的Java应用程序。 在Spring Framework 2.5中,最重要的更新包括对Java 5和Java 6的支持...

    spring-3.0.5.jar

    通过`JdbcTemplate`和`SimpleJdbcTemplate`,开发者可以方便地进行数据库操作,而无需过多关注底层细节。同时,ORM(对象关系映射)的支持也更加完善,如对Hibernate的进一步整合,使得数据库操作更为简洁和高效。 ...

    Spring 2.0 中文用户指南

    此外,对JDBC的抽象也得到了提升,Spring的JdbcTemplate和SimpleJdbcTemplate提供了更方便的数据操作接口。 在Web应用方面,Spring MVC作为Spring的Web MVC框架,提供了一种优雅的方式来组织和构建Web应用程序。...

    一个 scala jdbc 库,需要 spring-jdbc

    2. **模板方法**:`JdbcTemplate` 和 `SimpleJdbcTemplate` 类提供了模板方法来执行常见的 JDBC 操作,如查询、更新、插入和删除,无需编写大量重复的 JDBC 代码。 3. **数据源管理**:Spring 可以配置多种数据源,...

    Struts2.0+Spring2.5+JDBC只用核心包

    虽然JDBC本身较为低级,但通过Spring的JdbcTemplate或者SimpleJdbcTemplate,可以简化数据库操作,减少代码量,并提供事务管理。 在`SchoolInfoSys`这个项目中,我们可以推测这是一个学校信息管理系统。可能的功能...

    spring,struts,jdbc整合工程

    3. **配置JDBC**:在Spring配置文件中设置JDBC相关的Bean,如DataSource,JdbcTemplate或SimpleJdbcTemplate。 4. **整合Struts与Spring**:通过Spring-Struts的插件或者手动配置,使得Struts的Action由Spring管理...

    spring+jdbc组合开发

    在Spring中使用JDBC,我们可以利用`JdbcTemplate`或`SimpleJdbcTemplate`,这两个都是对JDBC的轻量级封装,提供了更安全、更易于使用的API。例如,`UserServiceImp`可能包含了这些模板方法来执行SQL查询、更新、插入...

    spring3.0企业版第二章运行所需要的jar包集合

    JSTL的核心标签库`jstl.core`提供了循环、条件判断等基本功能,而`jstl.fn`扩展库则提供了字符串处理和集合操作等功能。在Spring项目中,JSTL常与EL(Expression Language)结合使用,提高视图层的表达力。 再者,...

    spring 常用的26个包

    8. `org.springframework.jdbc`:用于处理数据库操作的包,包含JdbcTemplate和SimpleJdbcTemplate等,提供了SQL执行的简单抽象。 9. `org.springframework.orm`:这个包支持ORM(对象关系映射)技术,如Hibernate、...

    ssh三大轻量级框架整合.doc

    Spring提供的JdbcTemplate、NamedParameterJdbcTemplate和SimpleJdbcTemplate模板类消除了手动管理数据库连接、预编译SQL语句以及事务处理的繁琐工作。开发者只需关注业务逻辑,无需关心底层细节。例如,使用...

    Spring3.0资源包+中文文档

    3. **数据访问**:Spring3.0在数据访问层提供了对JPA(Java Persistence API)、Hibernate等ORM框架的更好支持,同时加强了对JDBC的抽象,通过`JdbcTemplate`和`SimpleJdbcTemplate`提供了更简洁的数据库操作API。...

Global site tag (gtag.js) - Google Analytics