一 JdbcTemplate 简介
为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架。
JdbcTemplate提供了很多增删改查方法,很方便,以下是常用的查询和更新方法。update方法可以执行插入、更新、删除操作。
二 创建Spring工程
1 导入jar包
2applicationContext.xml配置如下
<!--导入资源文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!-- 配置 Spirng 的 JdbcTemplate -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
3配置数据库配置文件db.properties
jdbc.user=user
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
※ serverTimezone是指定时区,其中UTC代表的是全球标准时间,当然也可以配置其他标准,如果不配置,会报如下错误:
java.sql.SQLException: The server time zone value ‘?й???’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
4创建练习表
如果数据库中有表,可以直接拿来使用就可以。
CREATE TABLE user
(
name
varchar(255) DEFAULT NULL,
oprno
int(255) unsigned zerofill NOT NULL,
email
varchar(255) DEFAULT NULL,
phone
int(255) DEFAULT NULL,
PRIMARY KEY (oprno
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
5单元测试代码
package com.java.spring.jdbc;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class JDBCTest {
ApplicationContext ctx ;
JdbcTemplate jdbcTemplate;
private List<Map<String, Object>> queryForList;
{
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");
System.out.println(jdbcTemplate);
}
@Test
public void testUpdate() {
String sql = "UPDATE USER SET NAME=? WHERE NAME=? ";
int result = jdbcTemplate.update(sql, "张三三","张三");
System.out.println(result);
}
@Test
public void testQuery() {
String sql = "SELECT * FROM user where name=?";
queryForList = jdbcTemplate.queryForList(sql, "李四");
System.out.println(queryForList);
}
}
@Test
public void testInsert() {
String sql = "INSERT INTO USER(NAME,email,phone,oprno) VALUES(?,?,?,?)";
int result = jdbcTemplate.update(sql, "田六","123@qq.com","123456",123456);
System.out.println(result);
}
6遇到的问题
(1)报如下错误:
Spring 整合JdbcTemplate报错
警告: Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘jdbcTemplate’ defined in class path resource [applicationContext.xml]:
Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [org.springframework.jdbc.core.JdbcTemplate]: No default constructor found;
nested exception is java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
原因:缺少jar包 spring-tx-5.1.8.RELEASE.jar
(2)如下错误:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@6089fb5c – APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
省略…
java.sql.SQLException: Access denied for user 'root '@‘localhost’ (using password: YES)
原因:数据库配置文件中某处多空格,我的是user结尾处多了空格
(3)c3p0 连接错误,重启mySql服务。