1、jdbc 概述
Spring JDBC是Spring框架的持久层子框架。用于对数据库的操作(增删改查)。
而JdbcTemplate它是spring jdbc子框架中提供的一个操作类,用于对原始Jdbc API对象的简单封装。
2、JdbcTemplate 的创建
我们如何创建一个JdbcTemplate对象呢?不妨,我们通过简单分析一下JdbcTemplate的源码,从而理解创建一个JdbcTemplate对象需要声明前提条件。
源码如下:
1 public JdbcTemplate() { 2 } 3 4 /** 5 * Construct a new JdbcTemplate, given a DataSource to obtain connections from. 6 * <p>Note: This will not trigger initialization of the exception translator. 7 * @param dataSource the JDBC DataSource to obtain connections from 8 */ 9 public JdbcTemplate(DataSource dataSource) { 10 setDataSource(dataSource); 11 afterPropertiesSet(); 12 } 13 14 /** 15 * Construct a new JdbcTemplate, given a DataSource to obtain connections from. 16 * <p>Note: Depending on the "lazyInit" flag, initialization of the exception translator 17 * will be triggered. 18 * @param dataSource the JDBC DataSource to obtain connections from 19 * @param lazyInit whether to lazily initialize the SQLExceptionTranslator 20 */ 21 public JdbcTemplate(DataSource dataSource, boolean lazyInit) { 22 setDataSource(dataSource); 23 setLazyInit(lazyInit); 24 afterPropertiesSet(); 25 }
通过这段代码我们可以理解,创建一个JdbcTemplate对象,需要一个获得数据库连接的的数据源。就类似于我们以前学习JDBC技术的时候,获得操作对象Statement对象,必须要有数据库连接一样!!所以要创建JdbcTemplate对象,必须学会在Spring里面配置数据源。
3、Spring 配置数据源
① 环境搭建
第一步:导入包
第二步:配置文件准备
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd"> </beans>
第三步:配置数据源
市面上主流的连接池有两个。一个是C3P0,一个是DBCP。要想使用这两数据源都需要导入对应的jar包。
问题:我们原来使用数据库连接Connection就可以连接数据库了,但是为什么需要使用DataSource来获取数据库连接呢?
答:因为使用Connection获得数据库连接,每次操作都需要打开和关闭数据库,效率不高!
使用DataSource来获得数据库连接,涉及一个概念连接池!!!所以使用数据源的概念可以整合连接池!!市场上主流的连接池有:DBCP,C3P0.
配置C3P0数据源
导入 c3p0的jar包到工程的lib目录。在spring的配置文件中配置:
<!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///spring_day04"></property> <property name="user" value="root"></property> <property name="password" value="1234"></property> </bean>
配置DBCP数据源:
导入 commons-dbcp2-2.1.1.jar 和 commons-pool2-2.4.2.jar 到工程的 lib 目录。在 spring 的配置文件中配置:
<!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:// /spring_day04"></property> <property name="username" value="root"></property> <property name="password" value="1234"></property> </bean>
配置 spring jdbc 内置数据源:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql:///spring_day04"></property> <property name="username" value="root"></property> <property name="password" value="1234"></property> </bean>
4、JdbcTemoplate 的增删改查操作
注意:测试要导入spring-test-4.2.9.RELEASE.jar包
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/sms"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 配置指定连接池 --> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
实体类:
1 package com.sxt.entity; 2 3 public class Student { 4 5 private Long stuId;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学生编号', 6 private String stuName;//VARCHAR(50) NULL DEFAULT NULL COMMENT '学生名字', 7 private String stuAge;//INT(11) NULL DEFAULT NULL COMMENT '学生年龄', 8 private String stuPassword;//VARCHAR(50) NULL DEFAULT NULL COMMENT '登录密码', 9 public Long getStuId() { 10 return stuId; 11 } 12 public void setStuId(Long stuId) { 13 this.stuId = stuId; 14 } 15 public String getStuName() { 16 return stuName; 17 } 18 public void setStuName(String stuName) { 19 this.stuName = stuName; 20 } 21 public String getStuAge() { 22 return stuAge; 23 } 24 public void setStuAge(String stuAge) { 25 this.stuAge = stuAge; 26 } 27 public String getStuPassword() { 28 return stuPassword; 29 } 30 public void setStuPassword(String stuPassword) { 31 this.stuPassword = stuPassword; 32 } 33 }
实现代码:
1 package com.sxt.test; 2 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.sql.DataSource; 10 11 import org.junit.Test; 12 import org.junit.runner.RunWith; 13 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.dao.DataAccessException; 15 import org.springframework.jdbc.core.JdbcTemplate; 16 import org.springframework.jdbc.core.ResultSetExtractor; 17 import org.springframework.test.context.ContextConfiguration; 18 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 19 20 import com.sxt.entity.Student; 21 22 @RunWith(value = SpringJUnit4ClassRunner.class) 23 @ContextConfiguration(locations = "classpath:bean.xml") 24 public class JdbcTemplateTest { 25 26 @Autowired 27 private DataSource datasource; 28 @Autowired 29 private JdbcTemplate jdbctemplate; 30 31 /** 32 * 测试数据源是否成功 33 */ 34 @Test 35 public void dataSource() { 36 try { 37 System.out.println(datasource.getConnection()); 38 } catch (SQLException e) { 39 // TODO Auto-generated catch block 40 e.printStackTrace(); 41 } 42 } 43 44 /** 45 * 测试jdbctemplate对象是否成功 46 */ 47 @Test 48 public void jdbctemplate() { 49 System.out.println(jdbctemplate); 50 } 51 52 /** 53 * 测试jdbctemplate插入数据 54 */ 55 @Test 56 public void insert() { 57 58 jdbctemplate.update("INSERT INTO tb_student (stu_name, stu_age, stu_password) VALUES (?, ?, ?)", new Object[] {"o1",30,"999"}); 59 } 60 61 /** 62 * 测试jdbctemplate删除数据 63 */ 64 @Test 65 public void delete() { 66 67 jdbctemplate.update("DELETE FROM tb_student WHERE stu_id=?", 15); 68 } 69 70 /** 71 * 测试jdbctemplate更新数据 72 */ 73 @Test 74 public void update() { 75 76 jdbctemplate.update("UPDATE tb_student SET stu_name=? WHERE stu_id=?", new Object[] {"测试",16}); 77 } 78 79 /** 80 * 测试jdbctemplate查询所有数据返回List 81 */ 82 @Test 83 public void findAll() { 84 List<Map<String, Object>> students = jdbctemplate.queryForList("SELECT * FROM tb_student"); 85 86 for (Map<String, Object> student : students) { 87 System.out.println("学生名:" + student.get("stu_name")); 88 } 89 } 90 91 /** 92 * 测试jdbctemplate查询返回一个Map 93 */ 94 @Test 95 public void getByMap() { 96 Map<String, Object> entity = jdbctemplate.queryForMap("SELECT * FROM tb_student WHERE stu_id=?",1); 97 System.out.println(entity.get("stu_name")); 98 } 99 100 /** 101 * 测试jdbctemplate查询返回一个JavaBean 102 */ 103 @Test 104 public void getByEntity() { 105 ResultSetExtractor<Student> rowMapper = new ResultSetExtractor<Student>() { 106 @Override 107 public Student extractData(ResultSet rs) throws SQLException, DataAccessException { 108 Student student=new Student(); 109 if(rs.next()) { 110 111 student.setStuName(rs.getString("stu_name")); 112 } 113 return student; 114 } 115 }; 116 117 Student student = jdbctemplate.query("SELECT * FROM tb_student WHERE stu_id=?",new Object[] {1}, rowMapper); 118 System.out.println(student.getStuName()); 119 } 120 121 /** 122 * 测试测试jdbctemplate查询返回一个JavaBean元素的List 123 */ 124 @Test 125 public void getByEntityList() { 126 ResultSetExtractor<List<Student>> rowMapper = new ResultSetExtractor<List<Student>>() { 127 128 @Override 129 public List<Student> extractData(ResultSet rs) throws SQLException, DataAccessException { 130 List<Student> students =new ArrayList<Student>(); 131 while(rs.next()) { 132 Student student=new Student(); 133 student.setStuId(rs.getLong("stu_id")); 134 student.setStuName(rs.getString("stu_name")); 135 student.setStuPassword(rs.getString("stu_password")); 136 students.add(student); 137 } 138 return students; 139 } 140 }; 141 142 List<Student> query = jdbctemplate.query("SELECT * FROM tb_student", rowMapper); 143 for (Student student : query) { 144 System.out.println(student.getStuName()); 145 } 146 } 147 }