Spring JdbcTemplate的使用
Spring JdbcTemplate 使用
2023-09-11 14:14:35 时间
Spring对JDBC进行了封装,降低了JDBC的使用难度。
Spring JDBC的核心类是JdbcTemplate。
Spring JDBC的使用步骤
1、添加需要的jar包
- spring-jdbc.RELEASE.jar、spring-tx.RELEASE.jar
即使我们不手动管理事务,也需要添加spring-tx.RELEASE.jar,因为spring-jdbc.RELEASE.jar的源码中要使用spring-tx.RELEASE.jar的事务管理,
- 数据库驱动
- 如果要使用c3p0连接池 ,需添加c3p0的2个jar包(如果是oracle,需添加3个jar包)。
- 如果要使用dbcp连接池,需添加commons-dbcp.jar(dbcp本身的jar包)、commons-pool.jar(dbcp的依赖包)。
2、在xml中配置数据源、JdbcTemplate
<?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.xsd"> <!-- 配置数据源 --> <!-- 不使用连接池 --> <bean name="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" /> <property name="username" value="chy" /> <property name="password" value="abcd" /> </bean> <!-- 使用数据库驱动自带的连接池--> <!-- 此处使用的是mysql自带的连接池,使用的自然是mysql的驱动类,所以不配置driverClassName属性--> <bean name="mysqlConnectionPool" class="com.mysql.cj.jdbc.MysqlConnectionPoolDataSource"> <property name="url" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" /> <property name="user" value="chy" /> <property name="password" value="abcd" /> <property name="maxReconnects" value="30" /> </bean> <!-- 使用dbcp --> <bean name="dbcpDataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" /> <property name="username" value="chy" /> <property name="password" value="abcd" /> <property name="initialSize" value="15" /> <property name="maxTotal" value="30" /> <property name="minIdle" value="2" /> <property name="maxIdle" value="10" /> </bean> <!-- 使用c3p0 --> <bean name="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.cj.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" /> <property name="user" value="chy" /> <property name="password" value="abcd" /> <property name="maxPoolSize" value="30" /> <property name="initialPoolSize" value="15" /> <property name="minPoolSize" value="8" /> </bean> <!--配置JdbcTemplate--> <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入数据源--> <property name="dataSource" ref="c3p0DataSource" /> </bean> </beans>
可以使用<property>注入,也可以用<constructor-arg>注入。
3、使用JdbcTemplate
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml"); //获取JdbcTemplate JdbcTemplate jdbcTemplate=applicationContext.getBean("jdbcTemplate", JdbcTemplate.class); String sql="select name from student_tb where id = 1"; String name=jdbcTemplate.queryForObject(sql,String.class); System.out.println(name);
从properties文件读取数据库配置
把数据库的连接信息写在spring配置文件中,修改起来很麻烦。
通常把数据库的配置信息单独写在一个properties文件中,然后在xml中引入properties配置文件。
src下新建db.properties:
#dbcp数据源配置
dbcp_driverClassName=com.mysql.cj.jdbc.Driver
dbcp_url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
dbcp_username=chy
dbcp_password=abcd
dbcp_initialSize=15
dbcp_maxTotal=30
dbcp_minIdle=2
dbcp_maxIdle=10
#c3p0数据源配置
#......
注意key不能使用关键字。
xml配置:
<?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.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 引入properties配置文件 --> <context:property-placeholder location="db.properties" /> <!-- dbcp --> <bean name="dbcpDataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${dbcp_driverClassName}" /> <property name="url" value="${dbcp_url}" /> <property name="username" value="${dbcp_username}" /> <property name="password" value="${dbcp_password}" /> <property name="initialSize" value="${dbcp_initialSize}" /> <property name="maxTotal" value="${dbcp_maxTotal}" /> <property name="minIdle" value="${dbcp_minIdle}" /> <property name="maxIdle" value="${dbcp_maxIdle}" /> </bean> <!--配置JdbcTemplate--> <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入数据源--> <property name="dataSource" ref="dbcpDataSource" /> </bean> </beans>
以${key}的方式引用对应的value。
引入properties配置文件的2种方式
-
方式一(推荐)
<context:property-placeholder location="db.properties" />
<!-- 有多个properties文件时,逗号分隔即可--> <context:property-placeholder location="1.properties,2.properties" />
-
方式二
<!-- bean的name不是必需的 --> <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="location" value="db.properties" /> </bean>
<!-- 引入多个properties文件 --> <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="locations"> <list> <value>db1.properties</value> <value>db2.properties</value> </list> </property> </bean>
使用JdbcTemplate构建dao层
接口:
public interface UserDao { public String queryNameById(int id); //其它方法 //..... }
方式一
将JdbcTemplate作为成员变量,并提供对应的setter方法用于注入依赖:
@Repository("userDaoImpl") public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public String queryNameById(int id) { String sql = "select name from user_tb where id=?"; String name = jdbcTemplate.queryForObject(sql, String.class, id); return name; } //其它方法的实现 //...... }
JdbcTemplate要作为依赖注入,需要在xml中配置JdbcTemplate:
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源-->
<property name="dataSource" ref="dbcpDataSource" />
</bean>
方式二
继承JdbcDaoSupport:
public class UserDaoImpl extends JdbcDaoSupport implements UserDao { @Override public String queryNameById(int id) { String sql = "select name from user_tb where id=?"; //调用基类JdbcDaoSupport中的方法获取JdbcTemplate JdbcTemplate jdbcTemplate = super.getJdbcTemplate(); String name = jdbcTemplate.queryForObject(sql, String.class, id); return name; } //其它方法的实现 //...... }
JdbcDaoSupport类需要注入一个DataSource类型的依赖,继承了JdbcDaoSupport自然也需要在xml中注入依赖:
<bean name="userDaoImpl" class="com.chy.dao.UserDaoImpl"> <!--注入数据源--> <property name="dataSource" ref="dbcpDataSource" /> </bean>
注入数据源后,JdbcDaoSupport会自动创建JdbcTemplate的实例,我们直接 super.getJdbcTemplate() 获取JdbcTemplate即可,不用在xml中配置JdbcTemplate。
相关文章
- Spring Boot中Spring data注解的使用
- [Java][Spring]Spring事务不起作用 问题汇总
- spring batch(二):核心部分(1):配置Spring batch
- 注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩...
- 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题
- 《Spring攻略(第2版)》——1.3 调用构造程序创建Bean
- 基于Spring Boot + MyBatis + MySQL + Redis + FreeMarker而设计开发的问答网站【100010424】
- Spring中资源的加载ResourceLoader
- spring aop使用,spring aop注解,Spring切面编程
- SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
- 面试准备——spring面试题
- Spring Cloud服务注册-Eureka介绍和部署
- spring mvc环境值参数传递的方式(三)
- mvn打包spring工程成jar时报Unable to locate Spring NamespaceHandler for XML schema namespace错误解决办法
- 【spring mvc】Spring MVC 的参数解析器ArgumentResolver阐述
- Spring Boot @Autowired 没法自动注入的问题
- Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用--转载
- 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享
- spring应用中多次读取http post方法中的流(附源码)
- mybatis配置多数据源(利用spring的AbstractRoutingDataSource)