JdbcTemplate的概述和入门
package cn.luis.jdbctemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class Demo1 {
public static void main(String[] args) {
// 准备数据源
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///eesy");
dataSource.setUsername("root");
dataSource.setPassword("root");
// 创建对象
JdbcTemplate jt = new JdbcTemplate();
// 给jt设置数据源 【在创建对象时传入也可】
jt.setDataSource(dataSource);
// 执行操作
jt.execute("insert into account(name,money)values('ccc',1000)");
}
}
JdbcTemplate在IOC中使用
package cn.luis.jdbctemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class Demo2 {
public static void main(String[] args) {
// 创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
// 获取对象
JdbcTemplate jt = ac.getBean("jdbcTemplate",JdbcTemplate.class);
// 执行操作
jt.execute("insert into account(name,money)values('ddd',2000)");
}
}
配置文件
<?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 id="accountDao" class="cn.luis.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
<!--JdbcDaoSupport里面自动生成JDBCTemplate-->
<!-- <property name="dataSource" ref="dataSource"></property>-->
</bean>
<!--配置JDBCTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>
JdbcTemplate的CRUD操作
在查询时我们自己创建了 AccountRowMapper
类 实现了RowMapper<>
接口,它的作用就是,一个把结果集的数据封装到Account中,由Spring将每个account添加到集合中
-
Spring提供了一个:
new BeanPropertyRowMapper<T>()
实现T:就是我们要封装的类型,参数就是字节码文件,填入之后即可实现相同作用。
-
聚合函数的第二个参数类型:Integer、Long均可。
Long count = jt.queryForObject("select count(*) from account where money > ?", Long.class, 1000f);
代码:
package cn.luis.jdbctemplate;
import cn.luis.domian.Account;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* JdbcTemplate的CRUD操作
* @author L
*/
public class Demo3 {
public static void main(String[] args) {
// 1.创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
// 2.获取对象
JdbcTemplate jt = ac.getBean("jdbcTemplate",JdbcTemplate.class);
// 3.执行操作
// 3.1保存
//jt.update("insert into account(name,money)values(?,?)","eee",3000F);
// 3.2更新
//jt.update("update account set name=?,money=? where id=?","test",4567,5);
// 3.3删除
//jt.update("delete from account where id = ?",5);
// 3.4查询所有[RowMapper接口]
//List<Account> accounts = jt.query("select * from account where money > ?", new AccountRowMapper(), 1000);
// 由spring提供的new BeanPropertyRowMapper
/*List<Account> accounts = jt.query("select * from account where money > ?", new BeanPropertyRowMapper<Account>(Account.class), 1000);
for (Account account : accounts) {
System.out.println(account);
}*/
// 3.5查询一个
//List<Account> accounts1 = jt.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), 6);
//System.out.println(accounts1.isEmpty() ? "没有内容" : accounts1.get(0));
// 3.6查询返回一行一列(聚合函数)【三个参数:第二个参数代表返回值类型】
Long count = jt.queryForObject("select count(*) from account where money > ?", Long.class, 1000f);
System.out.println(count);
}
}
/**
* 定义Account的封装策略 【3.4查询所有】
*/
class AccountRowMapper implements RowMapper<Account>{
/**
* 把结果集的数据封装到Account中,由Spring将每个account添加到集合中
* @param rs
* @param rowNum
* @return
* @throws SQLException
*/
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
return account;
}
}
将CRUD操作写到Dao层实现类中
package cn.luis.dao.impl;
import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
/**
* @ClassName IAccountDaoImpl
* @Description 账户的持久层实现类
* @Author L
* @Date 2020.04.05 21:46
* @Version 1.0
* @Remark TODO
**/
public class AccountDaoImpl implements IAccountDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public Account findAccountById(Integer accountId) {
List<Account> accounts = jdbcTemplate.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), accountId);
return accounts.isEmpty() ? null : accounts.get(0);
}
@Override
public Account findAccountByName(String accountName) {
List<Account> accounts = jdbcTemplate.query("select * from accont where name = ?", new BeanPropertyRowMapper<Account>(Account.class), accountName);
if (accountName.isEmpty()) {
return null;
}
if (accounts.size() > 1) {
throw new RuntimeException("结果集不唯一");
}
return accounts.get(0);
}
@Override
public void updateAccount(Account account) {
jdbcTemplate.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
}
}
测试类
package cn.luis.jdbctemplate;
import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* JdbcTemplate在spring的ioc中使用
* @author L
*/
public class Demo4 {
public static void main(String[] args) {
//1.获取容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.获取对象
IAccountDao accountDao = ac.getBean("accountDao", IAccountDao.class);
Account account = accountDao.findAccountById(1);
System.out.println(account);
account.setMoney(30000f);
accountDao.updateAccount(account);
System.out.println(account);
}
}
JdbcDaoSupport
有两种来源
JdbcDaoSupport
这个类由我们自己写时:spring可以通过xml和注解两种方式配置
-
若继承spring提供的`JdbcDaoSupport`时,我们无法修改jar包中的代码,无法添加注解!
代码:
- 此类用于抽取
dao
中的重复代码
package cn.luis.dao.impl;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
public class JdbcDaoSupport {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setDataSource(DataSource dataSource) {
if(jdbcTemplate == null){
jdbcTemplate = createJdbcTemplate(dataSource);
}
}
private JdbcTemplate createJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
实现类需继承JdbcDaoSupport
extends JdbcDaoSupport
package cn.luis.dao.impl;
import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
/**
* super.getJdbcTemplate()使用父类的
* @param accountId
* @return
*/
@Override
public Account findAccountById(Integer accountId) {
List<Account> accounts = super.getJdbcTemplate().query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), accountId);
return accounts.isEmpty() ? null : accounts.get(0);
}
@Override
public Account findAccountByName(String accountName) {
List<Account> accounts = getJdbcTemplate().query("select * from accont where name = ?", new BeanPropertyRowMapper<Account>(Account.class), accountName);
if (accountName.isEmpty()) {
return null;
}
if (accounts.size() > 1) {
throw new RuntimeException("结果集不唯一");
}
return accounts.get(0);
}
@Override
public void updateAccount(Account account) {
getJdbcTemplate().update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
}
}