曾经有过一个两层构架的时代,前台就是界面,后台就是存储过程,存储过程把业务逻辑和数据操作一手包办了。
用存储过程写东西比较复杂,大部分Java程序员或许都对此不太了解,因为我们如今的三层架构使用高级语言来充当中间的业务逻辑层。但是这种东西关键时候还是很有用的,下面是一个简单例子:
DELIMITER $$ #分隔符重新定义
DROP PROCEDURE IF EXISTS `world`.`addUser`$$ /* 如果存储过程存在就将其删掉 */
CREATE PROCEDURE `world`.`addUser` (in pname varchar(45), in birthday date,in money float,out pid int) BEGIN insert into user(name,birthday,money)values(pname,birthday,money); #last_insert_id()是MySql自带的系统方法,可以将当前线程最后一次插入的数据的id拿出来 select last_insert_id() into pid;END $$
DELIMITER ;
下面的代码调用该存储过程
public class PsTest {
/**
* @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { ps(); }static void ps() throws SQLException {
Connection conn = null; CallableStatement cs = null;//存储过程需要使用的statement继承自PreparedStatement ResultSet rs = null; try { // 2.建立连接 conn = JdbcUtils.getConnection(); // conn = JdbcUtilsSing.getInstance().getConnection(); // 3.创建语句String sql = "{ call addUser(?,?,?,?) } ";//调用名为addUser的存储过程
cs = conn.prepareCall(sql); cs.registerOutParameter(4, Types.INTEGER);//注册输出参数的位置和类型 cs.setString(1, "ps name"); cs.setDate(2, new java.sql.Date(System.currentTimeMillis())); cs.setFloat(3, 100f);cs.executeUpdate();
int id = cs.getInt(4);
System.out.println("id=" + id);
} finally { JdbcUtils.free(rs, cs, conn); } }}