[零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
MIS信息管理系统实战开发之使用MySQL实现保存
image
开发背景
image
ID、姓名、年龄为公共信息,而学生有成绩,工人有工资
定义一个抽象类Person(ID、姓名、年龄),学生是其子类,有成绩,工人是其子类有工资
ID如何定义呢? 
ID最好可以自己生成,最好的方式是采用下面的编码方式: 
· 标记 + 时间戳 + 三位随机数 
· 例如:2009年3月22 20:10:10.345 
· 学生的标记为s,工人的标记为w 
· 生成的ID号: 学生 --> s20090322201010345023 
                           工人 --> w20090322201010345023 
因为现在的程序要满足文件和数据库的操作标准,所以此处应该定义出一个公共的标准 —— 接口 
查询信息的时候可以进行排序操作,可以使用Comparable接口完成。
整个代码中牵扯到数据层的操作 
· 数据层就是指真实的数据操作 --> CRUD。 
· 最终结果操作的肯定是一个人(人为工人和学生) 
应该进行分开,一个是全部的学生管理,一个是全部的工人管理。 
数据层操作标准定义完成之后,有两种选择,一种是直接使用子类实现,但是以后的修改不是很方便, 
所以此处最好使用代理设计的思路完成,做一个中间层。 
代码关系: 
Main --> Menu --> PersonOperate --> DAO
因为程序即要求使用文件保存,又要求使用数据库保存,所以此处可以设计出一个工厂,通过此工厂进行DAO的操作子类实例取得。
在之前程序的基础上加入数据库的功能,现在不使用文件保存了,而使用数据库进行保存。 
如果现在要是把一个完整的PersonDAO接口分为StudentDAO和WorkerDAO两个接口,则调用处就不用修改代码。
  image 
数据库使用的是mysql,所以需要单独安装一个数据库的驱动程序
image
image   
##################Michael分割线##########################
PersonDAO.java
package org.michael.demo.dao;    
import java.util.Set;    
import org.michael.demo.vo.Person;    
// 定义具体的数据的操作方法    
public  interface PersonDAO {    
         /**    
         * 插入数据的操作    
         *    
         * @param person    
         *                        插入的是一个人员信息    
         * @return 操作成功与否的提示    
         * @throws Exception    
         *                         如果有错误,则把错误抛给调用处处理    
         */
    
         public  boolean doCreate(Person person)  throws Exception;    
         /**    
         * 更新数据操作    
         *    
         * @param person    
         *                        更新的具体信息    
         * @return 更新成功与否的提示    
         * @throws Exception    
         *                         如果有错误,则把错误抛出    
         */
    
         public  boolean doUpdate(Person person)  throws Exception;    
         /**    
         * 按id删除信息    
         *    
         * @param id    
         *                        人员的编号    
         * @return 删除与否的提示    
         * @throws Exception    
         *                         如果有错误,则在调用处处理    
         */
    
         public  boolean doDelete(String id)  throws Exception;    
         /**    
         * 因为查询是多个,所以要返回Set集合    
         *    
         * @return 全部的查询结果,一个Set中包含了多个Person对象    
         * @throws Exception    
         */
    
         public Set<Person> findAll()  throws Exception;    
         /**    
         * 按id进行查询    
         *    
         * @param id    
         *                        人员的编号    
         * @return 具体的人员信息    
         * @throws Exception    
         */
    
         public Person findById(String id)  throws Exception;    
         /**    
         * 按关键字进行查询    
         *    
         * @param keyWord    
         *                        输入的关键字    
         * @return 返回一组信息    
         * @throws Exception    
         */
    
         public Set<Person> findByLike(String keyWord)  throws Exception;    
}
 
PersonDAOImplJDBC.java
package org.michael.demo.dao.impl;    
import java.sql.PreparedStatement;    
import java.sql.ResultSet;    
import java.util.Set;    
import java.util.TreeSet;    
import org.michael.demo.dao.PersonDAO;    
import org.michael.demo.dbc.DataBaseConnection;    
import org.michael.demo.vo.Person;    
import org.michael.demo.vo.Student;    
import org.michael.demo.vo.Worker;    
public  class PersonDAOImplJDBC  implements PersonDAO {    
         private DataBaseConnection dbc =  null;    
         private String type =  null;    
         // 查询操作分为两点,要么是查询工人,要么是查询学生    
         public PersonDAOImplJDBC(String type) {    
                 this();    
                 this.type = type;    
        }    
         public PersonDAOImplJDBC() {    
        }    
         public  boolean doCreate(Person person)  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                 boolean flag =  false;    
                 try {    
                        PreparedStatement pstmt =  null;    
                         // 如果传入的是学生,则type为0,如果传入的是工人,则type为1    
                        String sql =  null;    
                         float temp = 0.0f;    
                         if (person  instanceof Student) {    
                                Student stu = (Student) person;    
                                temp = stu.getScore();    
                                sql =  "INSERT INTO tperson(id,name,age,score,type) VALUES (?,?,?,?,0)";    
                        }    
                         if (person  instanceof Worker) {    
                                Worker wor = (Worker) person;    
                                temp = wor.getSalary();    
                                sql =  "INSERT INTO tperson(id,name,age,salary,type) VALUES (?,?,?,?,1)";    
                        }    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1, person.getId());    
                        pstmt.setString(2, person.getName());    
                        pstmt.setInt(3, person.getAge());    
                        pstmt.setFloat(4, temp);    
                        pstmt.executeUpdate();    
                        pstmt.close();    
                        flag =  true;    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         // 最终无论是否发生异常,都必须关闭数据库    
                         this.dbc.close();    
                }    
                 return flag;    
        }    
         public  boolean doDelete(String id)  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                 boolean flag =  false;    
                 try {    
                        PreparedStatement pstmt =  null;    
                         // 如果传入的是学生,则type为0,如果传入的是工人,则type为1    
                        String sql =  null;    
                        sql =  "DELETE FROM tperson WHERE id=?";    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1, id);    
                        pstmt.executeUpdate();    
                        pstmt.close();    
                        flag =  true;    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         // 最终无论是否发生异常,都必须关闭数据库    
                         this.dbc.close();    
                }    
                 return flag;    
        }    
         public  boolean doUpdate(Person person)  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                 boolean flag =  false;    
                 try {    
                        PreparedStatement pstmt =  null;    
                         // 如果传入的是学生,则type为0,如果传入的是工人,则type为1    
                        String sql =  null;    
                         float temp = 0.0f;    
                         if (person  instanceof Student) {    
                                Student stu = (Student) person;    
                                temp = stu.getScore();    
                                sql =  "UPDATE tperson SET name=?,age=?,score=? WHERE id=?";    
                        }    
                         if (person  instanceof Worker) {    
                                Worker wor = (Worker) person;    
                                temp = wor.getSalary();    
                                sql =  "UPDATE tperson SET name=?,age=?,salary=? WHERE id=?";    
                        }    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1, person.getName());    
                        pstmt.setInt(2, person.getAge());    
                        pstmt.setFloat(3, temp);    
                        pstmt.setString(4, person.getId());    
                        pstmt.executeUpdate();    
                        pstmt.close();    
                        flag =  true;    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         // 最终无论是否发生异常,都必须关闭数据库    
                         this.dbc.close();    
                }    
                 return flag;    
        }    
         public Set<Person> findAll()  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                Set<Person> newSet =  new TreeSet<Person>();    
                String sql =  null;    
                 if ( "0".equals( this.type)) {    
                        sql =  "SELECT id,name,age,score FROM tperson WHERE type=?";    
                }    
                 if ( "1".equals( this.type)) {    
                        sql =  "SELECT id,name,age,salary FROM tperson WHERE type=?";    
                }    
                PreparedStatement pstmt =  null;    
                 try {    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1,  this.type);    
                        ResultSet rs = pstmt.executeQuery();    
                         while (rs.next()) {    
                                 // 要进行判断,判断是实例化Student还是实例化Worker    
                                 if ( "0".equals( this.type)) {    
                                        newSet.add( new Student(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4)));    
                                }    
                                 if ( "1".equals( this.type)) {    
                                        newSet.add( new Worker(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4)));    
                                }    
                        }    
                        rs.close();    
                        pstmt.close();    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         this.dbc.close();    
                }    
                 return newSet;    
        }    
         public Person findById(String id)  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                Person person =  null;    
                String sql =  null;    
                 if ( "0".equals( this.type)) {    
                        sql =  "SELECT id,name,age,score FROM tperson WHERE id=?";    
                }    
                 if ( "1".equals( this.type)) {    
                        sql =  "SELECT id,name,age,salary FROM tperson WHERE id=?";    
                }    
                PreparedStatement pstmt =  null;    
                 try {    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1, id);    
                        ResultSet rs = pstmt.executeQuery();    
                         while (rs.next()) {    
                                 // 要进行判断,判断是实例化Student还是实例化Worker    
                                 if ( "0".equals( this.type)) {    
                                        person =  new Student(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4));    
                                }    
                                 if ( "1".equals( this.type)) {    
                                        person =  new Worker(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4));    
                                }    
                        }    
                        rs.close();    
                        pstmt.close();    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         this.dbc.close();    
                }    
                 return person;    
        }    
         public Set<Person> findByLike(String keyWord)  throws Exception {    
                 this.dbc =  new DataBaseConnection();    
                Set<Person> newSet =  new TreeSet<Person>();    
                String sql =  null;    
                sql =  "SELECT id,name,age,score FROM tperson WHERE type=? AND name LIKE ?";    
                PreparedStatement pstmt =  null;    
                 try {    
                        pstmt =  this.dbc.getConnection().prepareStatement(sql);    
                        pstmt.setString(1,  this.type);    
                        pstmt.setString(2,  "%" + keyWord +  "%");    
                        ResultSet rs = pstmt.executeQuery();    
                         while (rs.next()) {    
                                 // 要进行判断,判断是实例化Student还是实例化Worker    
                                 if ( "0".equals( this.type)) {    
                                        newSet.add( new Student(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4)));    
                                }    
                                 if ( "1".equals( this.type)) {    
                                        newSet.add( new Worker(rs.getString(1), rs.getString(2), rs    
                                                        .getInt(3), rs.getFloat(4)));    
                                }    
                        }    
                        rs.close();    
                        pstmt.close();    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         this.dbc.close();    
                }    
                 return newSet;    
        }    
}
 
