Spring框架——JDBC

Spring与JDBC

数据库配置

在beans.xml配置jdbc数据库

	<!-- 数据源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/mytest_db</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value></value>
		</property>
	</bean>

JdbcTemplate

功能

JdbcTemplate类是Spring对JDBC支持类库中的核心类

  • 创建和释放资源
  • 执行SQL语句、存储过程,并通过ResultSet来返回数据

在beans.xml配置

将dataSource依赖注入jdbcTemplate,指定执行操作的数据库

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

用法

  1. 增删改
this.jdbcTemplate.update("insert into book(title,price) values(?,?)", book.getTitle(),book.getPrice());
  1. 返回自增值的增删改
		final String sql = "insert into book(title,price) values(?,?)";
		KeyHolder keyHolder = new GeneratedKeyHolder();
		this.jdbcTemplate.update(new PreparedStatementCreator() {
			
			@Override
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				pstm.setString(1, book.getTitle());
				pstm.setInt(2, book.getPrice());
				return pstm;
			}
		}, keyHolder);
		int key = keyHolder.getKey().intValue();
		System.out.println(key);
  1. 批处理
		final String sql = "delete from book where id = ?";
		this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
			
			@Override
			public void setValues(PreparedStatement pstm, int index) throws SQLException {
				pstm.setInt(1, ids[index]);
			}
			
			@Override
			public int getBatchSize() {
				return ids.length;
			}
		});
  1. 查询

在Dao类中使用

@Repository

允许组件扫描来发现和配置自定义DAO
在类中配置该注解表示数据持久层

@Resource

持久化源,数据源DataSource
依赖注入,获取JdbcTemplate

@Repository
public class BookDaoImpl {
	
	@Resource
	private JdbcTemplate jdbcTemplate;
	
	public List<String> find(){
		return this.jdbcTemplate.queryForList("select name from menu", String.class);
	}
	
	public List<Menu> findAll(){
		return this.jdbcTemplate.query("select * from menu", new RowMapper<Menu>() {
					public Menu mapRow(ResultSet rs, int rowNum) throws SQLException{
						Menu m = new Menu();
						m.setId(rs.getInt(1));
						m.setName(rs.getString(2));
						m.setParentId(rs.getInt(3));
						return m;
					}
				});
	}
	
	public Menu findById(int id) {
		return this.jdbcTemplate.queryForObject("select * from menu where id = ?",
				new Object[] {id},
				new RowMapper<Menu>() {
					public Menu mapRow(ResultSet rs, int rowNum) throws SQLException{
						Menu m = new Menu();
						m.setId(rs.getInt(1));
						m.setName(rs.getString(2));
						m.setParentId(rs.getInt(3));
						return m;
					}
				});
	}
	
	
	public int countParentIdNull() {
		int count = this.jdbcTemplate.queryForObject("select count(id) from menu where parentId is not null", Integer.class);
		return count;
	}
	
	public void saveBook(Book book) {
		this.jdbcTemplate.update("insert into book(title,price) values(?,?)", 
				book.getTitle(), book.getPrice());
		final String sql = "insert into book(title,price) values(?,?)";
		KeyHolder keyHolder = new GeneratedKeyHolder();
		this.jdbcTemplate.update(new PreparedStatementCreator() {
			
			@Override
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				pstm.setString(1, book.getTitle());
				pstm.setInt(2, book.getPrice());
				return pstm;
			}
		}, keyHolder);
		int key = keyHolder.getKey().intValue();
		System.out.println(key);
		
	}
	
	public void batchDelete(int[] ids) {
		final String sql = "delete from book where id = ?";
		this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
			
			@Override
			public void setValues(PreparedStatement pstm, int index) throws SQLException {
				pstm.setInt(1, ids[index]);
			}
			
			@Override
			public int getBatchSize() {
				return ids.length;
			}
		});
	}

}

在Service类中

@Service

在类中配置该注解表示业务逻辑层

@Resource

依赖注入,将Dao依赖注入进Service,获取Dao

@Service
public class BookServiceImpl {
	
	@Resource
	private BookDaoImpl bookDaoImpl;
	
	public void addBook(Book book) {
		this.bookDaoImpl.saveBook(book);
	}
	
	public void batchDelete(int[] ids) {
		this.bookDaoImpl.batchDelete(ids);
	}
	
	public int count() {
		return this.bookDaoImpl.countParentIdNull();
	}
	
	public Menu findById(int id) {
		return this.bookDaoImpl.findById(id);
	}
	
	public List<Menu> findAll(){
		return this.bookDaoImpl.findAll();
	}
	
	public List<String> find(){
		return this.bookDaoImpl.find();
	}

}

Spring与事务

概念

事务是一组原子操作的工作单元

  • 原子性(Atomic)

事务由一个或多个行为捆绑在一起组成一个单独的工作单元,原子性保证事务中的所有操作要么都发生,要么都不发生

  • 一致性(Consistent)

一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的,也就是说数据应当不会被破坏

  • 隔离性(Isolated)

事务应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作相混淆(隔离级别)

  • 持久性(Durable)

一旦事务完成,事务的结果应该持久化,用来保证即使系统崩溃也不会破坏事务的结果

Spring框架提供了编程式事务管理声明式事务管理

编程式事务

  1. 可以清楚地控制事务的边界
  2. 可自行实现事务开始时间、结束时间、撤消操作的时机等
  3. 可以实现细粒度的事务控制

beans.xml

	<!-- 事务 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

声明式事务

  1. 事务管理的API不介入程序,最符合一个非侵入型轻量级容器的理想
  2. Spring Framework的声明式事务管理是建立在Spring的面向切面编程(aspect-oriented programming, AOP) 上的
  3. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分
posted @ 2020-08-28 19:13  不爱学习的小策  阅读(245)  评论(0编辑  收藏  举报