2024/05/20
Spring整合JDBC模板
相关依赖
<!--Spring整合JDBC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--Spring操作事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
连接池:不用在操作数据库的时候临时创建一个对象,用完之后销毁,而是有个池子,在未操作数据库之前就已经将连接放在了池子中,想用的时候从池子中取,不想用的时候就放回池子,避免了操作数据库的对象的频繁创建和销毁
获取连接池的主要目的是配置操作数据库的相关信息
jdbc模板技术封装了下述步骤,我们仅需完成编写sql(和遍历结果集)
/**
* //获取连接
* //编写sql
* //预编译sql
* //参数设置
* //执行sql语句
* //遍历结果集
* //关闭资源
*/
new的方式
//可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的
- 测试类
public class JdbcTest {
//可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的
@Test
public void run() {
//创建数据库连接池对象
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring_db");
dataSource.setUsername("root");
dataSource.setPassword("root");
//操作
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//添加(需要参数就加?,?有几个?后边就写几个参数)
jdbcTemplate.update("insert into account values(null,?,?)","王五",2000.00);//支持参数赋值的方式(可防止sql注入)
}
}
改进→配置文件方式
- 配置文件
<!-- 配置连接池对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
- 测试
//声明该类为测试单元
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTest {
//可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void run() {
jdbcTemplate.update("insert into account values(null,?,?)","王五01",2000.00);//支持参数赋值的方式(可防止sql注入)
}
}
再改进→配置属性文件
配置属性文件相当于将数据库的配置信息专门解耦出来了
//可以用druid连接池,也可以用spring的内置连接池,此处用的是druid的
属性文件使用key-value形式(注意没有引号""了)
- 属性文件jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=root
加载属性文件的两种方式:
<!-- 属性配置文件 第一种写法-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>
<!-- 属性配置文件 第二种写法-->
<context:property-placeholder location="classpath:jdbc.propertiesxml
- 加载了属性文件后,用**${}**从属性文件中取值
<!-- 配置连接池对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
使用JDBC模板进行增删改查
增删改都用update
,查询时查一个用queryForObject
,查多个用query
查询:需要自己编写一个类来接收查询到的数据
注意继承的是jdbc的RowMapper
jdbc模板技术封装了大部分步骤,但是由于每次查询的数据库不一样,因此需要单独继承一个RowMapper类来完成数据的封装
- 封装数据的类
/**
* 用来进行数据封装
*/
public class BeanMapper implements RowMapper<Account> {
/**
* RowMapper类中提供内置的循环(我们不用自己循环的将数据添加到Account类中)
* mapRow()是一行一行进行数据封装的
* **/
@Override
public Account mapRow(ResultSet resultSet, int i) throws SQLException {
//将从数据库中取到的数据封装到account中
Account account = new Account();
account.setId(resultSet.getInt("id"));
account.setName(resultSet.getString("name"));
account.setMoney(resultSet.getDouble("money"));
return account;
}
}
- 测试类
@Test
//查
//通过id查询 查一个queryForObject
//queryForObject(sql语句,查询到的结果封装到哪个对象中去,?中的内容的值)
public void run4() {
try {
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), 10);//支持参数赋值的方式(可防止sql注入)
System.out.println(account);
} catch (EmptyResultDataAccessException e) {
System.out.println(e); //保证即使未查询到数据也不报错
}
}
@Test
//查
//查询所有 查多个query
public void run5() {
try {
List<Account> accountList = jdbcTemplate.query("select * from account", new BeanMapper());//支持参数赋值的方式(可防止sql注入)
System.out.println(accountList);
} catch (EmptyResultDataAccessException e) {
System.out.println(e); //保证即使未查询到数据也不报错
}
}