DataBaseConnection.java
package org.michael.demo.dbc;    
import java.sql.Connection;    
import java.sql.DriverManager;    
import java.sql.SQLException;    
//数据库的连接操作类    
public  class DataBaseConnection {    
         private  static  final String DBDRIVER =  "org.gjt.mm.mysql.Driver";    
         private  static  final String DBURL =  "jdbc:mysql://localhost:3306/51cto";    
        private static final String DBUSER = "root";    
        private static final String DBPASSWORD = "mysqladmin";    
        private Connection conn = null;    
        public DataBaseConnection() {    
                try {    
                        Class.forName(DBDRIVER);    
                } catch (ClassNotFoundException e) {    
                        // TODO Auto-generated catch block    
                        e.printStackTrace();    
                }    
                try {    
                        this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);    
                } catch (SQLException e) {    
                        // TODO Auto-generated catch block    
                        e.printStackTrace();    
                }    
        }    
        public Connection getConnection() {    
                return this.conn;    
        }    
        public void close(){    
                try {    
                        this.conn.close() ;    
                } catch (SQLException e) {    
                        // TODO Auto-generated catch block    
                        e.printStackTrace();    
                }    
        }    
}
 
数据库创建脚本
DROP  TABLE tperson ;    
CREATE  TABLE tperson    
(    
        id         VARCHAR(50)         PRIMARY  KEY  NOT  NULL ,    
         name         VARCHAR(50)         NOT  NULL ,    
        age         INT                 NOT  NULL ,    
        score         FLOAT ,    
        salary         FLOAT ,    
        type         INT     NOT  NULL  DEFAULT 0    
) ;    
-- 如果type的值为0,则表示学生,如果type的值为1则表示工人。
 
