spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作。
针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。它继承自抽象类JdbcA从厕所日,同时实现了JdbcOperations接口。同时JdbcAccessor为子类提供了一些访问数据库时使用的公共属性。
DateSource:其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。
SQLExceptionTranslator:该接口负责对SQLException进行转译工作。
JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包).JDBC的配置文件applicationContext.xml中完成,其模板如下:
上述代码中,定义了3个Bean,分别是dataSource、jdbcTemplate和需要注入类的Bean。定义JdbcTemplate时,需要将dataSource注入到JdbcTemplate中,而其他需要使用JdbcTemplat的Bean,也需要将JdbcTemplate注入到该Bean中。
该方法能完成执行SQL语句的功能,创建项目,在src目录下创建配置文件applicationContext.xml如下:
创建一个jdbc的包,在该保重创建测试类JdbcTemplateTest,在该类的main方法中通过spring容器获取在配置文件中定义的JdbcTemplate实例,然后用到该实例的execute方法执行创建数据表的SQL语句。如下:
/**
* 使用execute()方法创建表
* @param args
*/
/*public static void main(String[] args) {
// TODO Auto-generated method stub
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取jdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//使用execute()方法执行sql语句 创建用户账户管理表
jdbcTemplate.execute("create table account( id int primary key auto_increment,"
+ "username varchar(50),"
+ "balance double)");
System.out.println("创建成功");
}*/
该方法可以完成插入、更新和删除数据的操作。在jdbc包中创建Account类,在该类中定义id,username,balance属性:
public class Account {
private Integer id ; // 账户id
private String username;
private Double balance;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public String toString() {
return "Account [id="+id+",username = "+username+",balance = "+balance+"]";
}
}
AccountDao接口:
public interface AccountDao {
public int addAccount(Account account);
public int updateAccpunt(Account account);
public int deleteAccount(int id);
public Account findAccountById(int id);
public List findAllAccount();
}
AccountDaoImpl类:
public class AccountDaoImpl implements AccountDao {
//声明JdbcTemplate属性
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//添加账户
@Override
public int addAccount(Account account) {
// TODO Auto-generated method stub
String sql = "insert into account(username,balance) value(?,?)";
//定义数组来存储SQL语句中的参数
Object[] obj = new Object[]{account.getUsername(),account.getBalance()};
//执行
int num = this.jdbcTemplate.update(sql,obj);
return num;
}
@Override
public int updateAccpunt(Account account) {
// TODO Auto-generated method stub
String sql = "update account set username = ?,balance = ? where id = ?";
//定义数组来存储sql中的参数
Object[] params = new Object[] {account.getUsername(),account.getBalance(),account.getId()};
//执行
int num = this.jdbcTemplate.update(sql,params);
return num;
}
@Override
public int deleteAccount(int id) {
// TODO Auto-generated method stub
String sql = "delete from account where id = ?";
//执行
int num = this.jdbcTemplate.update(sql,id);
System.out.println(this);
return num;
}
@Override
public Account findAccountById(int id) {
// TODO Auto-generated method stub
String sql = "select * from account where id = ?";
RowMapper rowMapper = new BeanPropertyRowMapper(Account.class);
return this.jdbcTemplate.queryForObject(sql, rowMapper,id);
}
@Override
public List findAllAccount() {
// TODO Auto-generated method stub
String sql = "select * from account";
RowMapper rowMapper = new BeanPropertyRowMapper(Account.class);
return this.jdbcTemplate.query(sql,rowMapper);
}
}
同时在applicationContext.xml中定义一个id为accountDao的Bean,该Bean用于将jdbcTemplate注入到accountDao实例中。
测试方法:
@Test
public void addAccountTest() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取AccountDao实例
AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");
//创建Account对象 并添加数据
Account account = new Account();
account.setUsername("tom");
account.setBalance(1000000D);
//执行addAccount方法
int num = accountDao.addAccount(account);
if(num > 0) {
System.out.println("成功插入"+num+"条数据");
}else {
System.out.println("操作失败");
}
}
其他测试:
@Test
public void updateAccount() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取AccountDao实例
AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");
//创建Account对象 并添加数据
Account account = new Account();
account.setId(1);
account.setUsername("tom");
account.setBalance(2000000D);
int num = accountDao.updateAccpunt(account);
if(num > 0) {
System.out.println("成功更新"+num+"条数据");
}else {
System.out.println("操作失败");
}
}*/
/*@Test
public void delAccount() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取AccountDao实例
AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");
int num = accountDao.deleteAccount(1);
if(num > 0) {
System.out.println("成功删除"+num+"条数据");
}else {
System.out.println("操作失败");
}
}
3、query()
直接上代码,在AccountDao中定义两个方法:
实现类中:
在上面两个方法代码中,BeanPropertyRowMapper是RowMapper接口的实现类,它可以自动地将数据表中的数据应声道用户自定义的类中。测试代码: