第13章MySQL管理器第13章MySQL管理器当前IT行业流行的关系型数据库有Oracle、SQLServer、DB2和MySQL等。其中MySQL是一个小型的关系型数据库,开发者是瑞典的MySQLAB公司,于2008年6月1日被Sun公司收购。MySQL拥有体积小、速度快等优点,被广泛的应用在中小型企业的IT系统中,更重要的一点是,它是开源的。由于MySQL应用广泛,因此涌现出许多MySQL的客户端,例如MySQLFront、Navicat与MySQL自带的MySQLAdministrator等,这些都是我们平时在开发MySQL数据库应用时十分常用的MySQL图形管理工具。这些优秀的工具为我们提供了十分方便的功能去管理MySQL数据库,例如提供浏览数据的图形界面、操作数据的界面、操作各个数据库元素(表、视图、存储过程等)的界面,这些功能为我们带来了极大的方便,可以在一个完全图形化的界面进行数据库处理。使用这些工具,你可以不懂如何编写SQL语句,只需要通过操作图形界面,就可以达到操作数据库的目的。在本章中,我们将自己开发一个简单的MySQL管理器。在开发的过程中,让大家了解前面所讲到的那些优秀工具的实现原理。在本章开头已经提到,这些管理工具,提供了各种的图形界面让我们去进行各种的操作,因此,开发一个MySQL管理器,除了需要编写一些操作数据库的SQL以外,还需要注意的是图形界面的处理。这些管理工具,实现的原理并无太大差别,但是哪个工具更能得到多数使用者的青睐,更多的就是取决于这些工具给用户带来的使用体验及方便性。本章所开发的MySQL管理器是基于MySQL5.0开发的,因此如果要得到最佳的运行效果,请使用MySQL5.0。由于MySQL各个版本间都存在差别,例如笔者在开发这个管理器的时候,就遇到MySQL5.0与MySQL5.1之间的微小差别,这些差别对我们开发所产生的影响,将在下面的章节中详细介绍。13.1MySQL管理器原理MySQL管理器,主要功能是让用户可以轻松进行各种的MySQL操作,包括连接管理、数据库管理、表管理、视图管理、存储过程和函数管理,这些功能点我们都可以使用JDBC实现,例如表管理中包括创建表、修改表等功能,我们可以使用JDBC直接执行SQL语句中的CREATETABLE和ALTERTABLE来达到目的。除了这些功能外,还需要对数据库中的数据进行导出和导与的操作,进行这些操作,我们可以编写程序来实现,但是,更好办法就是使用MySQL的命令(mysql或者mysqldump)来解决,这样可以轻松解决数据的导出与导入,但是,前提就是使用的客户端必须安装MySQL数据库,并且要告诉我们这个管理器,MySQL的具体目录,我们可以使用程序去调用这些MySQL的命令。下面,我们就开始实现这些所定义的功能。13.2建立界面在编写程序前,我们需要准备各个界面,包括连接管理界面、表管理界面、视图管理界面、存储过程(函数)管理界面与查看数据界面等。表管理、视图管理、存储过程和函数管理我们可以建立一个主界面,根据不同的情况显示不同的菜单,而连接管理我们可以使用一棵树来进行管理,可以同时存在多个连接,这些连接下面的子节点就是该连接下面的数据库。第13章MySQL管理器·2·13.2.1MySQL安装目录选择界面当进入管理器时,我们就需要让用户去选择MySQL的安装目录,原因就是因为我们需要MySQL的内置命令,因此需要指定MySQL的安装目录。图13.1是安装目录选择界面。图13.1MySQL安装目录选择界面让用户选择MySQL安装目录十分简单,只提供一个目录选择安装以及显示目录路径的JTextFeild,并且加入一个确定与取消按钮。当用户选择了MySQL的安装目录,点击了确定时,就显示我们的主界面,这里需要注意的是,我们在实现的时候,需要判断用户所选择的MySQL[安装目录是否正确,由于mysql与mysqldump等命令是存在于MySQL安装目录下的bin目录的,因此判断用户所选择的目录是否正确,可以判断在bin目录下是否存在相应的命令,这些将在下面的章节中描述。MySQL安装目录在本章代码中对应的是ConfigFrame类。13.2.2主界面主界面提供各种功能的入口,可以让用户在该界面中使用或者进入各个功能,除了需要提供这些入口外,还需要提供一棵树,更直观的展示当前所使用的连接,以及该连接下面所有的数据库。主界面如图13.2所示。图13.2主界面第13章MySQL管理器·3·主界面由一个工具栏,一棵树以及一个JList组成,其中工具栏中包括的操作如下:添加连接:可以让用户添加一个连接。查看表:查看当前数据库中所有的表。查看视图:查看当前数据库中所有的视图。查看存储过程(函数):查看数据库中所有的存储过程与函数。打开执行SQL的界面:打开一个执行SQL语句的界面。在主界面的左边部分,提供一棵树让用户十分直观的看到连接的相关信息,这棵树可以隐藏根节点,第一层节点就是连接,第二层节点就是该连接下所对应的所有的数据库,每一个数据库节点下面可以有三个子节点:表、视图和存储过程,当然,我们在平时使用其他管理工具的时候,还可以有触发器等内容,我们在本章的项目中不提供这些功能。这里需要注意的是,我们更换了树的各个节点图片,因此需要为JTree添加一个DefaultTreeCellRenderer来设置各个节点的图片以及文字,当然,还需要将各个节点抽象成不同的对象,新建各个视图对象的接口ViewObject,该接口将是所有视图对象的父类,这些视图对象包括树的各个节点,主界面右边列表所显示的各个元素等。代码清单:code\mysql-manager\src\org\crazyit\mysql\object\ViewObject.javapublicinterfaceViewObject{//返回显示的图片IcongetIcon();}该接口只有一个getIcon方法,返回一个Icon对象,表示这些界面所对应的图片,另外,树上的各个节点对象,可以有两种形式,第一种就是需要带连接的节点,例如数据库连接节点和数据库节点,第二种就是不需要带有连接的节点,因此我们可以将带有连接的节点抽象成一个父类,让连接节点和数据库节点去继承。另外,还需要提供一个connect的抽象方法,需要让子类去实现。代码清单:code\mysql-manager\src\org\crazyit\mysql\object\tree\ConnectionNode.javapublicabstractclassConnectionNodeimplementsViewObject{//JDBC的Connection对象protectedConnectionconnection;//连接方法,由子类去实现publicabstractConnectionconnect();//省略setter和getter方法}代码清单:code\mysql-manager\src\org\crazyit\mysql\object\tree\ServerConnection.javapublicclassServerConnectionextendsConnectionNode{privatefinalstaticStringDRIVER=com.mysql.jdbc.Driver;//MySQL驱动privateStringconnectionName;//MySQL驱动privateStringusername;//用户名privateStringpassword;//密码privateStringhost;//连接ipprivateStringport;//连接端口//省略setter和getter方法//实现接口ViewObject的方法,根据不同的连接状态显示不同的图片publicIcongetIcon(){if(super.connection==null)returnImageUtil.CONNECTION_CLOSE;elsereturnImageUtil.CONNECTION_OPEN;}//重写toString方法,返回连接名称publicStringtoString(){returnthis.connectionName;第13章MySQL管理器·4·}//实现父类的connect方法publicConnectionconnect(){}}一个ServerConnection对象表示一个连接节点,一个连接节点当然需要包括一些连接的相关信息,包括连接名称、MySQL用户名、密码、连接的IP与端口等信息。该对象实现了ViewObject的getIcon方法,判断父类ConnectionNode的connection属性是否为空来显示不同的图片,还需要重写toString方法,返回连接的名称。代码清单:code\mysql-manager\src\org\crazyit\mysql\object\tree\Database.javapublicclassDatabaseextendsConnectionNode{privateStringdatabaseName;//数据库名字privateServerConnectionserverConnection;//数据库所属的服务器连接//需要使用数据库名称与服务器连接对象构造publicDatabase(StringdatabaseName,ServerConnectionserverConnection){this.databaseName=databaseName;this.serverConnection=serverConnection;}//实现接口的方法,判断该数据库是否连接,再返回不同的图片publicIcongetIcon(){if(this.connection==null)returnImageUtil.DATABASE_CLOSE;returnImageUtil.DATABASE_OPEN;}//重写toString方法publicStringtoString(){returnthis.databaseName;}//实现父类的connect方法publicConnectionconnect(){}}Database节点对象包括数据库的名字,另外还需要一个ServerConnection对象,由于每个数据库都是某个连接节点下面的子节点,因此需要记录它的父节点,当然,并不是简单的进行记录,还可以让它们共享一些不会经常创建的实例,例如Connection。另外,需要注意的是,无论ServerConnection或者Database对象,都需要实现ViewObject的getIcon方法,当连接节点或者数据库节点被打开时,都需要改变它们的图片,而显示何种图片,由getIcon方法决定。代码清单:code\mysql-manager\src\org\crazyit\mysql\object\tree\TableNode.javapublicclassTableNodeimplementsViewObject{privateDatabasedatabase;//所属的数据库节点//返回表的树节点图片publicIcongetIcon(){returnImageUtil.TABLE_TREE_ICON;}//重写toString方法publicStringtoString(){return表;}}一个TableNode对象代表一个表的节点,需要提供一个Database属性来表示这个对象是属于哪个第13章MySQL管理器·5·数据库下面的子节点。如图13.2所示,我们可以看树中每个数据库节点的表节点都是一致的(每个数据库里面都有表),可以将这个表节点理解成是导航栏的某一组成部分,当用户点击了这个节点后,就可以在右边的列表中显示对应数据库的表。与TableNode一样,另外再次创建两个对象:ViewNod