DAOFactory.java
package org.michael.demo.factory;    
import org.michael.demo.dao.PersonDAO;    
import org.michael.demo.proxy.PersonDAOProxyJDBC;    
public  class DAOFactory {    
         public  static PersonDAO getPersonDAOInstance(String path) {    
                 return  new PersonDAOProxyJDBC(path);    
        }    
}
 
FileOperate.java
package org.michael.demo.io;    
import java.io.File;    
import java.io.FileInputStream;    
import java.io.FileOutputStream;    
import java.io.ObjectInputStream;    
import java.io.ObjectOutputStream;    
import java.util.TreeSet;    
import org.michael.demo.vo.Person;    
public  class FileOperate {    
         private File file =  null;    
         // 在够方法处必须指定保存文件的名字    
         public FileOperate(String path) {    
                 this.file =  new File(path);    
                 if (! this.file.exists()) {    
                         // 如果内容不存在,则认为是第一次操作,需要初始化    
                         try {    
                                 this.save( new TreeSet<Person>()) ;    
                        }  catch (Exception e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    
         // 把对象保存在文件之中    
         public  void save(Object obj)  throws Exception {    
                ObjectOutputStream out =  null;    
                 try {    
                        out =  new ObjectOutputStream( new FileOutputStream( this.file));    
                         // 写入对象    
                        out.writeObject(obj);    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         try {    
                                out.close();    
                        }  catch (Exception e) {    
                        }    
                }    
        }    
         // 把对象从文件之中读进来    
         public Object load()  throws Exception {    
                Object obj =  null;    
                ObjectInputStream input =  null;    
                 try {    
                        input =  new ObjectInputStream( new FileInputStream( this.file));    
                        obj = input.readObject();    
                }  catch (Exception e) {    
                         throw e;    
                }  finally {    
                         try {    
                                input.close();    
                        }  catch (Exception e) {    
                        }    
                }    
                 return obj;    
        }    
}
 
Main.java
package org.michael.demo.main;    
import org.michael.demo.menu.Menu;    
public  class Main {    
         public  static  void main(String[] args) {    
                 new Menu();    
        }    
}
 
#################Michael分割线####################
#################Michael分割线####################
#################Michael分割线####################





本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/145367 ,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
2月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
9月前
|
Java 关系型数据库 数据库连接
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
77 8
|
9月前
|
Java 数据库连接 API
JDBC:Java数据库连接的“黑科技”大揭秘
JDBC:Java数据库连接的“黑科技”大揭秘
56 7
|
9月前
|
SQL Java 数据库连接
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
69 3
|
4月前
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
359 7
|
4月前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
74 5
|
5月前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
767 31
|
8月前
|
Oracle Java 关系型数据库
Java(TM) Platform SE binary 已停止工作”的解决方法
Java(TM) Platform SE binary 已停止工作”的解决方法
559 60
|
7月前
|
Java 关系型数据库 MySQL
基于Java的学生成绩管理系统/学生信息管理系统
基于Java的学生成绩管理系统/学生信息管理系统
170 2

热门文章

最新文章

下一篇
oss创建bucket