使用Spring 内置的JdbcTemplate操作数据库
2015-02-03 19:39
489 查看
Hibernate是一个很好的ORM框架,使用Hibernate可以很好的提高开发效率,而且操作起来也是非常简单,但是Hibernate也有一定的灵活性限制,此时就可以使用Spring内置的JDBC框架;JDBC框架是对纯JDBC的一个封装,简化了一些繁琐的操作,而且可以自己编写sql语句,灵活的处理业务。
Spring JDBC框架(spring-jdbc-x.x.x.RELEASE.jar)由4个部分组成:
——core包:提供了JDBC模板类,JdbcTemplate是core包的核心类
——datasource包:提供简化访问JDBC数据源工具类,并提供一些DataSource简单实现类,从而使这些DataSource 获取的连接能自动得到Spring事务管理的支持
——object包:提供关系数据的对象表现形式,如MappingSqlQuery、SqlUpdate、SqlCall、SqlFunction等。
——support包:提供将JDBC异常转换为Dao非检查异常的转换类和一些工具类
——CallableStatementCreator:
通过回调获取JdbcTemplate提供的Connection,由用户使用该Connection创建相关的CallableStatement
——CallableStatementCallback:
通过回调获取JdbcTemplate提供的CallableStatement,用户可以再CallableStatement执行任何操作
Spring JDBC框架(spring-jdbc-x.x.x.RELEASE.jar)由4个部分组成:
——core包:提供了JDBC模板类,JdbcTemplate是core包的核心类
——datasource包:提供简化访问JDBC数据源工具类,并提供一些DataSource简单实现类,从而使这些DataSource 获取的连接能自动得到Spring事务管理的支持
——object包:提供关系数据的对象表现形式,如MappingSqlQuery、SqlUpdate、SqlCall、SqlFunction等。
——support包:提供将JDBC异常转换为Dao非检查异常的转换类和一些工具类
一、基本操作
1.主要的实现步骤
(1)编写spring配置文件applicationContext.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- 1.配置数据源:DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <!--2.配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 3.为dao接口注入jdbcTemplate属性 --> <bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <!-- 业务层 、Struts2、事务等同往常一样配置--> </beans>
(2)在dao接口中使用JdbcTemplate实现方法的实现:
package com.wzj.dao.impl; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import com.wzj.dao.UserDao; import com.wzj.entity.User; public class UserDaoImpl implements UserDao{ //定义JdbcTemplate属性 private JdbcTemplate jdbcTemplate; //省略get、set方法 @Override public User selectUserByName(String name) { //定义RowMapper的对象,可以将数据中的每一行数据封装成用户定义的类. //RowMapper是接口,这里创建了一个匿名类并实现了其中的方法 RowMapper<User> row=new RowMapper<User>() { @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User user=new User(); user.setUserId(Integer.parseInt(rs.getString("USERID"))); user.setName(rs.getString("USERNAME")); user.setPassword(rs.getString("USERPWD")); return user; } }; String sql="select * from myuser1 where username=?"; //执行查询 User user=jdbcTemplate.queryForObject(sql, new Object[]{name}, row); return user; } @Override public int insert(User user) { String sql="insert into myuser1 values(user_sequence.nextVal,?,?)"; //执行插入 int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword()}); return result; } @Override public int delete(int userId) { String sql="delete from myuser1 where userid=?"; //执行修改 int result=jdbcTemplate.update(sql, new Object[]{userId}); return result; } @Override public int update(User user) { String sql="update myuser1 set username=?,userpwd=? where userid=?"; //执行删除 int result=jdbcTemplate.update(sql, new Object[]{user.getName(),user.getPassword(),user.getUserId()}); return result; } }
2.JdbcTemplate类的常用方法
方法名称 | 说明 |
---|---|
void execute(String sql) | 可以用于任何sql语句 |
int update(String sql,Object..args) | 执行DML语句,如UPDATE、INSERT、DELETE,args是其对应的参数 |
List<T> query(String sql,RowMapper<T> rowMapper) | 执行sql查询语句,并根据RowMapper具体的实现类返回结果类型 |
int queryForInt(String sql) | queryForXXX(),XXX代表结果类型,执行sql查询语句,返回结果是整数 |
T queryForObject(String sql,Object[] args,RowMapper<T> rowMapper) | 根据sql语句和参数返回结果对象 |
List<Map<String,Object>> queryForList(String sql,Object..args) | 根据sql语句和参数返回结果列表,每个Map的key是列名,value是该列对应的数据 |
二、调用存储过程
Spring JdbcTemplate支持对存储过程的调用(JDK最低1.5版本),JdbcTemplate支持的存储过程回调类如下:——CallableStatementCreator:
通过回调获取JdbcTemplate提供的Connection,由用户使用该Connection创建相关的CallableStatement
——CallableStatementCallback:
通过回调获取JdbcTemplate提供的CallableStatement,用户可以再CallableStatement执行任何操作
(1)执行无返回值的存储过程:
package com.wzj.test; import org.springframework.jdbc.core.JdbcTemplate; public class Demo{ private JdbcTemplate jdbcTemplate; //省略get、set public void test(){ jdbcTemplate.execute("{call procedureName(param,param...)}"); } }
(2)执行返回非结果集的存储过程:
创建存储过程:create or replace procedure get_user_name(id in varchar2,username out varchar2) is begin select username from User where userid=id; end调用:
public void test(){ jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String userid="22"; //创建对象 CallableStatement cs=con.prepareCall("call get_user_name(?,?)"); //设置参数 cs.setString(1, userid); //设置输出参数 cs.registerOutParameter(2, OracleTypes.VARCHAR); return cs; } }, new CallableStatementCallback() { @Override public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { //执行存储过程 cs.execute(); //获取输出参数 return cs.getString(2); } }); }
(3)执行返回结果集的存储过程:
①建立程序包:create or replace package userpackage as type user_cursor is ref cursor; end userpackage;②创建存储过程:
create or replace procedure get_user(user_cursor out userpackage.user_cursor) is begin open user_cursor for select * from User; end;③调用:
public void test() { List userList = (List) jdbcTemplate.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement cs = con.prepareCall("{call get_user(?)}"); cs.registerOutParameter(1, OracleTypes.CURSOR);// 注册输出参数的类型 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException { List userMap = new ArrayList(); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(1);// 获取游标一行的值 while (rs.next()) {// 转换每行的返回值到Map中 Map rowMap = new HashMap(); rowMap.put("userid", rs.getString("userid")); rowMap.put("username", rs.getString("username")); userMap.add(rowMap); } rs.close(); return userMap; } }); for (int i = 0; i < userList.size(); i++) { Map rowMap = (Map) userList.get(i); String id = rowMap.get("userid").toString(); String name = rowMap.get("username").toString(); System.out.println("usreid=" + id + ";username=" + name); } }
相关文章推荐
- Spring (六) 使用Spring 内置的JdbcTemplate操作数据库
- Spring使用JdbcTemplate实现对数据库操作 (内部类定义RowMapper)
- Spring中的数据库操作--使用JdbcTemplate
- 【Spring学习笔记】五、使用JDBCTemplate以对象方式操作数据库
- Mac Spring boot(1.5.9) 使用JDBCTemplate操作数据库
- spring-使用配置文件完成JdbcTemplate操作数据库-dbcp
- Spring使用JdbcTemplate实现对数据库操作
- Spring Boot教程(二十九)使用JdbcTemplate操作数据库
- Spring使用JdbcTemplate实现对数据库操作
- Spring使用JdbcTemplate操作数据库---使用RowMapperResultSetExtractor读数据篇
- Spring中使用JdbcTemplate操作数据库
- 16、使用Spring提供的JdbcTemplate操作数据库
- Spring使用JdbcTemplate实现对数据库操作
- Spring使用JdbcTemplate操作数据库---使用RowCallbackHander读数据篇
- Spring使用JdbcTemplate操作数据库
- Spring使用JdbcTemplate实现对数据库操作
- 使用Spring提供的三个JDBC模板类(JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate)操作数据库
- SpringBoot使用JdbcTemplate操作数据库
- Spring Cloud Spring Boot mybatis分布式微服务云架构(十六)使用JdbcTemplate操作数据库
- JDBC之使用Spring提供的JdbcTemplate进行数据库操作