1、概念:
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中 (spring-jdbc.jar)
2.jdbcTemplate的入门程序
1)介绍jdbcTemplate的API
①DrvierManagerDataSource spring-jdbc.jar中提供的一个连接池对象
1、连接池中可以设置driver驱动
2、连接池对象中可以设置url
3、连接池中设置用户名(数据库用户民)
4、连接池对象中设置数据库的密码
②JdbcTemplate 核心处理对象(有对应的增删改查的方法)
1、update(sql, 实际传递的参数 ); 可以完成增删改
2、查询的方法
- queryForObject(sql ,返回数据类型的字节码对象, 实际传递的参数); 查询指定的字段
- **queryForObject(sql, BeanPropertyRowMapper, 实际传递的参数) 查询对象**
- queryForMap(sql , 实际传递的参数) 返回的是一个Map , map对象中存放的是对象的数据, 以键值对方式存储
- queryForList(sql , 实际参数) 返回的是List<Map<String,Object>> 查询一个List的结果,但是list中有map
- query(sql,BeanPropertyRowMapper) 查询一个List<POJO对象>
2)环境准备
1、数据库的准备工作
2、jar包的导入
<!--
spring JdbcTemplate
1)mysql
2)spring-context
3)spring-jdbc
4)spring-test
5)junit
6)lombok
-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
</project>
需求 使用jdbcTemplate完成数据的插入
3)代码实现:
package com.itheima.jdbcTemplate;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class Demo1_JdbcTemplate {
@Test
public void testInsert(){
//1.首先创建数据库连接池对象 DataSource
DriverManagerDataSource dataSource = new DriverManagerDataSource();
//2.设置DataSource的四个属性
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///day25");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//3.创建JdbcTemplate 对象, 传递DataSource给该对象的构造方法
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//4.调用jdbcTemplate的update方法完成数据的插入
jdbcTemplate.update("insert into stu values(? , ? ,? ,?)", 2,"刘能","清华大学",728);
}
}
4).jdbcTemplate 对象由
-
连接池对象DriverManagerDataSource 数据源对象有spring来管理,里面参数也有spring来注入
-
jdbcTemplate对象也由spring来管理 , 给该对象注入dataSource
-
测试代码中使用spring的环境, 注入jdbcTemplate, 直接测试.
spring来管理
改造的步骤
1.添加bean.xml配置文件, 目的是创建连接池和jdbcTemplate都交给spirng
<!--0.引入外部数据源 db.properties-->
<context:property-placeholder location="classpath:db.properties"/>
<!--1.创建连接池对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--2.创建JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--
set方式注入 <property
Constructor构造注入 <Constructor
-->
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
</beans>
外部数据源
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///day16
jdbc.username=root
jdbc.password=root
2、.测试文件中修改测试方法,使用spirng的测试环境
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:bean.xml")
public class Demo1_JdbcTemplate {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testInsert02(){
jdbcTemplate.update("insert into stu values(?,?,?,?)",4,"谢广坤","北大",715);
}
}
6)使用jdbcTemplate完成查询功能
- 根据根据id查询学生name
@Test
public void testQueryNameById(){
String name = jdbcTemplate.queryForObject("select sname from stu where sid = ?", String.class, 1);
System.out.println(name);
}
- 查询一共有多少个学生数
//2. 查询一共有多少个学生数 int
//queryForObject(sql ,返回数据类型的字节码对象, 实际传递的参数); 查询指定的字段
@Test
public void testQueryCount(){
Integer count = jdbcTemplate.queryForObject("select count(*) from stu ", Integer.class);
System.out.println(count);
}
- 查询id为7 的student对象,返回Stud
// 3. 查询id为7 的student对象,返回Student
// queryForObject(sql, BeanPropertyRowMapper, 实际传递的参数) 查询对象
@Test
public void testQueryStuById(){
Student student = jdbcTemplate.queryForObject("select * from stu where sid = ? ",
new BeanPropertyRowMapper<Student>(Student.class), 18);
System.out.println(student);
}
- 查询id为8的student对象返回map
// 4. 查询id为3的student对象返回map
//queryForMap(sql , 实际传递的参数) 返回的是一个Map , map对象中存放的是对象的数据, 以键值对方式存储
@Test
public void testFindStuMap(){
Map<String, Object> map = jdbcTemplate.queryForMap("select * from stu where sid = ? ", 3);
System.out.println(map);
}
- 查询所有的student对象 返回List<Map<String ,Object>> queryForList
//5. 查询所有的student对象 返回List<Map<String ,Object>> queryForList
@Test
public void testFindList(){
List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from stu ");
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
- 如果只想查询结果放到List<Bean> query
// 6. 如果只想查询结果放到List<Bean> query
//query(sql,BeanPropertyRowMapper) 查询一个List<POJO对象>
@Test
public void testFindStuList(){
List<Student> list =
jdbcTemplate.query("select * from stu", new BeanPropertyRowMapper<Student>(Student.class));
for (Student student : list) {
System.out.println(student);
}
}