mysql存储过程实例(一)---------------图书管理系统部分查找

mysql数据库框架如下:
这里写图片描述
authors表存放的是作者信息,titles表存放的是书籍的信息,titleauthor作为存放的是俩表中相关联的信息,即au_id title_id ,书本作者对应几本书。
现要实现一个功能:通过一个作者编号,查询出书的数量,其中合著和单著的数量。
思路:1.通过au_id 找title_id的数量
2.判断合著数量和单著数量(难点)
用java方法实现:

链接数据库代码

package it.com.getCon;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class Conn {

    public Connection getCon(){
        Connection con =null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/pubs10";
            String user = "root";
            String pwd = "mysql";
            con=DriverManager.getConnection(url,user,pwd);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }
    public void close(){
        Connection con = getCon();
        try {
            if(!con.isClosed()){
                con.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Conn c = new Conn();
        c.getCon();
    }

}

javabean内容:

package it.com.Dao;

import it.com.getCon.Conn;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class BookDao {

    //通用版本的查询
    public List<Map> selectAll(String sql){
        Conn c = new Conn();
        Connection conn = c.getCon();
        List<Map> list = new ArrayList<Map>();
        try {
            PreparedStatement pst=conn.prepareStatement(sql);
            ResultSetMetaData rm = pst.getMetaData();//获取查询的结构
            int m =rm.getColumnCount();//获取查询的总列数
            ResultSet rs = pst.executeQuery();
            while(rs.next()){
                Map map = new HashMap();
                for(int i=1;i<=m;i++){
                    String col=rm.getColumnName(i);

                    map.put(col,rs.getString(col));
                }
                list.add(map);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }


    /*1、根据aid进行统计查找
     * 2、计算图书总数量
     * 3、得到每一个图书的信息
     */
    //根据au—id查作者出了多少本书
    public int titleById(String auid){
        String sql="SELECT * FROM titleauthor WHERE au_id='"+auid+"'";
        List<Map> list = selectAll(sql);
        int n = list.size();
        return n;
    }
    //根据au—id查作者出了多少本书
        public List<Map> titleById1(String auid){
            String sql="SELECT * FROM titleauthor WHERE au_id='"+auid+"'";
            List<Map> list = selectAll(sql);
            //int n = list.size();
            return list;
        }
    //查找每一本书是单著还是合著
        public int danAndhe(String tid){
            String sql = "SELECT COUNT(1) FROM titleauthor WHERE title_id='"+tid+"'";
            List<Map> list = selectAll(sql);
            Map map =list.get(0);
            int n =Integer.parseInt( map.get("COUNT(1)").toString());
            return n;
        }
    //查询某一个作者出版的图书情况:编号,总数,单著,合著
        public Map  selectDan(String aid){
            List<Map> list = null;
            list=titleById1(aid);//title_id的list集合
            int dan =0;
            int he =0;
            Map map = new HashMap();
            for(Map map1:list){
                String tid =map1.get("title_id").toString();
                int m =danAndhe(tid);
                if(m==1){
                    dan++;
                }else{
                    he++;
                }
            }
            map.put("bianhao", aid);
            map.put("zongshu", titleById(aid));

            map.put("danzhu", dan);
            map.put("hezhu", he);
            return map;
        }
    //查询所有作者出版的图书情况:编号,总数,单著,合著
        public List<Map> selectAll1(){

            String sql = "SELECT au_id FROM titleauthor ";
            List<Map > list = selectAll(sql);
            List<Map> list1 = new ArrayList<Map>();
            Map map = new HashMap();
            for(Map map1:list){
                String aid = map1.get("au_id").toString();
                map = selectDan(aid);
                list1.add(map);
            }
            return list1;
        }
        public static void main(String[] args){

            BookDao book = new BookDao();
            List<Map> list1 = book.selectAll1();
        for(Map map:list1){
            System.out.println(map);
          }
        }
}

结果显示:
这里写图片描述
由于在java中编写代码,隐蔽性不高。企业中一般采取存储过程编写;
mysql存储过程实现给定作者编号,查询出书数目,合著,单著数量如下:

DELIMITER $$
DROP PROCEDURE IF EXISTS pp1 $$
CREATE PROCEDURE `pubs10`.`pp1`(aid VARCHAR(20),ver INT)

    BEGIN
       DECLARE cnt INT DEFAULT 0;
       DECLARE dan INT DEFAULT 0;
       DECLARE he INT DEFAULT 0;
       DECLARE i INT DEFAULT 1;
       DECLARE tcnt INT DEFAULT 0;
       DECLARE tid VARCHAR(20);

       DROP TABLE linshi;
       IF ver=0 THEN
       DELETE FROM information;
       END IF;


       SET @a = 0;
       CREATE TABLE linshi SELECT @a:=@a+1 AS xh,title_id FROM titleauthor WHERE au_id=aid;
       SELECT COUNT(1) INTO cnt FROM linshi;

       WHILE i<=cnt DO
       SELECT title_id INTO tid FROM linshi WHERE xh=i;
       SELECT COUNT(1) INTO tcnt FROM titleauthor WHERE title_id=tid;
       IF tcnt=1 THEN
       SET dan=dan+1;
       ELSE
       SET he=he+1;
       END IF;
       SET i=i+1;
       END WHILE;
       INSERT INTO information VALUES (aid,cnt,dan,he);
       IF ver=0 THEN
       SELECT * FROM information;
       END IF;
    END$$

DELIMITER ;

运行结果测试:
这里写图片描述

查询所有作者出书数目信息存储过程:

DELIMITER $$
DROP PROCEDURE IF EXISTS pp2 $$
CREATE PROCEDURE `pubs10`.`pp2`()

    BEGIN
    DECLARE cnt INT DEFAULT 0;
    DECLARE i INT DEFAULT 1;
    DECLARE aid VARCHAR(20);

    DROP TABLE linshi_1;
    DELETE FROM information;

    SET @a=0;
    CREATE TABLE linshi_1 SELECT @a:=@a+1 AS xh,au_id FROM (SELECT DISTINCT au_id FROM titleauthor) a;
    SELECT COUNT(1) INTO cnt FROM linshi_1;
    WHILE i<=cnt DO
      SELECT au_id INTO aid FROM linshi_1 WHERE xh=i;
      CALL pp1(aid,1);
      SET i=i+1;
    END WHILE;
    SELECT * FROM information;
    END$$

DELIMITER ;

测试结果:
这里写图片描述

难点:在存储过程中,select的结果相当于return(直接跳出),当循环执行select,就会只显示第一次执行的结果

只需要在java中直接调用存储过程即可:

public List<Map> test(){
        Conn c = new Conn();
        Connection conn = c.getCon();
        List<Map> list = new ArrayList<Map>();
        String sql="{call pp2()}";
        try {
            CallableStatement pst=conn.prepareCall(sql);

            ResultSet rs = pst.executeQuery();
            while (rs.next()){
                Map map = new HashMap();
                map.put("aid",rs.getString("aid"));
                map.put("cnt",rs.getString("cnt"));
                map.put("dan",rs.getString("dan"));
                map.put("he",rs.getString("he"));
                list.add(map);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库系统概论课程设计之“图书数据库管理系统” ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 小组成员: *** QQ:763157698 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ “图书数据库备份文件”使用说明: 1、数据库备份文件还原时,应先将同目录下的备份文件 "LibrarySystem" 放置于“D:\LibrarySystem\”目录下; 2、该数据库使用到的所有数据均备份在同目录下的文件 "LibrarySystem" 中,读者可以根据需要还原数据、测试数据; 3、本课程设计附有“图书数据库管理系统的所有源代码”,您可以根据需要在“第四章节”至“第七章节”中进行查看,或查看与本课程设计处于同一目录下的 *.sql 源代码文件! 本图书馆管理系统谨根据实际需求所创建,创建有如下八个数据表:Book(图书信息表),Dept(学生系部信息表),Major(学生专业信息表),Student(学生信息表),StudentBook(学生借阅图书信息表),Teacher(教师信息表),TeacherBook(教师借阅图书信息表),RDeleted(读者还书信息表)等。这些数据表结合图书数据库中的五个存储过程,即实现了普通图书馆的大部分功能。如读者借阅图书功能(Execute RBorrowBook '读者号','图书分类号'),读者归还图书功能(Execute RReturnBook '读者号','图书分类号'),读者续借图书功能(Execute RRenewBook '读者号','图书分类号'),读者查询图书借阅情况功能(Execute RQueryBook '读者号'),读者检索的图书信息功能(Execute RIndexBook '关键字')等。具体的功能表现皆在“第三章、图书馆管理系统功能图例”中有详细的图例说明。 本图书馆管理系统谨根据实际需要,创建了七个触发器,就此,创作者对这些触发器做如下说明: 1、tri_Book 功能表现:只有在图书馆内相关书籍尚有库存的情况下,读者才可以进行借阅操作 2、tri_SborrowNum 功能表现:控制学生的图书借阅量在5本以内(包括5本) 3、tri_SrenewBook 功能表现:控制学生续借图书次数在3次以内(包括3次) 4、tri_SreturnBook 功能表现:将学生的还书信息插入RDeleted表 5、tri_TborrowNum 功能表现:控制教师的图书借阅量在10本以内(包括10本) 6、tri_TrenewBook 功能表现:控制学生续借图书次数在4次以内(包括4次) 7、tri_TreturnBook 功能表现:将教师的还书信息插入RDeleted表 本图书馆管理系统设计思路较为肤浅,但在一定程度上实现了图书数据库管理系统的实用功能。初次设计数据库,其中肯定会有不足之处,还望读者谅解!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值