spring--使用JDBC(15)

一、JdbcTemplate

    i、为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架.

    ii、作为 Spring JDBC 框架的核心, JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法. 每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务. 通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低.

    1、使用 JdbcTemplate 更新数据库

i、用 sql 语句和参数更新数据库:

        

@Test
	public void testUpdate(){
		String sql="UPDATE employ SET name=? WHERE dept_id=?";
		jdbcTemplate.update(sql,"jack",4);
	}

ii、批量更新数据库: 


/**
	 * 执行批量更新,批量的INSET,DELETE,UPDATE
	 * 最后一个参数是 Object[]的List类型:因为修改一条记录需要一个Object的数组,那么多天不就需要多个Object的数组
	 */
	@Test
	public void testBatchUpdate(){
		String sql="insert into employ(name,email,dept_id)values(?,?,?)";
		ArrayList<Object[]> batchArgs=new ArrayList<Object[]>();
		batchArgs.add(new Object[]{"AA","aa@ww.com",1});
		batchArgs.add(new Object[]{"BB","bb@ww.com",2});
		batchArgs.add(new Object[]{"CC","cc@ww.com",3});
		batchArgs.add(new Object[]{"EE","dd@ww.com",4});
		batchArgs.add(new Object[]{"FF","ee@ww.com",5});
		batchArgs.add(new Object[]{"GG","ff@ww.com",6});
		
		jdbcTemplate.batchUpdate(sql, batchArgs);
	}

                iii、查询单行: 


/**
	 * 从数据库中获取一条记录,实际到达对应的一个对象
	 * 注意补水调用:queryForObject(String sql, Class<Employ> requiredType, Object... args) 方法!
	 * 而需要调用queryForObject(String sql, RowMapper<Employ> rowMapper, Object... args)方法:
	 * 	1、其中的RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper
	 * 	2、使用SQL中列的别名完成列名和属性名的映射,例如name lastname
	 * 	3、不支持级联属性,JdbcTemplate到底是一个JDBC的小工具,而不是ORM框架
	 */
	@Test
	public void testQueryForObject(){
		String sql="select id,name lastname,email from employ where id=?";
		RowMapper<Employ> rowMapper=new BeanPropertyRowMapper<>(Employ.class);
		Employ employ=jdbcTemplate.queryForObject(sql, rowMapper,1);
				System.out.println(employ);
	}

iv、便利的 BeanPropertyRowMapper 实现


v、查询多行:

            

/**
	 *	查到实体类的集合
	 *	调用的不是queryForList
	 */
	 @Test
	 public void testQueryForList(){
		String sql="select id,name lastname,email from employ where id>?";
		RowMapper<Employ> rowMapper=new BeanPropertyRowMapper<>(Employ.class);
		ArrayList<Employ> employ=(ArrayList<Employ>) jdbcTemplate.query(sql, rowMapper,5);
	 
		System.out.println(employ);
	 }

vi、单值查询:

            

/**
	 * 获取单个列的值,或做统计查询
	 */
	@Test
	public void testQueryForObject2(){
		String sql="select count(id) from employ";
		long count=jdbcTemplate.queryForObject(sql, Long.class);
		
		System.out.println(count);
	}

简化 JDBC 模板查询

    1、每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.

    2、JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.

    3、JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发

    4、Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建.

    注入 JDBC 模板示例代码

                

        扩展 JdbcDaoSupport 示例代码

                


                

在 JDBC 模板中使用具名参数

    1、在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 
    2、在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter). 
    3、具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
    4、具名参数只在 NamedParameterJdbcTemplate 中得到支持 

    5、在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键
    6、也可以使用 SqlParameterSource 参数

    7、批量更新时可以提供 Map 或 SqlParameterSource 的数组

                

             


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值