Spring –持久層–編寫實體并配置Hibernate

歡迎來到本教程的第二部分。 當您看到本文有多長時間時,請不要驚慌–我向您保證,這主要是簡單的POJO和一些生成的代碼。

在開始之前,我們需要更新我們的Maven依賴項,因為我們現在將使用Hibernate和Spring。 將以下依賴項添加到pom.xml中

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>3.6.8.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- spring framework --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.1.0.RELEASE</version></dependency>

如果您是Maven的新手,您可能現在想知道-您怎么知道這些? 我在哪里可以買到? 好吧,只需轉到http://mvnrepository.com/并輸入您要搜索的啤酒。 您將獲得有關Maven依賴項的完整代碼。 如果您曾經嘗試在不使用Maven的情況下自己組裝Spring或Hibernate應用程序,那么您可能知道它是多么痛苦。 使用Maven,事情變得簡單得多。

還要注意,我們包括了對MySQL連接器的依賴。 如果您決定使用其他數據庫,請不要忘記更改它。

使用Hibernate,我們有2種選擇如何將POJO變成實體。 我們要么使用XML并創建映射文件 ,要么將一些元信息放入我們的代碼(java批注)中。 有些人對此感到恐懼,并認為這是與框架的結合。 的確,您在類路徑中將需要javax.persistence批注,但我們不會實現接口或擴展框架類。 我們將只在代碼中添加一些元信息,而POJO仍然只是帶有一些額外信息的POJO。

現在,我們將POJO轉換為實體。 我們將需要進行以下更改:

  • 為Hibernate添加默認的無參數構造函數
  • 為字段創建獲取器和設置器
  • 添加equalshashCode方法。
  • 添加持久性注釋。 請注意,我們還使用@Table批注來區分Java和SQL命名約定。
  • 添加ID字段。 這些將是我們關系數據庫中的主鍵。

這是很多樣板代碼,因此讓您的IDE幫您。 大多數現代IDE都會為您生成構造函數,getter,setter,equals和hashCode。

