spring 框架如何处理对数据库的操作呢?
1. 基本介绍
文档:JdbcTemplate APIs : /spring-framework-5.3.8/docs/javadoc-api/index.html
JdbcTemplate 是 Spring 提供的访问数据库的技术。可以将 JDBC 的常用操作封装为模板方法
已经提供了特别多的 API
2. 使用实例
2.1 JdbcTemplate 使用准备
1)创建数据库及表
-- 创建数据库
CREATE DATABASE spring
USE spring
-- 创建表 monster
CREATE TABLE monster(
id INT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',
skill VARCHAR(64) NOT NULL DEFAULT ''
)CHARSET=utf8
INSERT INTO monster VALUES(100, '青牛怪', '吐火');
INSERT INTO monster VALUES(200, '黄袍怪', '吐烟');
INSERT INTO monster VALUES(300, '蜘蛛怪', '吐丝');
2)配置 src/jdbc.properties
jdbc.userName=root
jdbc.password=hsp
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
3)配置文件 src/JdbcTemplate_ioc.xml
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.userName}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
配置 JdbcTemplate_ioc.xml,将数据源分配给 JdbcTemplate bean
<!-- 配置 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 将上面的数据源分配给 jdbcTemplate -->
<property name="dataSource" ref="dataSource"/>
</bean>
2.2 测试
1)添加一个新的 monster
@Test
public void addDataByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 JdbcTemplate bean
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
// 1. 添加方式 1
// String sql = "INSERT INTO monster VALUES(400, '红孩儿', '枪法厉害')";
// bean.execute(sql);
//2. 添加方式 2, 绑定参数
String sql = "INSERT INTO monster VALUES(?, ?, ?)";
int affected = bean.update(sql, 700, "红孩儿 2", "枪法厉害 2");
System.out.println("add ok affected= " + affected);
}
2)更新一个 monster 的 skill
@Test
public void updateDataByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 JdbcTemplate bean
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
String sql = "UPDATE monster SET skill = ? WHERE id=?";
int affected = bean.update(sql, "美女计", 300);
System.out.println("affected= " + affected);
}
3)批量添加二个 monster
@Test
public void addBatchDataByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);//添加..
String sql = "INSERT INTO monster VALUES(?, ?, ?)";
List<Object[]> param_list = new ArrayList<Object[]>();
param_list.add(new Object[]{500, "白蛇精", "skill1"});
param_list.add(new Object[]{600, "青蛇精", "skill2"});
bean.batchUpdate(sql, param_list);
System.out.println("batch add ok");
}
4)查询单个 monster 并封装到 Monster 实体对象
@Test
public void selectDataByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 JdbcTemplate bean
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id =?";
//下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.
RowMapper<Monster> rowMapper = new
BeanPropertyRowMapper<Monster>(Monster.class);
Monster monster = bean.queryForObject(sql, rowMapper, 100);
System.out.println("monster= " + monster);
}
5)查询多个 monster 并封装实体对象
@Test
public void selectMulDataByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 JdbcTemplate bean
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id >=?";
//下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.
RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<Monster>(Monster.class);
List<Monster> monster_list = bean.query(sql, rowMapper, 200);
for (Monster monster : monster_list) {
System.out.println(monster);
}
}
6)查询返回结果只有一行一列
@Test
public void selectScalarByJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 JdbcTemplate bean
JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
String sql = "SELECT name FROM monster WHERE id =100";
String name = bean.queryForObject(sql, String.class);
System.out.println(name);
}
7)使用 Map 传入具名参数完成操作
src\JdbcTemplate_ioc.xml, 增加配置
<!-- 配置 NamedParameterJdbcTemplate,支持具名参数 -->
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<!-- 这里需要使用构造器关联数据源 -->
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
测试:使用 Map 传入具名参数完成操作
注:sql 语句里的属性名,要和 map_parameter 的 key 保持一致
@Test
public void testDataByNamedParameterJdbcTemplate() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 NamedParameterJdbcTemplate bean
NamedParameterJdbcTemplate namedParameterJdbcTemplate =
ioc.getBean(NamedParameterJdbcTemplate.class);
String sql = "INSERT INTO monster VALUES(:my_id, :name, :skill)";
Map<String, Object> map_parameter = new HashMap<String, Object>();
map_parameter.put("my_id", 800);
map_parameter.put("name", "螃蟹精");
map_parameter.put("skill", "钳子无敌大法");
namedParameterJdbcTemplate.update(sql, map_parameter);
System.out.println("add data ok~");
}
8)使用 sqlparametersoruce 来封装具名参数、
注:这里的 sql 里的属性名称,要和 Monster bean 的属性名保持一致
@Test
public void operDataBySqlparametersoruce() {
ApplicationContext ioc = new
ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//得到 NamedParameterJdbcTemplate bean
NamedParameterJdbcTemplate namedParameterJdbcTemplate =
ioc.getBean(NamedParameterJdbcTemplate.class);
String sql = "INSERT INTO monster VALUES(:monsterId, :name, :skill)";
Monster monster = new Monster(900, "狐狸精", "狐媚之术");
SqlParameterSource source = new BeanPropertySqlParameterSource(monster);
namedParameterJdbcTemplate.update(sql, source);
System.out.println("add ok~");
}
2.3 Dao 对象中使用 JdbcTemplate
1)创建对象
MonsterDao.java
@Repository
public class MonsterDao {
@Autowired
private JdbcTemplate jdbcTemplate;
//添加 monster
public void save(Monster monster) {
String sql = "INSERT INTO monster VALUES(?, ?, ?)";
jdbcTemplate.update(sql, monster.getMonsterId(),
monster.getName(), monster.getSkill());
}
}
2)修改 \src\JdbcTemplate_ioc.xml
<!-- 加入自动扫描包 -->
<context:component-scan base-package="com.hspedu.spring.jdbctemplate.dao"/>
3)测试
@Test
public void operDataByDao() {
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
MonsterDao bean = ioc.getBean(MonsterDao.class);
Monster monster = new Monster(1000, "大虾精", "夹子功");
bean.save(monster);
}