JDBC获取主键和调用存储过程

获得数据库自动生成的主键:

主代码:prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
'ResultSet.getGeneratedKeys();//得到插入行的主键'

建表:

create table testprimarykey(
    id int primary key auto_increment,
    name varchar(40)
);

测试:

@Test
    public void testPrimaryKey() {
        Connection conn = null;
        //用Statement去做
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert into testprimarykey(name) values('aaa')";
            ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.executeUpdate();
            //得到生成的键
            rs = ps.getGeneratedKeys();
            if (rs.next()){
               int id =  rs.getInt(1);
                System.out.println(id);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtils.release(conn, ps, rs);
        }
    }

JDBC调用存储过程

得到CallableStatement,并调用存储过程:

CallableStatement  cStmt = conn.prepareCall("{call demoSp(?,?)}");

设置参数,注册返回值,得到输出:

cStmt.setString(1, "qwer");
cStmt.registerOutParameter(2, Types.VARCHAR);
cStmt.execute();
System.out.println(cStmt.getString(2));

在MySQL中创建一个存储过程:

delimiter $$

CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam varchar(255))
BEGIN
    SELECT CONCAT('zyxw---', inputParam) into inOutParam;
END $$

delimiter ;

测试

 @Test
    public void testProcedure() {
        Connection conn = null;
        //用Statement去做
        CallableStatement cStmt = null;
        ResultSet rs = null;

        //第一个参数替换掉,执行后,结果作为第二个参数返回。mysql不知道返回类型是什么
        try {
            conn = JdbcUtils.getConnection();
            cStmt = conn.prepareCall("{call demoSp(?,?)}");
            cStmt.setString(1, "qwer");
            cStmt.registerOutParameter(2, Types.VARCHAR);
            cStmt.execute();
            System.out.println(cStmt.getString(2));
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtils.release(conn, cStmt, rs);
        }
    }

推荐阅读更多精彩内容

  • 本节介绍Statement接口及其子类PreparedStatement和CallableStatement。 它...
    zlb阅读 760评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,831评论 18 399
  • 预编译sql处理(防止sql注入) Statement : 执行SQL命令CallableStatement : ...
    奋斗的老王阅读 1,011评论 2 52
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 3,857评论 0 4
  • 昨天和朋友一起吃饭,朋友说:“雨,你未来有什么规划吗?”我说“我想做一点有情怀的事情,别总是为了钱,如果做一件事情...
    宛若清风R阅读 259评论 2 0
  • 谢谢你鸟类!谢谢你对我全心全意的付出! 谢谢你鸟类!谢谢你把你性格中最温暖的一面展现给我! 谢谢你鸟类!谢谢你对我...
    猫公主喵阅读 73评论 0 0
  • 在2014年即将过去的时候,负面情绪却将我紧紧捆住,不能呼吸。这一年,就是这样窒息着。 努力了好久的一件事,莫名其...
    吾冰阅读 215评论 2 1
  • 姓名:陈芬 公司:宁波慈星股份有限公司 宁波盛和塾《六项精进》224期学员,利他二组学员 【日精进打卡第246天】...
    龙芬浩阅读 57评论 0 0
  • 女生大都爱韩剧,迷一部剧换一个老公,前不久韩国小生宋仲基因为《太阳的后裔》荣升国民老公,几乎刷爆朋友圈,可见韩剧热...
    翊M阅读 933评论 2 11