Spring学习笔记(四)—Spring的数据库开发

一、Spring JDBC

    spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作。

1、Spring JdbcTemplate的解析

    针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。它继承自抽象类JdbcA从厕所日,同时实现了JdbcOperations接口。同时JdbcAccessor为子类提供了一些访问数据库时使用的公共属性。

    DateSource:其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。

    SQLExceptionTranslator:该接口负责对SQLException进行转译工作。

    JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。

2、Spring JDBC的配置

    Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包).JDBC的配置文件applicationContext.xml中完成,其模板如下:




	
	
		
		
		
		
		
		
		
		
	  
	
	
	
		
		
	     
	
		
		
	 

    上述代码中,定义了3个Bean,分别是dataSource、jdbcTemplate和需要注入类的Bean。定义JdbcTemplate时,需要将dataSource注入到JdbcTemplate中,而其他需要使用JdbcTemplat的Bean,也需要将JdbcTemplate注入到该Bean中。

二、Spring JdbcTemplate的常用方法。

1、execute()

    该方法能完成执行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("创建成功");

	}*/

2、update()

    该方法可以完成插入、更新和删除数据的操作。在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中定义两个方法:

                                    

    实现类中:

Spring学习笔记(四)—Spring的数据库开发_第1张图片

    在上面两个方法代码中,BeanPropertyRowMapper是RowMapper接口的实现类,它可以自动地将数据表中的数据应声道用户自定义的类中。测试代码:

Spring学习笔记(四)—Spring的数据库开发_第2张图片

 

你可能感兴趣的:(学习笔记,spring)