package org.timesheet.domain;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = 'employee')
public class Employee {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;private String name;private String department;public Employee() {}public Employee(String name, String department) {this.name = name;this.department = department;}public String getName() {return name;}public String getDepartment() {return department;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public void setName(String name) {this.name = name;}public void setDepartment(String department) {this.department = department;}@Overridepublic String toString() {return 'Employee [id=' + id + ', name=' + name + ', department='+ department + ']';}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result+ ((department == null) ? 0 : department.hashCode());result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (!(obj instanceof Employee)) {return false;}Employee other = (Employee) obj;if (department == null) {if (other.department != null) {return false;}} else if (!department.equals(other.department)) {return false;}if (id == null) {if (other.id != null) {return false;}} else if (!id.equals(other.id)) {return false;}if (name == null) {if (other.name != null) {return false;}} else if (!name.equals(other.name)) {return false;}return true;}}
package org.timesheet.domain;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = 'manager')
public class Manager {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;private String name;public Manager() {}public Manager(String name) {this.name = name;}public String getName() {return name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public void setName(String name) {this.name = name;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (!(obj instanceof Manager)) {return false;}Manager other = (Manager) obj;if (id == null) {if (other.id != null) {return false;}} else if (!id.equals(other.id)) {return false;}if (name == null) {if (other.name != null) {return false;}} else if (!name.equals(other.name)) {return false;}return true;}@Overridepublic String toString() {return 'Manager [id=' + id + ', name=' + name + ']';}}
package org.timesheet.domain;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;@Entity
@Table(name='timesheet')
public class Timesheet {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;@OneToOne@JoinColumn(name = 'employee_id')private Employee who;@OneToOne@JoinColumn(name = 'task_id')private Task task;private Integer hours;public Timesheet() {}public Timesheet(Employee who, Task task, Integer hours) {this.who = who;this.task = task;this.hours = hours;}public Employee getWho() {return who;}public Task getTask() {return task;}public Integer getHours() {return hours;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public void setWho(Employee who) {this.who = who;}public void setTask(Task task) {this.task = task;}public void setHours(Integer hours) {this.hours = hours;}/*** Manager can alter hours before closing task* @param hours New amount of hours*/public void alterHours(Integer hours) {this.hours = hours;}@Overridepublic String toString() {return 'Timesheet [id=' + id + ', who=' + who + ', task=' + task+ ', hours=' + hours + ']';}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((hours == null) ? 0 : hours.hashCode());result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((task == null) ? 0 : task.hashCode());result = prime * result + ((who == null) ? 0 : who.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (!(obj instanceof Timesheet)) {return false;}Timesheet other = (Timesheet) obj;if (hours == null) {if (other.hours != null) {return false;}} else if (!hours.equals(other.hours)) {return false;}if (id == null) {if (other.id != null) {return false;}} else if (!id.equals(other.id)) {return false;}if (task == null) {if (other.task != null) {return false;}} else if (!task.equals(other.task)) {return false;}if (who == null) {if (other.who != null) {return false;}} else if (!who.equals(other.who)) {return false;}return true;}
}

最后,這是我們需要同時使用@ManyToMany映射的Task實體。 這是因為一名雇員可以從事多個任務,而一項任務可以分配多個雇員。 我們使用@JoinTable和@JoinColumn批注定義了m:n的外觀。

package org.timesheet.domain;import javax.persistence.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;@Entity
@Table(name = 'task')
public class Task {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = 'task_employee',joinColumns = {@JoinColumn(name = 'task_id')},inverseJoinColumns = {@JoinColumn(name = 'employee_id')})private List<Employee> assignedEmployees = new ArrayList<Employee>();@OneToOne@JoinColumn(name = 'manager_id')private Manager manager;private String description;boolean completed;public Task() {}public Task(String description, Manager manager, Employee... employees) {this.description = description;this.manager = manager;assignedEmployees.addAll(Arrays.asList(employees));completed = false;}public Manager getManager() {return manager;}public List<Employee> getAssignedEmployees() {return assignedEmployees;}public void addEmployee(Employee e) {assignedEmployees.add(e);}public void removeEmployee(Employee e) {assignedEmployees.remove(e);}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public boolean isCompleted() {return completed;}public void setCompleted(boolean completed) {this.completed = completed;}public void setAssignedEmployees(List<Employee> assignedEmployees) {this.assignedEmployees = assignedEmployees;}public void setManager(Manager manager) {this.manager = manager;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Task task = (Task) o;if (completed != task.completed) {return false;}if (description != null ? !description.equals(task.description) : task.description != null) {return false;}if (id != null ? !id.equals(task.id) : task.id != null) {return false;}if (manager != null ? !manager.equals(task.manager) : task.manager != null) {return false;}return true;}@Overridepublic int hashCode() {int result = id != null ? id.hashCode() : 0;result = 31 * result + (manager != null ? manager.hashCode() : 0);result = 31 * result + (description != null ? description.hashCode() : 0);result = 31 * result + (completed ? 1 : 0);return result;}@Overridepublic String toString() {return 'Task{' +'id=' + id +', assignedEmployees=' + assignedEmployees +', manager=' + manager +', description='' + description + '\'' +', completed=' + completed +'}';}
}

因此,我們實際上并沒有做任何特別的建模。 如果您喜歡一些UML,請看下圖,關系與以前相同。

好的,我們有實體,現在讓我們創建數據庫。 選擇一些數據庫管理工具(即使是普通終端也可以)并創建時間表數據庫(默認情況下,mysql將在Mac OS X上安裝到/ usr / local / mysql / bin / mysql):

$ mysql -u root
mysql > create database timesheet;

如果您可能在不了解之前就已經配置過Hibernate,那么在處理SessionFactory時就需要很多文件和樣板代碼。 使用Spring,這些事情要簡單得多。

現在,我們將創建我們的第一個Spring Bean配置文件 -該文件在其中注冊Spring容器的bean。 如果我不得不向根本不了解Spring的人解釋這個文件是什么,那是Spring容器可以找到對象的神奇包。

現代IDE將幫助您正確使用所有XML名稱空間,例如,您可以從STS向導中查看圖片。 NetBeans具有類似的功能,IntelliJ可以動態解析名稱空間。

命名配置文件persistence-beans.xml,然后將其放在src / main / resources文件夾下。

因此,設置Hibernate,事務,批注配置等就像在XML文件中創建幾個bean一樣簡單。 另外,我們可以將Java Config用于Spring,但是XML config仍然使用更多,因此我們將堅持使用這些配置。 我不想阻止您使用Java Config! XML config 現在更受歡迎,但是我不能保證在接下來的幾年中。
我已經評論了每個bean,以確保您在繼續之前了解我們在這里所做的事情。 如果要直觀地了解Bean之間的連接,則可以再次使用一些工具-在STS中將其稱為Bean Graph,在IntelliJ中將其稱為Dependencies。 您可以在下面的圖片中看到依賴項示例。

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:context='http://www.springframework.org/schema/context'xmlns:tx='http://www.springframework.org/schema/tx'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd'><!-- we can use annotations --><context:annotation-config />  <!-- package to look for annotated classes --><context:component-scan base-package='org.timesheet.service.impl' /><!-- we will manage transactions with annotations --><tx:annotation-driven /><!-- data source for our database --><bean id='dataSource' class='org.springframework.jdbc.datasource.DriverManagerDataSource'><property name='driverClassName' value='com.mysql.jdbc.jdbc2.optional.MysqlDataSource' /><property name='url' value='jdbc:mysql://localhost/timesheet' /><property name='username' value='root' /><property name='password' value='' /></bean><!-- configure hibernate session factory --><bean id='sessionFactory'class='org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean'><property name='dataSource' ref='dataSource' /><property name='annotatedClasses' ><list><value>org.timesheet.domain.Employee</value><value>org.timesheet.domain.Manager</value><value>org.timesheet.domain.Task</value><value>org.timesheet.domain.Timesheet</value></list></property><property name='hibernateProperties'><props><prop key='dialect'>org.hibernate.dialect.MySQL5InnoDBDialect</prop><prop key='hibernate.show_sql'>true</prop><prop key='hibernate.hbm2ddl.auto'>update</prop></props></property> </bean></beans>

好的,那是很多配置,對嗎? 不好的是,我們已經將實體的名稱作為純文本放置到XML中,因此它不是友好的重構形式。 但我認為對于本教程來說是可以接受的 :) 讓我們為Hibernate編寫集成測試,以便我們知道一切都已正確設置。

