数据库_jdbc_调用存储过程+获取自动生成主键

获取自动生成主键

package cn.itcast.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.itcast.utils.JdbcUtils;
public class demo4 {
   /*
    获取自动生成的主键,仅在插入语句有效!
    应用场景举例:夫妻关系管理系统,男方表插入语句时,
    需要获取自动生成的id,用于更新女方表的外键列!
    mysql -uroot -proot
    set character_set_client=gb2312;
   set character_set_results=gb2312;
    use day15;
    create table test(
    id int primary key auto_increment,
    name varchar(40) not null
    )character set utf8 collate utf8_general_ci;
    show tables;
    */
   @Test
   public void getGeneratedKeys(){
      //SQL更新模板代码(sql_u)
      Connection conn = null;
      PreparedStatement st = null;
      ResultSet rs = null;
      try {
         conn = JdbcUtils.getConnection();
         String sql = "insert into test(name) values(?)";
         st = conn.prepareStatement(sql);
         st.setString(1, "林黛玉");
         st.executeUpdate();
         //关键代码:
         rs=st.getGeneratedKeys();
         if (rs.next()) {
            //只能使用列索引,不能使用列名!? 找不到名为id的列!
            System.out.println(rs.getInt("id"));
         }
         
      } catch (Exception e) {
         throw new RuntimeException(e);
      } finally {
         JdbcUtils.release(conn, st, rs);
      }
   }
}

调用存储过程

package cn.itcast.demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;
import org.junit.Test;
import cn.itcast.exception.DaoException;
import cn.itcast.utils.JdbcUtils;
public class demo5 {
   /*
    调用存储过程
    对于金融领域特别重要!因为表结构不公开,所以也不能用hibernate
    具体细节会在oracle四天学习中讲解!
    1,在mysql中先定义一个存储过程(类似于函数)!
    功能是在输入字符串前加入字符串'pre_eminent:'后输出
    delimiter ^
    create procedure demo5(IN inputParam VARCHAR(255),INOUT inoutParam VARCHAR(255))
    BEGIN
          SELECT CONCAT('pre_eminent:',inputParam) into inoutParam;
    END^
    delimiter ;
    2,drop procedure demo5删除存储过程*/
   @Test
   public void sqlProcedure(){
      //SQL调用存储过程模板代码(sql_procedure)
      Connection conn = null;
      CallableStatement st = null;
      ResultSet rs = null;
      try {
         conn = JdbcUtils.getConnection();
         /*调用存储过程的关键一句 demo5是上面存储过程的名称(类似函数名)!
          * call是SQL关键字!括号里面是参数!
          * 第1个参数是输入,第2个参数是输出!*/
         String sql = "{call demo5(?,?)}";
         st = conn.prepareCall(sql);
         //替换掉占位符并注册返回值类型!注意第2个是sqlType
         st.setString(1, "nice to meet you!");
         //注册返回值类型,可以找java.sql.Types的常量!
         st.registerOutParameter(2, Types.VARCHAR);
         //执行这条完整的sql语句
         st.execute();
         //输出占位符2的值,即是得到的inoutParam的值!
         System.out.println(st.getString(2));
      } catch (Exception e) {
         throw new DaoException(e);
      } finally {
         JdbcUtils.release(conn, st, rs);
      }
   }
}


你可能感兴趣的:(数据库,存储过程)