如何通过hibernate调用存储过程

用hibernate操作数据库,可以通过获取的session值,调用connection()方法获取connection,从而调用存储过程。

java调用存储过程

什么是hibernate?

hibernate是数据访问层的框架,对jdbc进行了封装,使用hibernate可以直接访问对象,hibernate自动将此访问转换为sql执行,从而达到间接访问数据库的目的,简化了数据访问层的代码开发。

hibernate和mybatis对比:

共性:采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

Hibernate是全自动化ORM的映射工具

mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,mybatis重点对

sql语句的灵活操作。

适合用于:需求变化频繁, 数据模型不固定的项目,例如:互联网项目。

如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6.继承类使用显式多态

7.表字段要少,表关联不要怕多,有二级缓存撑腰

1.什么是存储过程?

存储过程是指保存在数据库并在数据库端执行的程序。存储过程是为嵌入式SQL所设计

2.如何调用存储过程?

try{

          int age = 39;

         String poetName = “dylan thomas”;

         CallableStatement proc = connection.prepareCall(“{ call set_death_age(?, ?) }”);

         proc.setString(1, poetName);

         proc.setInt(2, age);

         cs.execute();

}catch (SQLException e){ // ….} 

传给prepareCall方法的字串是存储过程调用的书写规范。它指定了存储过程的名称,?代表了你需要指定的参数。

3.存储过程可以有返回值

所以CallableStatement类有类似getResultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么。你也必须调整存储过程调用来指示该过程返回一个值。 

connection.setAutoCommit(false);

CallableStatement proc = connection.prepareCall(“{ ? = call snuffed_it_when(?) }”);

proc.registerOutParameter(1, Types.INTEGER);

proc.setString(2, poetName);

cs.execute();

int age = proc.getInt(2); 

4.复杂的返回值

static void sendEarlyDeaths(PrintWriter out){

    Connection con = null;

    CallableStatement toesUp = null;

try {

      con = ConnectionPool.getConnection();

    // PostgreSQL needs a transaction to do this… con.

    setAutoCommit(false); // Setup the call.

    CallableStatement toesUp = connection.prepareCall(“{ ? = call list_early_deaths () }”);

    toesUp.registerOutParameter(1, Types.OTHER);

    toesUp.execute();

    ResultSet rs = (ResultSet) toesUp.getObject(1);

    while (rs.next()) {

    String name = rs.getString(1);

    int age = rs.getInt(2);

    out.println(name + ” was ” + age + ” years old.”);

}

    rs.close();

}

    catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close();

}

因为JDBC并不直接支持从存储过程中返回游标,我们使用Types.OTHER来指示存储过程的返回类型,然后调用getObject()方法并对返回值进行强制类型转换。

猜你喜欢

转载自blog.csdn.net/weixin_34354945/article/details/87077286