package org.timesheet.integration;import static org.junit.Assert.*;import org.hibernate.SessionFactory;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;@ContextConfiguration(locations = '/persistence-beans.xml')
public class HibernateConfigurationTest extends AbstractJUnit4SpringContextTests {@Autowiredprivate SessionFactory sessionFactory;@Testpublic void testHibernateConfiguration() {// Spring IOC container instantiated and prepared sessionFactoryassertNotNull (sessionFactory); }}

我要你在這里注意兩件事。 首先,我們擴展AbstractJUnit4SpringContextTests類。 我們告訴它應該在哪里尋找使用Spring bean的實際XML配置。 否則,我們將不得不自己創建Spring容器,這意味著需要更多樣板代碼。

其次,我們使用@Autowired批注。 這意味著我們不會使用新的運算符手動創建SessionFactory實例,而是將其通過Spring容器自動裝配(注入)! 這是Spring容器最重要的目的之一-依賴于接口注入實現而不是手工創建它們。
一切現在都應該正常工作,我認為這部分就足夠了。

如果您愿意,可以檢查普通的SQL,并在此處查看表,請按照以下步驟進行操作:

mysql> use timesheet;
mysql> show tables;
+---------------------+
| Tables_in_timesheet |
+---------------------+
| employee            |
| manager             |
| task                |
| task_employee       |
| timesheet           |
+---------------------+
5 rows in set (0.00 sec)

參考: 第2部分–持久層–從vrtoonjava博客的JCG合作伙伴 Michal Vrtiak 編寫實體并配置Hibernate 。


翻譯自: https://www.javacodegeeks.com/2012/09/spring-persistence-layer-writing.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371377.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無線服務器主機名是,wifi默認服務器主機名

wifi默認服務器主機名 內容精選換一換以CentOS 7操作系統的彈性云服務器為例&#xff1a;登錄Linux彈性云服務器&#xff0c;查看“cloud-init”的配置文件。檢查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注釋或者刪除。如果沒有被注釋或者刪除&#xff0c;則需…

pygame里面物體閃爍運動_利用自閃爍發光二極管探究小車在傾斜軌道上的運動規律...

2020年11月23日&#xff0c;周一&#xff0c;24小時安全值班。利用當班中午的時間&#xff0c;微主在創客空間測試了自閃爍發光二極管在勻加速運動中的效果&#xff0c;結果還比較滿意。將小車放置在傾斜的軌道上&#xff0c;將自閃爍發光二極管和紐扣電池構成頻閃光源&#xf…

python網絡爬蟲與信息提取 學習筆記day3

Day3&#xff1a; 只需兩行代碼解析html或xml信息 具體代碼實現:day3_1 注意BeautifulSoup的B和S需要大寫&#xff0c;因為python大小寫敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

番石榴文件:Java文件管理

正如我在這里 &#xff0c; 這里 &#xff0c; 這里和這里所討論的那樣&#xff0c; Groovy和Java SE 7都為Java文件管理提供了改進。 但是&#xff0c;當特定的Java應用程序尚不能使用Java SE 7或Groovy進行文件管理時&#xff0c;仍然可以通過使用Guava的Files類獲得改進的文…

順序查找

順序查找屬于查找中較容易的一個方法&#xff0c;且對數據是否已經排序沒有要求&#xff0c;是很常用的一個查找算法。 但缺點是必須一個一個數字進行比較查找&#xff0c;查找所需步驟可能較多。 順序查找算法的思想是&#xff0c;將目標與待查找數據進行比較&#xff0c;若發…

王者榮耀微信哪個服務器人最少,王者榮耀:微信區王者人數銳減,大神們都去哪了?這些原因很真實...

原標題&#xff1a;王者榮耀&#xff1a;微信區王者人數銳減&#xff0c;大神們都去哪了&#xff1f;這些原因很真實王者榮耀&#xff1a;微信區王者人數銳減&#xff0c;大神們都去哪了&#xff1f;這些原因很真實大家好&#xff01;王者榮耀S16賽季已經開啟一月之余&#xff…

一個div壓在另一個div上面_【CSS小分享】用CSS畫一個新擬態風格鍵盤

什么是新擬態新擬態的英文名稱是“Neumorphism”&#xff0c;也有人稱為“Soft UI”。簡單講&#xff0c;新擬態是一種圖形樣式&#xff0c;其原理是通過模擬真實物體來為界面的UI元素賦予真實感。新擬態風格起源于dribbble&#xff0c;后面陸續被收錄在2020設計趨勢預測里面&a…

JBoss BRMS與JasperReports進行報告

介紹 Jasperreports是一個免費的可下載庫&#xff0c;可用于為Java EE應用程序生成豐富的報告。 本指南還提供了使用Jasper iReport設計器生成報告模板的步驟。 軟件需求 JBoss BRMS 5.3&#xff08;從客戶門戶網站http://access.redhat.com &#xff09; JasperReports 4.6…

java字符串 刪除指定字符的那些事

需求如下&#xff1a; 1.算出2周以前的時間&#xff0c;以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回結果&#xff0c;比如&#xff1a;2017-08-15 就需要顯示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…

Hibernate中Hql查詢

這篇隨筆將會記錄hql的常用的查詢語句&#xff0c;為日后查看提供便利。 在這里通過定義了三個類&#xff0c;Special、Classroom、Student來做測試&#xff0c;Special與Classroom是一對多&#xff0c;Classroom與Student是一對多的關系&#xff0c;這里僅僅貼出這三個bean的屬…

Java代碼質量工具–概述

最近&#xff0c;我有機會在本地IT社區聚會上介紹了該主題。 這是基本演示&#xff1a; Java代碼質量工具 以及更有意義的思維導圖&#xff1a; 但是&#xff0c;我認為我需要更深入地探討這一主題。 這篇博客文章應該像是在此方向上進行進一步調查的起點。 1. CodePro Anal…

利用yum升級Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作&#xff0c;centos7下有問題。可能是因為centos下的scl我是拷貝的文件&#xff0c;沒有完全驗證centos6下肯定沒問題。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷貝其關鍵內容就是&#xff1a; 1.使用 …

cuda版本查看_ubuntu安裝CUDA

0 寫在前面安裝環境&#xff1a;ubuntu18.04以及GTX1050Ti筆記本為什么要安裝CUDA&#xff1f; 參考百科&#xff0c;CUDA是英偉達推出的集成技術&#xff0c;通過該技術可利用GeForce 8 以后的GPU或者較新的Quadro GPU進行計算。例如典型的tensorflow-GPU和pyCUDA安裝之前都要…

HTML 標簽列表(功能排序) HTML 參考手冊- (HTML5 標準)

HTML 標簽列表&#xff08;功能排序&#xff09; HTML 參考手冊- (HTML5 標準) 功能排序 New : HTML5 新標簽 標簽描述基礎 <!DOCTYPE> 定義文檔類型。<html>定義一個 HTML 文檔<title>為文檔定義一個標題<body>定義文檔的主體<h1> to <h6>…

idea新建scala文件_IDEA maven項目中新建.scala文件

本文首發于我的博客[IDEA maven項目中新建.scala文件]分為三步第一步、IDEA中安裝scala插件1、搜索安裝File-Sittings-Plugins-搜索安裝scala2、安裝完成重啟安裝完成之后點擊重啟idea第二步、下載、安裝、配置Scala1、下載安裝Scala SDK本體搜索引擎搜索Scala SDK或者點我去Sc…

Linux中執行shell腳本的4種方法總結

文章來源&#xff1a;http://www.jb51.net/article/53924.htm 這篇文章主要介紹了Linux中執行shell腳本的4種方法總結,即在Linux中運行shell腳本的4種方法,需要的朋友可以參考下 bash shell 腳本的方法有多種&#xff0c;現在作個小結。假設我們編寫好的shell腳本的文件名為hel…

Log4j線程死鎖–案例研究

此案例研究描述了影響Weblogic Portal 10.0生產環境的Apache Log4j線程爭用問題的完整根本原因分析和解決方案。 它還將說明在開發和支持Java EE應用程序時適當的Java類加載器知識的重要性。 本文也是您提高線程轉儲分析技能和了解線程競爭條件的另一個機會。 環境規格 Java …

代碼實現:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字

import java.util.Scanner;/*題目&#xff1a;求saaaaaaaaaaaa...a的值&#xff0c;其中a是一個數字。例如222222222222222(此時共有5個數相加)&#xff0c;幾個數相加有鍵盤控制。 程序分析&#xff1a;關鍵是計算出每一項的值。*/public class Test08 {public static void ma…

堆棧跟蹤從何而來?

我認為&#xff0c;閱讀和理解堆棧跟蹤是每個程序員都必須具備的一項基本技能&#xff0c;以便有效地解決每種JVM語言的問題&#xff08;另請參閱&#xff1a; 過濾日志中無關的堆棧跟蹤行和首先記錄引起異常的根本原因 &#xff09;。 那么我們可以從一個小測驗開始嗎&#xf…

@select 怎么寫存儲過程_MySQL4:存儲過程和函數

什么是存儲過程簡單說&#xff0c;存儲過程就是一條或多條SQL語句的集合&#xff0c;可視為批文件&#xff0c;但是起作用不僅限于批處理。本文主要講解如何創建存儲過程和存儲函數以及變量的使用&#xff0c;如何調用、查看、修改、刪除存儲過程和存儲函數等。使用的數據庫和表…