zoukankan      html  css  js  c++  java
  • 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和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分
  • 相关阅读:
    字符编码ANSI和ASCII区别、Unicode和UTF-8区别
    《非暴力沟通》读后感
    软件测试
    报表导出测试点
    如何设计测试用例
    国密算法sm2.sm3.sm4
    免杀原理与实践
    SQL注入攻击
    网络攻防实践 第十周作业
    网络攻防实践第九周
  • 原文地址:https://www.cnblogs.com/occlive/p/13579527.html
Copyright © 2011-2022 走看看