spring知识七------对JDBC的支持
来源:互联网 发布:c语言中的float 编辑:程序博客网 时间:2024/06/06 11:01
概述
spring框架也是集成了对JDBC数据库的操作,但是要明白的是spring对JDBC的支持只是一个简单的封装,而不是真正意义上的ORM框架,其中最主要的就是Spring对数据库的操作不支持级联操作,即对于存在外键关联的表,查询数据时,不会连带查询。但是spring新增了对数据库源文件的配置,这个可以说是简化了对数据源的连接。一般情况下我们都会在spring容器管理的基础上集成Hibernate框架或者ibatis框架。
spring框架对数据库的封装分为两个模板JdbcTemplate 和NamedParameterJdbcTemplate。其中最主要的区别就是NamedParameterJdbcTemplate可以使用具名参数。
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定。 具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。具名参数只在 NamedParameterJdbcTemplate 中得到了支持 。
JdbcTemplate
首先我们需要在配置文件中添加我们所需要的配置文件。
可以看出我们所需要的类是在【org.springframework.jdbc.core】包中
<!-- 配置jdbc模板 JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" > <property name="dataSource" value="#{datasource}"></property> </bean>
当我们配置好文件时,我们就可以进行对数据库的增删改查了。在这里一定要注意方法的调用。
在查询时,我们要记得新增POJO类,让其返回为一个对象,而且要注意使用sql语句的别名与POJO类变量发生一一映射。
不支持级联查询,如果一个类中包含了另外一个类变量,则会返回【null 】值。
RowMapper接口 指定如何去映射结果集的行,常用 的实现类是BeanPropertyRowMapper。
JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中。
@Test //单条记录更新 update(String sql, Object... args) public void testUpdateSingle(){ String sql = "Update employ set name=? where id=?"; jdbcTemplate.update(sql, "fafa",5); } @Test //批量更新 batchUpdate(String sql, List<Object[]> batchArgs) /* 注意最后一个参数batchArgs为Object[]的List 类型: 修改一条记录需要一个Object的数组,修改多条记录需要多个Object的数组,,批量修改则是存放在List中 */ public void testUpdateBatch(){ String sql = "insert into employ(name,age,sex,departid) values(?,?,?,?)"; List<Object[]> batchArgs =new ArrayList<Object[]>(); batchArgs.add(new Object[]{"AA",15,"男",1}); batchArgs.add(new Object[]{"BB",18,"女",2}); batchArgs.add(new Object[]{"CC",22,"男",1}); jdbcTemplate.batchUpdate(sql, batchArgs); } @Test /* * 从数据库中获取一条记录就是对应的一个对象 * RowMapper接口 指定如何去映射结果集的行,常用 的实现类是BeanPropertyRowMapper * 在sql语句中使用别名完成列名与类的属性名的映射。last_name lastName * 不支持级联属性的查询,JdbcTemplate 只是简单的封装jdbc,不是ORM 框架 * * queryForObject(String sql, RowMapper<Employ> rowMapper, Object... args) */ public void testQueryObject(){ String sql="select id,last_name lastName,age,sex,departid from employ where id=?"; RowMapper<Employ> rowmapper = new BeanPropertyRowMapper(Employ.class); Employ emp = jdbcTemplate.queryForObject(sql, rowmapper,1); System.out.println(emp); } @Test //查询实体类集合,query(String sql, RowMapper<Employ> rowMapper, Object... args) public void testQueryList(){ String sql = "select id,last_name lastName,age,sex,departid from employ where id>?"; RowMapper<Employ> rowMapper = new BeanPropertyRowMapper(Employ.class); List<Employ> query = jdbcTemplate.query(sql, rowMapper,5); System.out.println(query); }
JdbcDaoSupport
一般在项目中我们在持久层对数据库进行操作,
Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. JdbcDaoSupport 类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建。但是不建议这样使用,因为这样的使用,在我们利用注解的时候,需要我们手工导入dataSource或者jdbcTemplate。
在xml中我们可以通过配置文件进行注入dataSource和jdbcTemplate。而在注解时,没有办法自动注入,因为在这里JdbcDaoSupport对于Set的方法是Final的,不能够被重写,只能利用曲线救国。在我们自定义的方法中进行调用,然后设置dataSource或者jdbcTemplate。下面是代码演示,建议使用第二种方式。
// 在基于注解的时候,不推荐使用JdbcDaoSupport进行工作,而是在dao层引入JdbcTemplate作为其类成员变量@Repositorypublic class DepartDAO extends JdbcDaoSupport {// 在继承spring的JdbcDaoSupport 时,//利用注解时要注意引入一个dateSource或者JdbcTemplate 在此类中,否则会进行报错 利用setter方法进行引入/* @Autowired public void SetterDatasource2(DataSource dataSource){ setDataSource(dataSource); }*/ @Autowired public void SetterJdbcTeplate2(JdbcTemplate jdbcTemplate){ setJdbcTemplate(jdbcTemplate); } public Depart get(int id){ String sql = "select id,name,people_count peopleCount from depart where id=?"; RowMapper<Depart> rowMapper = new BeanPropertyRowMapper(Depart.class); return depart; }}// 推荐使用这个模式@Repositorypublic class EmployDAO { @Autowired private JdbcTemplate jdbcTemplate; public Employ findEmploy(int id){ String sql="select id,last_name lastName,age,sex,departid from employ where id=?"; RowMapper<Employ> rowmapper = new BeanPropertyRowMapper(Employ.class); Employ emp = jdbcTemplate.queryForObject(sql, rowmapper,id); return emp; }}
NamedParameterJdbcTemplate
首先我们需要在配置文件中添加我们所需要的配置文件。
可以看出我们所需要的类是在【org.springframework.jdbc.core】包中
NamedParameterJdbcTemplate没有无参的构造器,所以利用一个有参的构造器将DataSource传递进去
<!-- 配置 jdbc模板NamedParameterJdbcTemplate 该对象可以使用具名参数 --> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="datasource"></constructor-arg> </bean>
对于NamedParameterJdbcTemplate的使用有两种方式
方式一是简单的起参数名称
方式二是将参数名称与我们的pojo类字段名称一致
@Test // 使用namedParameterJdbcTemplate模板进行操作数据库,可以使用具名参数,对于数据的封装我们放到map中 /* 方式一 *可以为参数取名字,如果有对个参数的话,可以省略对位置的麻烦,直接对应参数名就可以了,便于维护 *但是就是比较麻烦,需要使用map进行数据封装 * *update(String sql, Map<String, ?> paramMap) */ public void testnamedParameterJdbcTemplate(){ String sql ="insert into depart (name,people_count) values(:ln,:count)"; Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("ln", "ff"); paramMap.put("count", 7); namedParameterJdbcTemplate.update(sql, paramMap); } @Test // 使用namedParameterJdbcTemplate模板进行操作数据库,可以使用具名参数 /* 方式二 *可以为参数取名字,如果使参数名字与我们类中的字段名称相对应的话,我们可以进行传递类对象 *update(String sql, SqlParameterSource paramSource) */ public void testnamedParameterJdbcTemplate02(){ String sql ="insert into depart (name,people_count) values(:name,:peopleCount)"; Depart depart = new Depart(); depart.setName("太极"); depart.setPeopleCount(6); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(depart); namedParameterJdbcTemplate.update(sql, paramSource); }
源码不再单独上传到博客资源,不容易通过,后期会发出百度云链接或者源码Github地址:
https://github.com/wangfa1994/SpringLearning/tree/spring006
- spring知识七------对JDBC的支持
- Spring对JDBC的支持
- Spring对JDBC的支持
- Spring对JDBC的支持
- spring对JDBC的支持
- Spring对jdbc的支持
- Spring对JDBC的支持
- Spring对jdbc的支持。
- Spring对JDBC的支持
- Spring对Jdbc的支持
- Spring对JDBC的支持
- spring对jdbc的支持
- Spring 对JDBC的支持
- spring 对jdbc的支持
- spring对JDBC的支持
- Spring对JDBC的支持
- spring对JDBC的支持
- Spring对jdbc的支持
- Ibatis 框架的基本介绍及基础操作
- 清华 2012 求1和2的个数
- HDU1175
- AOJ803魔方
- Codeforces Problem 778B 拆位做法
- spring知识七------对JDBC的支持
- 树莓派 开始的配置
- JVM加载class文件的原理机制
- 打造氚云PaaS智慧服务 社区+智能客服同步上线
- Cucumber测试框架应用介绍--黄瓜框架
- 一步一步学MySQL----4 表的创建与删除
- apple 产品鉴定
- 《快学Scala》习题详解 第3章 数组
- QT小程序:利用QGraphicsScene和QGraphicsView进行显示操作