Spring-JDBC-3
来源:互联网 发布:走好网络群众路线 编辑:程序博客网 时间:2024/06/08 15:12
- 一 JDBC Template
- 1 简介
- 2 用sql语句和参数更新数据库
- 1 update添加删除修改
- 2 batchUpdate 批量更新数据库
- 3 查询单行 queryForObject
- 4 便利的BeanPropertyRowMapper实现
- 3 示例代码
- 4 简化JDBC模块查询
- 1 开发中使用JDBCTemplate
- 2 开发中使用JDBCDaoSupport不推荐使用
- 5 具名参数
- 一 JDBC Template
一. JDBC Template
1. 简介
为了使JDBC
更加易于使用,Spring
在JDBC API
上定义了一个抽象层
,以此建立一个JDBC存取框架。
作为Spring JDBC
框架的核心,JDBC模板
的设计目的是为不同类型的JDBC
操作提供模板方法。
每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务。
通过这种方式,可以在尽可能保证灵活性的情况下,
将数据库的存取的工作量降到最低。
2. 用sql语句和参数更新数据库
2.1 update(添加,删除,修改)
public int update(String sql,Object... args) throws DataAccessException
2.2 batchUpdate 批量更新数据库
public int[] batchUpdate(String sql,List<Object[]> batchArgs)
2.3 查询单行 queryForObject
public <T> T queryForObject(String sql,ParameterizedRowMapping<T> rm,Object... args) throws DataAccessException
2.4 便利的BeanPropertyRowMapper实现
org.springframework.jdbc.core.simple Class ParameterizedRowMapper<T>
java.lang.Object org.springframework.jdbc.core.BeanPropertyRowMapperorg.springframework.jdbc.core.simple.ParameterizedRowMapper<T>
3. 示例代码
xml配置代码
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 导入资源文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置c3p0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!-- 配置Spring的Jdbc Template --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean></beans>
Java代码
public class JDBCTest { private ApplicationContext ctx=null; private JdbcTemplate jdbcTemplate; { ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); jdbcTemplate=(JdbcTemplate)ctx.getBean("jdbcTemplate"); } @Test public void testDataSource() throws SQLException{ DataSource dataSource=ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } /** * 执行INSERT,UPDATE,DELETE */ @Test public void testUpdate(){ String sql="UPDATE employees SET last_name=? WHERE id=?"; jdbcTemplate.update(sql, "Jack",5); } /** * 执行批量更新(INSERT,UPDATE,DELETE) * 最后一个参数是Object[]的List类型 * 因为修改一条记录需要一个Object[]数组 * 那么修改多条记录就需要多个Object[]数组,也就是一个集合 */ @Test public void testBatchUpdate(){ String sql="INSERT INTO employees(last_name,email,dept_id) VALUES (?,?,?)"; List<Object[]> batchArgs=new ArrayList<>(); batchArgs.add(new Object[]{"AA","aa@atguigu.com",1}); batchArgs.add(new Object[]{"BB","bb@atguigu.com",2}); batchArgs.add(new Object[]{"CC","cc@atguigu.com",3}); batchArgs.add(new Object[]{"DD","dd@atguigu.com",3}); batchArgs.add(new Object[]{"EE","ee@atguigu.com",2}); jdbcTemplate.batchUpdate(sql, batchArgs); } /** * 从数据库中获取一条记录,实际得到对应的一个对象 * 注意不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! * 而需要调用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) * 1. 其中的RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper * 2. 使用SQL中列的别名完成列名和类的属性名的映射。例如 last_name lastName * 3. 不支持级联属性,JdbcTemplate到底是一个JDBC的小工具,而不是orm框架。 * dept_id as \"department.id\"不好使 */ @Test public void testQueryForObject(){ String sql = "SELECT id,last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE id = ?"; RowMapper<Employee> rowMapper =new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(employee); } /** * 查到实体类的集合 * 注意调用的不是queryForList方法 */ @Test public void testQueryForList(){ String sql = "SELECT id,last_name lastName,email FROM employees WHERE id > ?"; RowMapper<Employee> rowMapper =new BeanPropertyRowMapper<>(Employee.class); List<Employee> employees=jdbcTemplate.query(sql, rowMapper,3); System.out.println(employees); } /** * 获取单个列的值,或做统计查询 * 使用queryForObject(String sql, Class<Long> requiredType) */ @Test public void testQueryForObject2(){ String sql = "SELECT count(id) FROM employees"; long count=jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count); }}
4. 简化JDBC模块查询
每次使用都创建一个JdbcTemplate
的新实例,这种做法效率很低下。
JdbcTemplate
类被设计成为线程安全的,
所以可以在IOC容器中声明它的单个实例
并将这个实例注入到所有的DAO实例中。
JdbcTemplate
也利用了Java 1.5
的特点(自动装箱,泛型,可变长度)来简化开发。
String JDBC
框架还提供了一个JdbcDaoSupport
类来简化DAO
实现。
该类声明了jdbcTemplate
属性,它可以从IOC容器中注入,或者自动从数据源中创建。不推荐使用
4.1 开发中使用JDBCTemplate
JdbcTemplate就是JDBC,跟以前用JdbcUtil的方法感觉上是相似的。
关于JdbcTemplate
的在xml
当中的配置,上面的代码也已经说了。
下面用一个思维导图来帮助理解:
xml配置文件代码
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 自动扫描的包 --> <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan> <!-- 导入资源文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置c3p0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!-- 配置Spring的Jdbc Template --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean></beans>
Dao类代码
@Repositorypublic class EmployeeDao { @Autowired private JdbcTemplate jdbcTemplate; public Employee get(Integer id){ String sql = "SELECT id,last_name lastName,email FROM employees WHERE id = ?"; RowMapper<Employee> rowMapper =new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); return employee; }}
测试代码
public class JDBCTest { private ApplicationContext ctx=null; private JdbcTemplate jdbcTemplate; private EmployeeDao employeeDao; { ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); jdbcTemplate=(JdbcTemplate)ctx.getBean("jdbcTemplate"); employeeDao = ctx.getBean(EmployeeDao.class); } @Test public void testEmployeeDao(){ System.out.println(employeeDao.get(1)); }
4.2 开发中使用JDBCDaoSupport(不推荐使用)
xml的配置代码和测试代码和上面是大同小异的。直接给出使用JdbcDaoSupport的Dao类的代码。
/** * 不推荐使用JdbcDaoSupport,而推荐直接使用JdbcTemplate作为Dao类的成员变量。 * @author Hank * */@Repositorypublic class DepartmentDao extends JdbcDaoSupport{ @Autowired public void setDataSource2(DataSource dataSource){ setDataSource(dataSource); } public Department get(Integer id){ String sql="selcet id,dept_name name from departments where id=?"; RowMapper<Department> rowMapper=new BeanPropertyRowMapper<>(Department.class); return getJdbcTemplate().queryForObject(sql, rowMapper,id); }}
5. 具名参数
在经典的JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制.
定位参数的问题在于,一旦参数的顺序发生变化,就必须改变参数绑定.
在Spring JDBC框架中,绑定SQL参数的另一种选择是使用具名参数(named parameter)
具名参数: SQL按名称(以冒号开头)而不是按位置进行指定
具名参数更易于维护,也提升了可读性.
具名参数在运行时由框架类用占位符取代.
具名参数只在NamedParameterJdbcTemplate
中得到支持.
xml配置代码
<!-- 配置NamedParameterJdbcTemplate,该对象可以使用具名参数, 其没有无参数构造器,所以必须为其构造器指定参数 --> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>
测试代码
public class JDBCTest { private NamedParameterJdbcTemplate namedParameterJdbcTemplate; { namedParameterJdbcTemplate = ctx.getBean(NamedParameterJdbcTemplate.class); } /** *可以为参数取名字. *1.好处: 若有多个参数,则不用再去对应位置,直接对应参数名,便于维护 *2.缺点: 较为麻烦 */ @Test public void testNamedParameterJdbcTemplate(){ String sql="insert into employees(last_name,email,dept_id) values(:last_name,:email,:dept_id)"; Map<String, Object> paramMap=new HashMap<>(); paramMap.put("last_name", "FF"); paramMap.put("email", "123@163.com"); paramMap.put("dept_id", 2); namedParameterJdbcTemplate.update(sql, paramMap); } /** * 使用具名参数的时候,可以使用 update(String sql, SqlParameterSource paramSource) 方法进行操作 * * 1. SQL 语句中的参数名和类中的属性名一致。 * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数 */ @Test public void testNamedParameterJdbcTemplate2(){ String sql="insert into employees(last_name,email,dept_id) values(:last_name,:email,:dept_id)"; Employee employee=new Employee(); employee.setLastName("FF"); employee.setEmail("123@163.com"); employee.setDeptId(2); SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee); namedParameterJdbcTemplate.update(sql, paramSource); }}
- 使用Spring Jdbc (3)
- Spring-JDBC-3
- Spring研究 (3) 使用JDBC
- Spring JDBC最佳实践(3)
- 3、spring之jdbc 应用
- 学习笔记3:Struts2+Spring JDBC+Spring
- Spring JDBC
- spring+JDBC
- Spring JDBC
- spring + jdbc
- Spring JDBC
- spring+jdbc
- spring+jdbc
- Spring JDBC
- Spring JDBC
- Spring JDBC
- Spring JDBC
- spring+jdbc
- UVA12511
- ActionBar、TitleBar、ToolBar的联系和区别
- Bug生命周期
- 傅盛认知三部曲之一:所谓成长就是认知升级
- UML9种图(1)
- Spring-JDBC-3
- 几种线程池的实现算法分析
- C++中的宏
- 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
- HTML基础学习-18- div css容器 盒子模型学习1
- Listview优化
- 母函数总结
- 名字的漂亮度
- Qt槽机制及简单规则