随笔录 之 spring 自学杂记(五) -- JDBC
来源:互联网 发布:webpack配置config.js 编辑:程序博客网 时间:2024/04/29 22:30
Spring Jdbc
JdbcTemplate
Spring JDBC 中的一个辅助类(JdbcTemplate)
是为不同类型的jdbc操作提供模板方法。
个人觉得比较灵活、简单、易用。
类似的有工具有:DButil
一个简单实例
POJO类:
package com.wm.spring.IOC;public class Dept { private int d_id ; private String d_name ; private String d_address ; public int getD_id() { return d_id; } public void setD_id(int d_id) { this.d_id = d_id; } public String getD_name() { return d_name; } public void setD_name(String d_name) { this.d_name = d_name; } public String getD_address() { return d_address; } public void setD_address(String d_address) { this.d_address = d_address; } @Override public String toString() { return "Dept [d_id=" + d_id + ", d_name=" + d_name + ", d_address=" + d_address + "]"; }}
1、首先配置数据源
spring-jdbcTemplate.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd "> <!-- 自动扫描 --> <context:component-scan base-package="com.wm.spring.Jdbc"></context:component-scan> <!-- 导入外部配置文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- c3p0 数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxPoolSize" value="${c3p0.pool.size.max}"></property> <property name="minPoolSize" value="${c3p0.pool.size.min}"></property> <property name="initialPoolSize" value="${c3p0.pool.size.ini}"></property> </bean> <!-- spring jdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean></beans>
用的C3P0数据连接池
jdbc.properties
jdbc.driverClassName = oracle.jdbc.OracleDriverjdbc.url = jdbc:oracle:thin:@10.5.1.50:1521:cddevjdbc.username = base_55demojdbc.password = crm_12345c3p0.pool.size.max=20c3p0.pool.size.min=5c3p0.pool.size.ini=3
一些jdbc的数据库的配置及连接池的配置参数
2、DAO使用jdbcTemplate的一些模板方法
DAO
DeptDAO.java类:
package com.wm.spring.Jdbc.DAO;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import com.wm.spring.IOC.Dept;@Repository // 注册dao beanpublic class DeptDAO { @Autowired private JdbcTemplate jdbcTemplate ; // 这里的模板bean是配置在XML中的 public void insert(){ String sql = "insert into demo_dept(d_id,d_name,d_address) values(?,?,?)"; jdbcTemplate.update(sql, 19,"家宽","成都"); } public void update(){ String sql = "update demo_dept set d_address = ? where d_id = ?"; jdbcTemplate.update(sql, "北京", 8); } public void delete(){ String sql = "delete from demo_dept where d_id = ?"; jdbcTemplate.update(sql, 6); } // 查询所有结果 以对象形式保存 public void query(){ String sql = "select * from demo_dept"; RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class); List<Dept> query = jdbcTemplate.query(sql, rowMapper); for (Dept dept : query) { System.out.println(dept); } } // 查询 以对象形式保存 public void queryDept(){ String sql = "select * from demo_dept where d_id = ?"; // 一个映射关系 结果《--》对象 RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class); Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19); System.out.println(dept); } // 批量 插入,执行更新操作 public void batchUpdate(){ String sql = "insert into demo_dept values(?,?,?)"; List<Object[]> batchArgs = new ArrayList<>(); batchArgs.add(new Object[]{13,"个人","北京"}); batchArgs.add(new Object[]{14,"集团","成都"}); batchArgs.add(new Object[]{15,"互联网","上海"}); jdbcTemplate.batchUpdate(sql, batchArgs); }}
JdbcTemplate主要提供下列方法:
1、execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
2、update方法及batchUpdate方法:
update方法用于执行新增、修改、删除等更新语句;
batchUpdate方法用于执行批处理相关语句;
3、query方法及queryForXXX方法:用于执行查询相关语句;
用RowMapper<T>接口,可以实现查询对象或者对象数组。如:
public void queryDept(){ String sql = "select * from demo_mawei_dept where d_id = ?"; // 接口的实现类 有很多,可以根据实际情况去选择 RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class); Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19); System.out.println(dept); }
3、service层
DeptSV.java类:
package com.wm.spring.Jdbc.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.wm.spring.Jdbc.DAO.DeptDAO;@Servicepublic class DeptSV { @Autowired private DeptDAO dao; //注解自动匹配 public void insert(){ dao.insert(); System.out.println("插入成功!"); } public void update(){ dao.update(); System.out.println("修改成功!"); } public void delete(){ dao.delete(); System.out.println("删除成功!"); } public void query(){ dao.query(); System.out.println("查询成功!"); } public void queryDept(){ dao.queryDept(); System.out.println("查询 部门 成功!"); } public void batchUpdate(){ dao.batchUpdate(); System.out.println("批量 更新 成功!"); }}
4、测试类:
JDBCTemplateTest.java类:
package com.wm.spring.TEST;import java.sql.SQLException;import javax.sql.DataSource;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.wm.spring.Jdbc.service.DeptSV;public class JDBCTemplateTest { private ApplicationContext ac ; @Before public void init(){ ac = new ClassPathXmlApplicationContext("spring-jdbcTemplate.xml"); } @Test // 测试数据源 连接 public void testDataSource() throws SQLException{ DataSource ds = ac.getBean(DataSource.class); System.out.println(ds.getConnection()); } @Test public void testUpdate(){ DeptSV sv = ac.getBean(DeptSV.class); sv.insert(); sv.update(); sv.delete(); } @Test public void testQuery(){ DeptSV sv = ac.getBean(DeptSV.class); sv.query(); sv.queryDept(); } @Test public void testBatchUpdate(){ DeptSV sv = ac.getBean(DeptSV.class); sv.batchUpdate(); }}
总而言之,Spring JDBC 中的 JdbcTemplate模板类,对SQL操作比较简单、易用。 但是缺点就是 不能 级联查询(这方面,hibernate框架实现的比较好)。
除了使用JdbcTemplate作为Dao层的成员变量方式外,还有一种方式实现jdbc模板方法。
继承JdbcDaoSupport类
org.springframework.jdbc.core.support.JdbcDaoSupport
DeptJdbcTemplateDAO.java 对应的代码:
package com.wm.spring.Jdbc.DAO;import org.springframework.jdbc.core.support.JdbcDaoSupport;// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式public class DeptJdbcTemplateDAO extends JdbcDaoSupport{ public void insert(){ String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)"; // 其中 this.getJdbcTemplate() 获取模板对象 this.getJdbcTemplate().update(sql, 10,"能力开放平台","成都"); }}
使用这种方式时,不能够对DAO注解,否则会报错的,只能在XML中配置bean的方式。
<bean id="deptJdbcTemplateDAO" class="com.wm.spring.Jdbc.DAO.DeptJdbcTemplateDAO"> <property name="dataSource" ref="dataSource" /></bean>
并且要配置成员:dataSource 或者 jdbcTemplate,两者之一即可。
配置了才能获取到 this.getJdbcTemplate() 模板对象。
如果非要对DAO进行注解配置,则要实现对 数据源dataSource 或者jdbcTemplate进行setter方法。
package com.wm.spring.Jdbc.DAO;import javax.sql.DataSource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.stereotype.Repository;@Repository// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式public class DeptJdbcTemplateDAO extends JdbcDaoSupport{ @Autowired // 对数据源设值 并且 方法名不能是 setDataSource() public void setDataSource1(DataSource dataSource){ setDataSource(dataSource); } public void insert(){ String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)"; // 其中 this.getJdbcTemplate() 获取模板对象 this.getJdbcTemplate().update(sql, 20,"能力开放平台","成都"); }}
因为父类已经有此方法setDataSource了,并且方法类型为final,不可重写。
这几种方式都可以,但是最常用的还是第一种方式:把JdbcTemplate作为DAO的成员变量来实现模板方式。
- 随笔录 之 spring 自学杂记(五) -- JDBC
- 随笔录 之 spring 自学杂记(二) -- IOC(二)
- 随笔录 之 spring 自学杂记(三) -- AOP(一)
- 随笔录 之 spring 自学杂记(四) -- AOP(二)
- 随笔录 之 spring 自学杂记(六) -- Transaction(TX)
- 随笔录 之 spring 自学杂记(七) --Transaction(TX) (二)
- 随记录 之 Spring 自学笔记(一) -- IOC(一)
- Spring MVC 自学杂记(五) -- SpringMVC与前台的json数据交互
- Spring MVC 自学杂记(一)
- Quartz框架 之 自学杂记(一)
- Spring MVC 自学杂记(二) -- 数据绑定之日期转换
- Spring MVC 自学杂记(四) -- Spring+SpringMVC+WebSocket
- 随笔杂记(一)
- android之学习杂记(五)
- Spring(五)spring整合jdbc
- 杂记录
- 杂记录
- 程序员自学之旅(五)线程
- FIFO例程
- 深入理解 Java try-with-resource 语法糖
- 算法导论 15-3 编辑距离
- Matlab与线性代数--矩阵的正交分解
- 使用Android-PickerView修改item的字体大小(坑)
- 随笔录 之 spring 自学杂记(五) -- JDBC
- dex2jar源码解析----解析dex文件<三>
- 再见!永远的21号!马刺退役邓肯21号球衣
- 单元测试
- (八)C语言数组
- 算法一:循环遍历一个数组
- 学习笔记---全局与局部变量
- 关于jdk问题记录
- 关于 集合 A = 集合 B ,然后刷新关于集合A 的adapter,界面不显示的bug