Spring JDBC是Spring所提供的持久层技术,它的主要目的降低JDBC API的使用难度,以一种更直接、更简洁的方式使用JDBC API。
Spring JDBC中,仅仅需要做那些和业务相关的DML操作的事儿而将获取资源、Statement创建、释放资源以及异常处理等繁杂乏味的工作交给Spring JDBC.
1. 导包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
2. 核心配置文件 applicationContext.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 使用注解驱动 自动注册bean -->
<context:component-scan base-package="cn.jq.springdemo"></context:component-scan>
<!-- 导入资源属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0 连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 类似EL表达式取资源文件的值 -->
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="initialPoolSize" value="${c3p0.initialPoolSize}"></property>
<property name="acquireIncrement" value="${c3p0.acquireIncrement}"></property>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"></property>
<property name="minPoolSize" value="${c3p0.minPoolSize}"></property>
<property name="maxStatements" value="${c3p0.maxStatements}"></property>
<property name="maxStatementsPerConnection" value="${c3p0.maxStatementsPerConnection}"></property>
</bean>
<!-- 配置spring的jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
3. 测试类
jdbcTemplate对象的调用方法查看
1) 增删改 都使用 update 方法
@Test
public void test() throws SQLException {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取jdbcTemplate对象
JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
//增删改
String sql = "insert into t_user(username,password) values(?,?)";
jdbcTemplate.update(sql, "lisi","lisi123");
String sql2 = "update t_user set password=? where id=?";
jdbcTemplate.update(sql2, "123456",3);
String sql3 = "delete from t_user where id=3";
jdbcTemplate.update(sql3);
}
2) 查询一条数据, 返回值为对应对象的集合
@Test
public void test() throws SQLException {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取jdbcTemplate对象
JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
String sql = "select * from t_user where id=?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject(sql, rowMapper,1);
System.out.println(user);
}
3)查询多条数据,返回值为map的集合
@Test
public void test() throws SQLException {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取jdbcTemplate对象
JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
//查询多条数据,
String sql = "select * from t_user where id>?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
//List<User> userlist = jdbcTemplate.query(sql,rowMapper,0); //自动映射成对象List集合
List<Map<String, Object>> userlist = jdbcTemplate.queryForList(sql,0);//自动映射成多个Map对象
System.out.println(userlist);//[{id=1, username=admin, password=admin123}, {id=2, username=lisi, password=lisi123}]
//自动映射成单个Map对象, 多个会报错
String sql2 = "select * from t_user where id=?";
Map<String, Object> usermap = jdbcTemplate.queryForMap(sql2,1);
System.out.println(usermap);//{id=1, username=admin, password=admin123}
)
4) 查询一个值,如:某列的一个值,总条数
@Test
public void test() throws SQLException {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取jdbcTemplate对象
JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
//查询一个值,如:某列的一个值,总条数
String sql = "select count(id) from t_user";
Long count = jdbcTemplate.queryForObject(sql, Long.class); //返回值类型的大CLass
System.out.println(count); //2
}
二, 项目中使用
Dao 类中 注入 jdbcTemplate, 或者写一个util类 提供static方法,通过类名.方法名访问,
@Repository("userDao")
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
public User getUser(int id) {
String sql = "select * from t_user where id=?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject(sql, rowMapper,id);
return user;
}
}
测试类 访问DAO类
@Test
public void test() throws SQLException {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
User user = userDao.getUser(1);
System.out.println(user);//User [id=1, username=admin, password=admin123]
}
参考文章: https://blog.csdn.net/yangshangwei/article/details/78119011?locationNum=1&fps=1