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 = newClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");//得到 JdbcTemplate beanJdbcTemplate 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 beanJdbcTemplate 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 beanJdbcTemplate 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 beanJdbcTemplate 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 beanJdbcTemplate 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 beanNamedParameterJdbcTemplate 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 beanNamedParameterJdbcTemplate 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 {@Autowiredprivate JdbcTemplate jdbcTemplate;//添加 monsterpublic 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);
}