Spring框架 JdbcTemplate(五)
来源:互联网 发布:js单选按钮取消选中 编辑:程序博客网 时间:2024/06/05 05:08
Spring JdbcTemplate 模板工具类
JdbcTemplate 是Spring提供简化Jdbc开发模板工具类。 使用上类似 Apache DbUtils
Spring对不同持久层技术支持
JdbcTemplate 快速入门
第一步: 在项目导入jar包
Spring核心4个、日志2个、测试 1个
导入jdbctemplate需要jar包
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
导入 mysql驱动包
第二步: 编写jdbc模板程序
public class JdbcTemplateTest { @Test public void demo1() { // 使用JdbcTemplate 完成数据库建表操作 // 1、 创建数据库连接池 (使用spring内置) DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring3_day2"); dataSource.setUsername("root"); dataSource.setPassword("abc"); // 2、 通过连接池构造模板对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); // 3、执行sql语句 jdbcTemplate.execute("create table person(id int primary key, name varchar(20))"); }}
第一步: 连接池
第二步: 模板对象
第三步: 执行sql语句
使用配置文件,配置JdbcTemplate
spring内置连接池
1、spring内置连接池 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///spring3_day2" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean>
Apache提供dbcp连接池
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///spring3_day2" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean>
c3p0连接池
<!-- 3、 c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
外部属性文件(properties文件)
修改properties 文件 会比 修改 xml文件 方便
将经常需要修属性参数值,配置到独立properties文件 ,在xml文件引入properties
建立db.properties文件
jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql:///spring3_day2jdbc.username = rootjdbc.password = abc
在spring 引入properties文件
<!-- 引入properties文件 --> <context:property-placeholder location="classpath:db.properties"/>
通过 ${key} 引用properties文件属性值
<!-- 3、 c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
<!-- 使用连接池 构造jdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean>
使用JdbcTemplate完成单表 CURD
第一步: 建立表 product商品表
CREATE TABLE product
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(20) NOT NULL,
price
double NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
第二步: 编写实体类
public class Product { private int pid; private String name; private double price;
第三步: 编写ProductDAO ,完成对product表常见操作
问题: 将JdbcTemplate 注入DAO
public class ProductDAO extends JdbcDaoSupport { // DAO 继承 Support ,自动提供setXXX 注入模板方法
配置applicationContext.xml
<!-- 需要将jdbcTemplate 注入DAO对象 --> <bean id="productDAO" class="cn.itcast.spring.c_curd.ProductDAO"> <!-- 向JdbcDaoSupport类注入DataSource 自动创建 JdbcTemplate对象 --> <property name="dataSource" ref="dataSource" /> </bean>
增、删、改操作
实现DAO 增加、修改、删除方法
// 添加 public void save(Product product) { String sql = "insert into product values(null,?,?)"; this.getJdbcTemplate().update(sql, product.getName(), product.getPrice()); } // 修改 public void update(Product product) { String sql = "update product set name=? , price=? where id=?"; this.getJdbcTemplate().update(sql, product.getName(), product.getPrice(), product.getPid()); } // 删除 public void delete(Product product) { String sql = "delete from product where id = ?"; this.getJdbcTemplate().update(sql, product.getPid()); }
简单查询,返回一个值
如果返回结果 是一个简单值,使用jdbcTemplate 提供 queryForXXX 方法
queryForInt 返回结果是int
queryForLong 返回结果是long
queryForObject 返回结果是Object (返回String )
实现DAO 方法
// 查询某个商品 名称 public String findNameById(int id) { String sql = "select name from product where id =?"; return this.getJdbcTemplate().queryForObject(sql, String.class, id); } // 查询总商品数量 public long findTotalCount() { String sql = "select count(*) from product"; return this.getJdbcTemplate().queryForLong(sql); }
复杂查询返回对象
JdbcTemplate 并没有提供 像Apache DbUtils框架 那样Handler ,需要手动封装结果集
———— 通常企业开发中, 开发人员会为每个表,编写单独结果集封装程序 (RowMapper)
/** * 结果集 封装程序 (只需关注 每行数据如何封装 ) * * @author seawind * */ private class ProductRowMapper implements RowMapper<Product> { @Override // rs 结果集对象 、rowNum 行号 public Product mapRow(ResultSet rs, int rowNum) throws SQLException { Product product = new Product(); product.setPid(rs.getInt("id")); product.setName(rs.getString("name")); product.setPrice(rs.getDouble("price")); return product; } }
再根据RowMapper 完成其他查询
// 根据id 查询商品信息 public Product findById(int id) { String sql = "select * from product where id = ?"; return this.getJdbcTemplate().queryForObject(sql, new ProductRowMapper(), id); } // 查询所有商品 public List<Product> findAll() { String sql = "select * from product"; return this.getJdbcTemplate().query(sql, new ProductRowMapper()); }
重点:
两套AOP (传统SpringAOP 、 AspectJ )
JdbcTemplate 增删改查
补充知识点: 传统Spring AOP 手动代理 —– 现在企业开发基本不要
来自Spring1.2时代
目标:
public class UserService { public void save() { System.out.println("添加"); } public void update() { System.out.println("更新"); }}
Advice:
public class MyMethodAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation mi) throws Throwable { System.out.println("环绕前============="); Object result = mi.proceed(); System.out.println("环绕后============="); return result; }}
通过Spring提供 ProxyFactoryBean 对目标进行手动代理
<!-- 配置目标 --> <bean id="userService" class="cn.itcast.service.UserService" /> <!-- 通知 --> <bean id="mymethodAdvice" class="cn.itcast.advice.MyMethodAdvice" /> <!-- 手动代理 --> <bean id="userServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目标 --> <property name="target" ref="userService" /> <!-- 可以配置多个Advice的name, 参数值value赋值 --> <property name="interceptorNames" value="mymethodAdvice" /> <!-- 对类对象进行代理 --> <property name="proxyTargetClass" value="true" /> </bean>
userService对象是代理前真实业务对象
userServiceProxy 由代理工厂生成代理对象
- Spring框架 JdbcTemplate(五)
- Spring boot 五 jdbcTemplate
- spring boot 教程(五)使用JdbcTemplate访问数据库
- 搭建Spring MVC+ jdbcTemplate框架
- Spring JdbcTemplate框架(一)——基本原理
- Spring JdbcTemplate框架(二)——动态建表
- JdbcTemplate查询(Spring框架中的工具类)
- JdbcTemplate和声明式事务(Spring框架)
- Spring框架学习第六讲(JDBCTemplate实现CRUD操作)
- Spring框架学习(13):JdbcTemplate和JdbcDaoSupport
- Spring框架 AOP (五)
- Spring框架中的JdbcTemplate类的使用方法
- 不用spring框架,只使用jdbcTemplate + proxool
- Spring框架学习【JdbcTemplate封装Jdbc】
- JDBC:Spring框架中JDBCTemplate的使用
- 11 Spring框架 SpringDAO的JdbcTemplate
- Spring框架——JdbcTemplate(Spring对Jdbc的封装)
- Spring基础知识(8)-JdbcTemplate
- listview的多item类型的优化
- 如何快速看懂一个大型程序
- Openstack中的eventlet分析(1)
- platform
- opencv学习(2)——图像处理的一些常见操作
- Spring框架 JdbcTemplate(五)
- Android 复习1.1 神奇的bundle
- ORACLE体系结构
- link to SIFT算法
- C++自定义模板类中STL iterator未定义的问题
- 串定位运算(完整程序)
- Openstack中的Eventlet分析(2)
- C++17、STL——Vector
- nginx debug