1.什么是存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
2.存储过程的优点
(1)存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
(2)当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
(3)存储过程可以重复使用,可减少数据库开发人员的工作量
(4)安全性高,可设定只有某此用户才具有对指定存储过程的使用权
3.存储过程的缺点
(1)如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。
(2)可移植性差
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
4.存储过程数据库操作(Navicat 操作)
4.1调用入参的存储过程
(1)在navicat 的Student中 创建添加数据的函数(add_date)
public static void add(Student stu) throws Exception{
//通过工具类,获取数据库链接对象
Connection conn= DBUtil.getConn();
//创建 sql 语句
String sql = "insert Student (name,age,address) value (?,?,?)";
//创建 预加载 的sql 语句执行对象
PreparedStatement ptmt=conn.prepareStatement(sql);
//给名字赋值
ptmt.setString(1, stu.getName());
//给年龄赋值
ptmt.setInt(2, stu.getAge());
ptmt.setString(3, stu.getAddress());
//执行 sql 语句
ptmt.execute();
}
4.2调用出参存储过程
(1)创建记录数据条数的函数(get_record_count)
4.3调用无参存储过程
(1)创建一个打印所有数据的函数(select_all)
(2)代码实例
public class StudentProcedureDao {
/**
* 1、查询数据
*/
public ResultSet select_all() {
ResultSet rs = null;
// 1 获取数据库连接对象
Connection conn = DBUtil.getConn();
try {
// 2 创建存储过程调用对象
CallableStatement cs = conn.prepareCall("call select_all()");
// 3 执行存储过程
cs.execute();
// 4 获取结果集
rs = cs.getResultSet();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
5.jdbc 存储过程实例代码如下:
//DBUtil 连接数据库 package com.j1702.db; import java.sql.*; public class DBUtil { private static final String URL="jdbc:mysql://127.0.0.1:3306/jdbc_test"; private static final String USER="root"; private static final String PASSWORD=""; private static Connection conn = null; static { try { // 1.加载mysql驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库链接对象conn setConn(DriverManager.getConnection(URL, USER, PASSWORD)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConn() { return conn; } public static void setConn(Connection conn) { DBUtil.conn = conn; } } //model 层 package com.j1702.model; public class Student { private Integer id; private String name; private Integer age; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } //dao 层 package com.j1702.dao; import java.sql.*; import java.util.*; import com.j1702.db.DBUtil; import com.j1702.model.Student; public class StudentDao { //1.增 public static void add(Student stu) throws Exception{ //通过工具类,获取数据库链接对象 Connection conn= DBUtil.getConn(); //创建 sql 语句 String sql = "insert Student (name,age,address) value (?,?,?)"; //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt=conn.prepareStatement(sql); //给名字赋值 ptmt.setString(1, stu.getName()); //给年龄赋值 ptmt.setInt(2, stu.getAge()); ptmt.setString(3, stu.getAddress()); //执行 sql 语句 ptmt.execute(); } //2.删 public static void delete(Integer id) throws Exception{ //通过工具类,获取数据库链接对象 Connection conn= DBUtil.getConn(); //创建 sql 语句 String sql = " delete from Student where id =?"; //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt=conn.prepareStatement(sql); //给名字赋值 ptmt.setInt(1,id); ptmt.execute(); } //3.改 public static void update(Student stu) throws Exception{ //通过工具类,获取数据库链接对象 Connection conn= DBUtil.getConn(); //创建 sql 语句 String sql = "update Student set name=?,age=?,address=? where id =?"; //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt=conn.prepareStatement(sql); //给名字赋值 ptmt.setString(1, stu.getName()); //给年龄赋值 ptmt.setInt(2, stu.getAge()); ptmt.setString(3, stu.getAddress()); ptmt.setInt(4, stu.getId()); //执行 sql 语句 ptmt.execute(); } //4.查所有 public static void query(Student stu ) throws Exception{ //通过工具类,获取数据库链接对象 Connection conn= DBUtil.getConn(); //创建 sql 语句 String sql = "select * from Student"; //创建 预加载 的sql 语句执行对象 Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+"\t \tname:"+rs.getString("name")+"\tage"+ rs.getInt("age")+"\taddress"+rs.getString("address")); } } //5.查某个 public static void queryWithId(Integer id) throws Exception{ Connection conn= DBUtil.getConn(); //创建 sql 语句 String sql = "select * from Student where id=?"; //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt= conn.prepareStatement(sql); ptmt.setInt(1, id); ResultSet rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+"\t \tname:" +rs.getString("name")+"\tage:"+rs.getInt("age")+"\taddress"+rs.getString("address")); } } //6.条件查询 // public static void queryWithParam(List<Map<String,Object>>param) throws Exception{ // // Connection conn= DBUtil.getConn(); // //创建 sql 语句 // StringBuffer sql = new StringBuffer(); // sql.append("select * from Student where 1=1"); // for (Map<String, Object> map : param) { // sql.append(" and "+map.get("key") // +"="+map.get("value")); //创建 预加载 的sql 语句执行对象 // PreparedStatement ptmt= conn.prepareStatement(sql.toString()); // // ResultSet rs=ptmt.executeQuery(); // // while(rs.next()){ // System.out.println("id:"+rs.getInt("id")+"\t \tname:" // +rs.getString("name")+"\tage:"+rs.getInt("age")+"\taddress:"+rs.getString("address")); // } // } public static void queryWithParam1(List<Map<String,Object>>param) throws Exception{ Connection conn= DBUtil.getConn(); //创建 sql 语句 StringBuffer sql = new StringBuffer(); sql.append("select * from Student where 1=1"); for (Map<String, Object> map : param) { sql.append(" and "+map.get("key") +" like '%"+map.get("value")+"%'"); //创建 预加载 的sql 语句执行对象 System.out.println(sql); PreparedStatement ptmt= conn.prepareStatement(sql.toString()); ResultSet rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+"\t \tname:" +rs.getString("name")+"\tage:"+rs.getInt("age")+"\taddress:"+rs.getString("address")); System.out.println(sql); } } } public static void queryWithParam2(List<Map<String,Object>>param) throws Exception{ Connection conn= DBUtil.getConn(); //创建 sql 语句 StringBuffer sql = new StringBuffer(); sql.append("select * from Student where 1=1"); for (Map<String, Object> map : param) { sql.append(" and "+map.get("key") +"="+map.get("value")); //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt= conn.prepareStatement(sql.toString()); ResultSet rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+"\t \tname:" +rs.getString("name")+"\tage:"+rs.getInt("age")+"\taddress:"+rs.getString("address")); } } } public static void queryWithParam3(List<Map<String,Object>>param) throws Exception{ Connection conn= DBUtil.getConn(); //创建 sql 语句 StringBuffer sql = new StringBuffer(); sql.append("select * from Student where 1=1"); for (Map<String, Object> map : param) { sql.append(" and "+map.get("key") +"="+map.get("value")); //创建 预加载 的sql 语句执行对象 PreparedStatement ptmt= conn.prepareStatement(sql.toString()); ResultSet rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+"\t \tname:" +rs.getString("name")+"\tage:"+rs.getInt("age")+"\taddress:"+rs.getString("address")); } } } } //action 行动层 package com.j1702.action; import com.j1702.dao.StudentDao; import com.j1702.model.Student; //这一层是我们的controller 层:他是view和model层的服务员 public class StudentAction { //想数据库中插入一条数据 public static void insert(Student stu) throws Exception{ StudentDao.add( stu); } //根据传入的id 删除学生 public static void delete(Integer id) throws Exception{ StudentDao.delete(id); } //更新学生信息数据 public static void update(Student stu) throws Exception{ StudentDao.update(stu); } //查找Student public static void find(Integer id) throws Exception{ StudentDao.queryWithId(id); } } //view 视图界面层 package com.j1702.view; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; import com.j1702.dao.*; import com.j1702.db.DBUtil; import com.j1702.model.Student; public class TestView { public static void main(String[] args) throws Exception{ //编程以终端为view 层,实现数据的增、删、改 /** * 请输入你要做的操作:A-添加,D-删除,U更新,F-查询,exit-退出 * * A 请输入插入的数据 name,age,address * */ login(); } public static void login(){ System.out.println("请输入你要做的操作:A-添加,D-删除,U更新,F-查询,exit-退出"); Scanner in= new Scanner (System.in); String xz=in.next(); switch(xz){ case "A" : try { add(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case "D": try { delete(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case "U": try { update(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case "F" : find(); break; case "exit": exit(); break; default : System.out.println("没有你输入的选项,请重新选择"); login(); } } public static void add() throws Exception{ Student stu=new Student(); System.out.println("请输入插入的数据 name:"); Scanner cn=new Scanner (System.in); String name=cn.next(); System.out.println("请输入插入的数据 age:"); Scanner ca=new Scanner (System.in); int age=ca.nextInt(); System.out.println("请输入插入的数据 address :"); Scanner cd=new Scanner (System.in); String address = cd.next(); stu.setName(name); stu.setAge(age); stu.setAddress(address); StudentDao l1 =new StudentDao(); l1.add(stu); System.out.println("数据插入成功!"); System.out.println("请选择:1 继续插入数据, 2.返回上一层"); Scanner in= new Scanner (System.in); int x2=in.nextInt(); switch (x2) { case 1: add(); break; case 2: login(); break; default: System.out.println("没有你要的选项,请重新输入!"); } } public static void delete() throws Exception{ Connection conn= DBUtil.getConn(); System.out.println("请输入你要删除数据的ID"); Scanner in=new Scanner (System.in); Integer xid=in.nextInt(); StudentDao l2=new StudentDao(); l2.delete(xid); System.out.println("数据删除成功!"); System.out.println("请选择:1 继续继续数据, 2.返回上一层"); Scanner in1= new Scanner (System.in); int x2=in1.nextInt(); switch (x2) { case 1: delete(); break; case 2: login(); break; default: System.out.println("没有你要的选项,请重新输入!"); } } public static void update() throws Exception{ Student stu1=new Student(); System.out.println("请输入修改的数据 ID:"); Scanner ci=new Scanner (System.in); int id=ci.nextInt(); System.out.println("请输入修改的数据 name:"); Scanner cn1=new Scanner (System.in); String name=cn1.next(); System.out.println("请输入修改的数据 age:"); Scanner ca1=new Scanner (System.in); int age=ca1.nextInt(); System.out.println("请输入修改的数据 address :"); Scanner cd1=new Scanner (System.in); String address = cd1.next(); stu1.setId(id); stu1.setName(name); stu1.setAge(age); stu1.setAddress(address); StudentDao l3=new StudentDao(); l3.update(stu1); System.out.println("数据修改成功!"); System.out.println("请选择:1 继续修改数据, 2.返回上一层"); Scanner in1= new Scanner (System.in); int x2=in1.nextInt(); switch (x2) { case 1: update(); break; case 2: login(); break; default: System.out.println("没有你要的选项,请重新输入!"); } } public static void find(){ System.out.println("请选择:1.查询所有 2.查询某个 3.条件查询"); Scanner in= new Scanner (System.in); int xz3=in.nextInt(); switch(xz3){ case 1: Student stu=new Student(); StudentDao st=new StudentDao(); try { st.query(stu); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf(); break; case 2: System.out.println("请输入要查询的ID:"); Scanner cid=new Scanner(System.in); Integer id1=cid.nextInt(); try { StudentDao st1=new StudentDao(); st1.queryWithId(id1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf(); break; case 3: tiaojian(); break; } } public static void exit(){ System.out.println("谢谢使用,再见!"); return; } public static void cgf(){ System.out.println("数据查询成功!"); System.out.println("请选择:1 继续查询数据, 2.返回上一层"); Scanner in3= new Scanner (System.in); int x3=in3.nextInt(); switch (x3) { case 1: find(); break; case 2: login(); break; default: System.out.println("没有你要的选项,请重新输入!"); } } public static void cgf1(){ System.out.println("数据查询成功!"); System.out.println("请选择:1 继续查询数据, 2.返回上一层"); Scanner in3= new Scanner (System.in); int x3=in3.nextInt(); switch (x3) { case 1: tiaojian(); break; case 2: login(); break; default: System.out.println("没有你要的选项,请重新输入!"); } } public static void tiaojian(){ System.out.println("请选择要查询的字段:1.id 查询 2.name 查询 3.age 查询 4.address 查询"); Scanner tjcx=new Scanner(System.in); int tx3=tjcx.nextInt(); switch(tx3){ case 1: System.out.println("请输入要查询的ID:"); Scanner cid=new Scanner(System.in); Integer id1=cid.nextInt(); try { StudentDao st1=new StudentDao(); st1.queryWithId(id1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf1(); break; case 2: System.out.println("请输入你要查询的 name:"); Scanner cn1=new Scanner(System.in); Map<String,Object> map = new HashMap<String,Object>(); map.put("key", "name"); map.put("value",cn1.next()); List<Map<String,Object>> li= new ArrayList<Map<String,Object>>(); li.add(map); try { StudentDao l4=new StudentDao(); l4.queryWithParam1(li); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf1(); break; case 3: System.out.println("请输入你要查询的 age:"); Scanner cn2=new Scanner(System.in); String sage=cn2.next(); Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("key", "age"); map1.put("value",sage); List<Map<String,Object>> li1= new ArrayList<Map<String,Object>>(); li1.add(map1); try { StudentDao l4=new StudentDao(); l4.queryWithParam2(li1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf1(); break; case 4: System.out.println("请输入你要查询的 address:"); Scanner cn3=new Scanner(System.in); String sadd=cn3.next(); Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("key", "address"); map2.put("value",sadd); List<Map<String,Object>> li2= new ArrayList<Map<String,Object>>(); li2.add(map2); try { StudentDao l4=new StudentDao(); l4.queryWithParam3(li2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } cgf1(); break; } } }