hibernate是一个很好的ORM框架,使用Hibernate可以很好的提高开发效率,而且操作起来也是非常简单,但是Hibernate也有一定的灵活性限制,此时就可以使用spring内置的JDBC框架;JDBC框架是对纯JDBC的一个封装,简化了一些繁琐的操作,而且可以自己编写sql语句,灵活的处理业务。
——core包:提供了JDBC模板类,JdbcTemplate是core包的核心类
——datasource包:提供简化访问JDBC数据源工具类,并提供一些DataSource简单实现类,从而使这些DataSource 获取的连接能自动得到Spring事务管理的支持
——object包:提供关系数据的对象表现形式,如MappingSqlQuery、SqlUpdate、SqlCall、SqlFunction等。
——support包:提供将JDBC异常转换为Dao非检查异常的转换类和一些工具类
调用:
②创建存储过程:
③调用:
——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);
- }
- }