`
yu_duo
  • 浏览: 56714 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC template常用方法总结

阅读更多
[size=xx-small]前言[/size]

   本来对用法不是很想总结的,因为这些东西都是拿过来用,对原理不理解的我,觉得写这些总结就和网上铺天盖地的文章一样。但是昨天写了一篇发现想用的话其中还是有那么点问题的。所以就把JDBC template的常用总结再写一遍吧。

   好啦,言归正传。

JDBC 配置


jdbc.properties
# Properties file with JDBC and JPA settings.
#
# Applied by <context:property-placeholder location="jdbc.properties"/> from
# various application context XML files (e.g., "applicationContext-*.xml").
# Targeted at system administrators, to avoid touching the context XML files.

#-------------------------------------------------------------------------------
# MySQL Settings

#加载驱动
jdbc.driverClassName=com.mysql.jdbc.Driver 
#指定数据库、设置字符集、编码格式、自动连接
jdbc.url=jdbc:mysql://localhost:8080/?useUnicode=true&characterEncoding=UTF8&characterSetResults=UTF8&autoReconnect=true
#数据库名字
jdbc.username=root
#数据库密码
jdbc.password=123456


#mysqlmysql\u8FDE\u63A5\u5173\u95ED c3p0\u672A\u5173\u95ED\u95EE\u9898
c3p0.minPoolSize = 1  
c3p0.maxPoolSize = 50  
c3p0.initialPoolSize = 1  		
c3p0.maxIdleTime = 25000 
c3p0.acquireIncrement = 1  
c3p0.acquireRetryAttempts = 30  
c3p0.acquireRetryDelay = 1000  
c3p0.testConnectionOnCheckin = false  
#c3p0.automaticTestTable = t_c3p0  
c3p0.idleConnectionTestPeriod = 18000  
c3p0.checkoutTimeout=5000  
    
# Properties that control the population of schema and data for a new data source
#jdbc.initLocation=classpath:db/mysql/initDB.txt
#jdbc.dataLocation=classpath:db/mysql/populateDB.txt

# Property that determines which Hibernate dialect to use
# (only applied with "applicationContext-hibernate.xml")
#hibernate.dialect=org.hibernate.dialect.MySQLDialect

# Property that determines which JPA DatabasePlatform to use with TopLink Essentials
#jpa.databasePlatform=oracle.toplink.essentials.platform.database.MySQL4Platform

# Property that determines which database to use with an AbstractJpaVendorAdapter



解读jdbc.properties
<?xml version="1.0" encoding="UTF-8"?>
<!-- - DispatcherServlet application context for PetClinic's web tier. -->
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:oxm="http://www.springframework.org/schema/oxm"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
				http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.2.xsd">

	<!-- c3p0 的数据库连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClassName}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
		<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
		<property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
		<property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
		<property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
		<property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
		<property name="acquireRetryDelay" value="${c3p0.acquireRetryDelay}"/>
		<property name="testConnectionOnCheckin"  value="${c3p0.testConnectionOnCheckin}"/>
		<!-- <property name="automaticTestTable" value="${c3p0.automaticTestTable}"/> -->
		<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
		<property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
	</bean>
	<context:property-placeholder
		location="classpath:/conf/jdbc.properties" ignore-unresolvable="true" />
</beans>


说明
    为了方便使用同样可以定义一个父类来初始化jdbcTemplate模板。
public abstract class AbstractDao {
    
    protected DataSource dataSource;
    protected JdbcTemplate jdbcTemplate;

    public DataSource getDataSource() {
        return this.dataSource;
    }

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


CURD操作

    这里面主要讲一下返回对象时的做法,其余的CURD不具体讲解了,大家肯定都知道了。
所以直接拿代码来看区别吧。

传统的jdbc返回对象、List<Vo>的形式
/**
     * 获取xx
     *  @param status
     * @return List<UserTypeVO>
     */
	public List<UserTypeVO> getUtypeList(int status){
		String sql;
		MapSqlParameterSource paramSource = new MapSqlParameterSource();
		if(status==-1){
			sql = "select * from type order by display_order asc";
			}else{
				sql = "select * from type where status=:status order by display_order asc";
				paramSource.addValue("status",status);}
		try {
			SqlRowSet ret = this.namedJdbcTemplate.queryForRowSet(sql,paramSource);
			List<UserTypeVO> list = new ArrayList<UserTypeVO>();
			while (ret.next()) {
				UserTypeVO utype_vo=new UserTypeVO();
				utype_vo.setId(ret.getInt("id"));
				utype_vo.setDisplay_order(ret.getInt("display_order"));
				utype_vo.setUtype(ret.getInt("utype"));
				utype_vo.setUtype_name(ret.getString("utype_name"));
				utype_vo.setIf_change(ret.getInt("if_change"));
				utype_vo.setStatus(ret.getInt("status"));
				list.add(utype_vo);
				}
			return list;
			} catch (Exception e) {
				e.printStackTrace();
				}
		return null;
		}


说明

    这个是很早jdbc使用方法,我们可以看出,使用queryForRowSet将数据查出之后,判断是否一直有值,有的话就一个个将值按id取出,set到对应的字段之中。

    假设,我有100个字段,那么是不是要写100遍这样的代码?

    所以,现在下面的这种方式,帮你做了回答,我们完全可以不管这些,只管SQL就行了。

自动组装对象、List<V0>示例

public class Dao extends AbstractDao{
private BeanPropertyRowMapper<UserVo> recRowMapper = new BeanPropertyRowMapper<UserVo>(UserVo.class)
/**
	 * 获取xx信息
	 */
	@Override
	public List<UserVo> getUserVos(int status){
		List<UserVo> UserVos = new ArrayList<UserVo>();
		try {
			String sql = "SELECT r.id, r.uid, r.display_order, r.status, r.create_time, r.update_time "
					+ " FROM " 
					+ AppConstant.DATABASE_SCHEMA_APP_BB_APP
					+ "." + AppConstant.DATABASE_TABLE_USER
					+ " r WHERE r.status =:status AND u.uid = r.uid order by r.display_order asc ";
			MapSqlParameterSource paramSource = new MapSqlParameterSource();
			paramSource.addValue("status", status);
			recommendUserVos = this.namedJdbcTemplate.query(sql, paramSource, recRowMapper);
					
		} catch (Exception e) {
			log.debug("there is an error on getDaoImpl sql or param please check in." + e);
		}
	
		return UserVos;
	}
}

   
说明
   
     两端代码对比得出、同样的返回List<Vo>的类型,下面代码就没有长长的组装对象的语句。为什么呢?

    答案就是:1.它使用了private BeanPropertyRowMapper<UserVo> recRowMapper = new BeanPropertyRowMapper<UserVo>(UserVo.class);这样一个方法,来自动装配对象。

     那么它根据什么知道如何装配的呢?首先我们知道UserVo这里有哪些属性,同时我们结合了jdbc中this.namedJdbcTemplate.query(sql, paramSource, recRowMapper);这个方法,看方法中有一个参数为recRowMapper。由此得知是它们起了作用,在模板的帮助下,将其自动转换。

    注意因为在自动装配的时候,一定要通过一个关键字才能拿到对应的值,那么如何知道那个关键字就是数据库中的呢?所以这时我们就需要将bean中的属性名字,和数据库中字段的名字完全一致,确保取到唯一准确值,这样才能对应封装为正确的Vo,或者List<Vo>,否则会报错的哦~

结束语:

    这次总结,只总结了这个小用法,至于内部具体是如何实现的,喜欢的人可以自己看看源代码。

 
   
分享到:
评论

相关推荐

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    总结来说,Spring Data MongoDB通过`MongoDBTemplate`简化了MongoDB的集成和操作,使得开发者能够专注于业务逻辑而不是底层数据库交互。对于初学者,这是一个很好的起点,可以快速上手MongoDB和Spring Data的使用。

    工厂模式及模板方法模式深度思考

    在软件设计模式的世界里,工厂模式和模板方法模式是两种常用的设计模式,它们都有各自的优点和应用场景。这两种模式都是面向对象设计原则的体现,能够帮助我们编写出更加灵活、可扩展的代码。让我们来深入探讨一下这...

    spring_JdbcTemplete使用详解

    ##### 2.3 其他常用方法 - **int execute(String sql, PreparedStatementCallback action)** 执行任意 SQL 语句,适用于执行存储过程等复杂操作。 - **SimpleJdbcInsert createInsert(Class&lt;T&gt; domainClass)** ...

    hibernate连接各种数据库的方法

    &lt;property name="hibernate.connection.url"&gt;jdbc:postgresql:template1 &lt;property name="hibernate.connection.username"&gt;pg &lt;property name="hibernate.connection.password"&gt;&lt;/property&gt; ``` PostgreSQL是一个...

    springboot知识点整理

    5.4 Docker常用命令&操作 113 5.5 安装MySQL示例 114 6 Spring Boot与数据访问 115 6.1 JDBC 115 6.1.1 实现 115 6.1.2 自动配置原理 116 6.2 整合Durid数据源 117 6.3 整合Mybatis 122 6.3.1 注解版 123 6.3.2 配置...

    company_lib

    - **数据库连接**:如JDBC驱动,如MySQL Connector/J,Oracle JDBC驱动等,用于与各种数据库系统进行通信。 - **Web服务**:如Apache Axis、JAX-WS等,用于创建和消费SOAP或RESTful Web服务。 - **框架**:Spring...

    springboot模板项目(前后端分离)

    它集成了大量常用的第三方库配置,如Redis、MyBatis、JPA等,使得开发者可以快速地创建一个独立运行的Spring应用。在前后端分离的架构中,SpringBoot主要负责后端服务的开发。 1. **Spring Tools Suite (STS)** ...

    Jmeter后置处理器实现过程及方法应用

    本文将深入探讨 JMeter 的两种常见后置处理器:JSON Extractor 和正则表达式提取器,并通过实例详细介绍它们的使用方法。 1. JSON Extractor JSON Extractor 主要用于从 JSON 格式的响应数据中提取特定的值。当你...

    最完整易懂的Struts+Spring+Hibernate框架搭建指南

    然后在MyEclipse中配置数据源,选择Driver template为MySQL Connector/J,定义数据源名称,填写Connection URL(例如:jdbc:mysql://localhost:3306/book),添加数据库驱动JAR,输入用户名和密码,并勾选Save ...

    springboot mybatis freemark 框架集成 加实现demo

    SpringBoot、MyBatis和FreeMarker是Java开发中常用的三大框架,它们的集成可以构建高效、简洁的Web应用。在本教程中,我们将探讨如何将这三个框架整合,并创建一个简单的示例项目。以下是对集成过程的详细说明: 一...

    SSH三大框架经典美文.pdf

    SSH三大框架指的是Struts、Hibernate和Spring,它们是Java企业级开发中常用的技术栈。这里主要讨论的是Struts和Spring框架。 **Struts框架** Struts是一个基于MVC设计模式的Java Web应用框架,它的主要目标是简化...

    开涛高可用高并发-亿级流量核心技术

    18.4 基于OpenResty的常用功能总结 375 18.5 一些问题 376 19 应用数据静态化架构高性能单页Web应用 377 19.1 整体架构 378 19.1.1 CMS系统 379 19.1.2 前端展示系统 380 19.1.3 控制系统 380 19.2 数据和模板动态化...

    HibernateDaoSupport与JdbcDaoSupport

    其中,`HibernateDaoSupport`和`JdbcDaoSupport`是两种非常常用的支持类。 **HibernateDaoSupport**主要用于整合Hibernate框架,提供了一种更加简洁的方式来使用Hibernate进行数据库操作。而**JdbcDaoSupport**则...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

Global site tag (gtag.js) - Google Analytics