【编程新技术实务】实验一 Java语言编程(JDBC封装)

实验目的

安装、配置好Java编程环境、数据库环境,使用Java 进行编程以及数据库编程。

实验对应知识点

Java编译、运行,path、classpath环境变量,规范注释。数据库的JDBC驱动。

实验前任务

学习Java的基本语法以及数据库的理论基础。

实验要求及步骤

1、Java环境的安装、配置

略。懒得装新的,用的JDK8。
这是以前安装时记录的->Windows10搭建Java环境

2、安装开发工具Eclipse IDE for JavaEE或者MyEclipse

略。
这是以前装Eclipse时记录的->Eclipse的下载、安装与汉化
现在改用IDEA了,方便是真的方便

3、数据库的安装配置

略。装的MySQL 8.0。
(数据库这门课下学期学,这学期就搞关于数据库的实验,这排课排的有点水平。所以目前对数据库的理解非常浅显。)

4、使用Java编程完成如下任务

(1)创建数据库表

创建数据库表users,字段分别为
username(主键,varchar(10))、
pass (varchar(8));
数据库表person,字段分别为
username(varchar(10),对应于users表的username)、
name(主键,varchar(20))、
age(int,可以为空)、
teleno(char(11),可以为空);
如表users中username则表person中也不能有相应的username的数据。

(这实验应该是上古实验,上面最后一句不知道说的啥,算了,反正我也不想知道
可能是要用外键约束吧)

(2)插入数据

在表users中插入4行数据,数据分别是
(ly,123456)、(liming,345678)、(test, 11111)、(test1,12345),
在表person中插入3行数据,数据分别为
(ly,雷力)、(liming,李明,25)、(test,测试用户,20,13388449933)

(3)插入数据and查询数据

person表中插入5行数据,分别为
(ly,王五)、(test2,测试用户2)、(test1,测试用户1,33)、
(test,张三,23,18877009966)、(admin,admin)。
对于表中已有的username,则根据最新的数据修改其相应字段值;
如该username不存在,则首先在表users中插入该username
默认的password为888888,然后才能将数据插入至person表。

(4)删除数据

删除users表中test打头的username,同时按照规则一并删除person表相应的数据

(5)类的设计要求:

需要将数据库的连接、操作进行封装,以便在后续实验中进行重用。此项为扣分项,没有进行封装的实验分会相应扣减。
自此实验结束,按照要求提交源代码进行验收。
要求每个处理阶段均要在控制台打印出处理完成后的结果,格式按照制表方式输出,如:
表users
字段名xx 字段名xx ….
xx xx
表person
字段名xx 字段名xx ….
xx xx

实验代码

项目结构图

在这里插入图片描述
其中,config.properties为配置文件,PropertyUtil类加载配置文件,DButil类封装了链接数据库、增删改查等操作,User类是数据库中users表中一行数据的映射,Person类是数据库中person表中一行数据的映射,UserDao类实现对users表的具体操作,PersonDao类实现对person表的具体操作。

以下代码仅供参考

config.properties文件

url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
driverClass=com.mysql.cj.jdbc.Driver
user=root
password=********

这里只让配置文件提供了链接数据库时所需的url、驱动、数据库账号和密码。

PropertyUtil类

package lab1;
import java.io.*;
import java.util.Properties;
public class PropertyUtil {
    public static String getValue(String key){
        String ret = null;
        try{
            InputStream in = PropertyUtil.class.getResourceAsStream("config.properties");
            Properties properties = new Properties();
            properties.load(in);
            ret = properties.getProperty(key);
            in.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return ret;
    }
}

例:PropertyUtil.getValue(“user”) = “root”
即加载配置文件中的数据

DButil类

import java.util.*;
import java.sql.*;
public class DButil {
    private String url = PropertyUtil.getValue("url");
    private String user = PropertyUtil.getValue("user");
    private String password = PropertyUtil.getValue("password");
    private String driverClass = PropertyUtil.getValue("driverClass");
    private Connection con = null;
    public DButil(){
        con = getConnection();
    }
    public Connection getConnection() {
        Connection conn = null;
        try{
            System.out.println("正在连接数据库...");
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url,user,password);
            System.out.println("数据库连接成功!");
        }catch (Exception e){
            e.printStackTrace();
        }
        return conn;
    }
    //赠、删、改等调用这个函数
    public int executeUpdate(String sql,Object... params){
        int rlt = 0;
        try{
            PreparedStatement pstmt = null;
            pstmt = con.prepareStatement(sql);
            putParams(pstmt,params);
            rlt = pstmt.executeUpdate();
            pstmt.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return rlt;
    }
    //放置参数
    private void putParams(PreparedStatement pstmt, Object[] params) throws SQLException{
        if(params!=null){
            for(int i=0;i<params.length;++i){
                //pstmt.setObject(i+1,params);
                if(params[i] instanceof String) pstmt.setString(i+1,(String)params[i]);
                else if(params[i] instanceof Integer) pstmt.setInt(i+1,(Integer)params[i]);
                else if(params[i] == null) pstmt.setNull(i+1, Types.INTEGER);
            }
        }
    }
    //查询调用这个函数
    public List<Map<String,Object>> query(String sql,Object... params){
        PreparedStatement pstmt = null;
        List<Map<String,Object>> list = null;
        try{
            pstmt = con.prepareStatement(sql);
            putParams(pstmt,params);
            ResultSet rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            String[] keys = new String[rsmd.getColumnCount()];
            for(int i=1;i<=rsmd.getColumnCount();++i){
                keys[i-1] = rsmd.getColumnLabel(i);
            }
            list = new ArrayList<Map<String,Object>>();
            while(rs.next()){
                Map<String,Object> map = new HashMap<String,Object>();
                for(int i=0;i<keys.length;++i){
                    map.put(keys[i],rs.getObject(keys[i]));
                }
                list.add(map);
            }
            rs.close();
            pstmt.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }
    public void close(){
        if(this.con!=null){
            try{
                this.con.close();
                System.out.println("已关闭接口..");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

User类

public class User {
    private String username;//primary key
    private String password;
    public User(String username,String password){
        this.username = username;
        this.password = password;
    }
    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Person类

public class Person{
    private String username;
    private String name;//Primary key
    private Integer age;
    private String teleno;
    public Person(String username,String name,Integer age,String teleno){
        this.username = username;
        this.name = name;
        this.age = age;
        this.teleno = teleno;
    }
    public Person(String username,String name){
        this(username,name,null,"");
    }
    public Person(String username,String name,Integer age){
        this(username,name,age,"");
    }
    public String getUsername(){
        return username;
    }
    public String getName(){
        return name;
    }
    public Integer getAge(){
        return age;
    }
    public String getTeleno(){
        return teleno;
    }
    public void setUsername(String username){
        this.username = username;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(Integer age){
        this.age = age;
    }
    public void setTeleno(String teleno){
        this.teleno = teleno;
    }
}

UserDao类

/*
这个类中不要出现和SQL相关的类比如Connection、Statement、PreparedStatement、ResultSet等
*/
import java.util.*;
public class UserDao {
    public void createTable(DButil dbutil) throws Exception {
        String sql = "create table users"
                + "( "
                + "username varchar(10) not null,"
                + "pass varchar(8) not null,"
                + "primary key (username)"
                + ")";
        dbutil.executeUpdate(sql);
    }

    public void addUser(User u,DButil dbutil) throws Exception {
        String sql = "insert into users(username,pass) values(?, ?)";
        Object[] obj = {u.getUsername(),u.getPassword()};
        dbutil.executeUpdate(sql,obj);
    }

    public void delUserOnUsername(String username,DButil dbutil) throws Exception {
        String sql = "delete from users where username like ?";
        dbutil.executeUpdate(sql,username);
    }

    public void dropTable(DButil dbutil) throws Exception{
        String sql = "drop table users";
        dbutil.executeUpdate(sql);
    }

    public List<User> queAll(DButil dbutil) throws Exception {
        String sql = "select * from users";
        List<Map<String,Object>> list = dbutil.query(sql);
        List<User> userList = new ArrayList<>();
        User user = null;
        for(Map<String,Object> map:list){
            user = new User((String)map.get("username"),(String)map.get("pass"));
            //System.out.println(map.get("username")+" "+map.get("pass"));
            userList.add(user);
        }
        return userList;
    }
}

PersonDao类

/*
这个类中不要出现和SQL相关的类比如Connection、Statement、PreparedStatement、ResultSet等
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class PersonDao{
    public void createTable(DButil dbutil) throws Exception{
        String sql = "create table person"
                + "("
                + "username varchar(10) not null,"
                + "name varchar(20) not null,"
                + "age int default 18,"
                + "teleno char(11) default '18570253175',"
                + "primary key (name)"
                + ")";
        dbutil.executeUpdate(sql);
    }

    public void addPerson(Person p,DButil dbutil) throws Exception{
        String sql = "insert into person(username,name,age,teleno) values(?, ?, ?, ?)";
        Object[] obj = {p.getUsername(),p.getName(),p.getAge(),p.getTeleno()};
        dbutil.executeUpdate(sql,obj);
    }

    public void addOrModifyPerson(Person p,DButil dbutil) throws Exception{
        String sql_1 = "select * from person where username=?";
        List<Map<String,Object>> userlist,personlist;
        personlist = dbutil.query(sql_1,p.getUsername());
        if(personlist.isEmpty()){//person表中不存在该username
            String sql_2 = "select * from users where username=?";
            userlist = dbutil.query(sql_2,p.getUsername());
            if(userlist.isEmpty()){//user表中也不存在该username,
                String sql_3 = "insert into users(username,pass) values(?,?)";
                Object[] obj = {p.getUsername(), "888888"};//默认的passwaod为888888
                dbutil.executeUpdate(sql_3,obj);
            }
            String sql_4 = "insert into person(username,name,age,teleno) values(?, ?, ?, ?)";
            Object[] obj = {p.getUsername(),p.getName(),p.getAge(),p.getTeleno()};
            dbutil.executeUpdate(sql_4,obj);
        }
        else{
            String sql_5 = "update person set name=?,age=?,teleno=? where username=?";
            Object[] obj = {p.getName(),p.getAge(),p.getTeleno(),p.getUsername()};
            dbutil.executeUpdate(sql_5,obj);
        }
    }
    public void delPersonOnUsername(String username,DButil dbutil) throws Exception{
        String sql = "delete from person where username like ?";
        dbutil.executeUpdate(sql,username);
    }

    public void dropTable(DButil dbutil) throws Exception{
        String sql = "drop table person";
        dbutil.executeUpdate(sql);
    }

    public List<Person> queAll(DButil dbutil) throws Exception{
        String sql = "select * from person";
        List<Map<String,Object>> list = dbutil.query(sql);
        List<Person> personList = new ArrayList<>();
        Person person = null;
        for(Map<String,Object>map:list){
            person = new Person((String)map.get("username"),(String)map.get("name"),(Integer)map.get("age"),(String)map.get("teleno"));
            personList.add(person);
        }
        return personList;
    }
}

Main类

import java.util.*;
public class Main {
    DButil dbutil = new DButil();
    UserDao userDao = new UserDao();
    PersonDao personDao = new PersonDao();
    public void step_1()throws Exception{
        userDao.createTable(dbutil);//创建数据库表users
        personDao.createTable(dbutil);//创建数据库表person
        //打印结果
        userDao.queAll(dbutil);
        personDao.queAll(dbutil);
        show();
    }
    public void step_2() throws Exception{
        //在表users中插入4行数据
        userDao.addUser(new User("ly","123456"),dbutil);
        userDao.addUser(new User("liming","345678"),dbutil);
        userDao.addUser(new User("test","11111"),dbutil);
        userDao.addUser(new User("test1","12345"),dbutil);
        //在表person中插入3行数据
        personDao.addPerson(new Person("ly","雷力"),dbutil);
        personDao.addPerson(new Person("liming","李明",25),dbutil);
        personDao.addPerson(new Person("test","测试用户",20,"13388449933"),dbutil);
        //打印结果
        userDao.queAll(dbutil);
        personDao.queAll(dbutil);
        show();
    }
    public void step_3() throws Exception{
        //在person表中插入5行数据,对于表中已有的username,根据最新的数据修改;如不存在,首先在user表中插入该username,再插入person表
        personDao.addOrModifyPerson(new Person("ly","王五"),dbutil);
        personDao.addOrModifyPerson(new Person("test2","测试用户2"),dbutil);
        personDao.addOrModifyPerson(new Person("test1","测试用户1",33),dbutil);
        personDao.addOrModifyPerson(new Person("test","张三",23,"18877009966"),dbutil);
        personDao.addOrModifyPerson(new Person("admin","admin"),dbutil);
        //打印结果
        userDao.queAll(dbutil);
        personDao.queAll(dbutil);
        show();
    }
    public void step_4() throws Exception{
        //删除users表中test打头的username
        userDao.delUserOnUsername("test",dbutil);
        //删除person表中test打头的usename
        personDao.delPersonOnUsername("test%",dbutil);
        //打印结果
        userDao.queAll(dbutil);
        personDao.queAll(dbutil);
        show();
    }
    public void show() throws Exception{//输出格式就不搞的很好了
        System.out.println("表users:");
        System.out.println("+*************************************************************************+");
        System.out.println("|字段名 username                   字段名 pass                            |");
        System.out.println("+-------------------------------------------------------------------------+");
        List<User> list = userDao.queAll(dbutil);
        for(User user:list){
            String s1 = user.getUsername();
            String s2 = user.getPassword();
            System.out.printf("%20s"+"\t\t"+"%s"+"\t\t\n",s1,s2);
            System.out.println("+-------------------------------------------------------------------------+");
        }
        List<Person> personList = personDao.queAll(dbutil);
        System.out.println("表person:");
        System.out.println("+*************************************************************************+");
        System.out.println("|字段名 username        字段名 name        字段名age         字段名 teleno|");
        System.out.println("+-------------------------------------------------------------------------+");
        for(Person person:personList){
            String s1 = person.getUsername();
            String s2 = person.getName();
            Integer s3 = person.getAge();
            String s4 = person.getTeleno();
            System.out.printf("%10s"+"\t\t"+"%10s"+"\t\t",s1,s2);
            if(s3!=null) System.out.print(s3);
            System.out.println("\t\t"+s4);
            System.out.println("+-------------------------------------------------------------------------+");
        }
    }
    public static void main(String[] argc)throws Exception{
        Main m = new Main();
        m.userDao.dropTable(m.dbutil);
        m.personDao.dropTable(m.dbutil);
        System.out.println("第一步:");
        m.step_1();
        System.out.println("第二步:");
        m.step_2();
        System.out.println("第三步:");
        m.step_3();
        System.out.println("第四步:");
        m.step_4();
        m.dbutil.close();
    }
}

实验结果

(改前效果,格式什么的自己慢慢调吧)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要参考资料

【1】https://www.cnblogs.com/zxwen/p/9832385.html
【2】https://blog.csdn.net/kpchen_0508/article/details/41287137
【3】https://www.runoob.com/w3cnote/jdbc-use-guide.html
【4】https://blog.csdn.net/tangyuanzong/article/details/78346979

总结

这个实验是为后面做Java Web开发做准备的,此前没接触过此类知识,感觉挺有趣的,但前前后后也花了挺久,评分经历了从B到B-到B+,最后将查询操作改好就没再去验收了。感谢为我提供帮助的同学们以及老师。
这里列出老师提过的几点:

  • 少用静态变量,能不用就不用
  • 接口用一个
  • 不要把Connection等暴露出来,不安全(网上有相当一部分此类代码)
  • DButil类不要用单例模式

知识浅薄,若有错误、不足之处欢迎私信或留言。

实验5 常用类(2学时) 一、实验目的 1. 熟悉Java中的String、StringBuffer、Math、包装器类的使用方法。 2. 使用常用类解决一般性的应用问题。 3. 掌握JavaSE API文档的使用方法。 实验内容 1. 编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数。(字符串可以在main方法中指定) 2. 调用java.lang.Math的成员函数“public static double random()”运算下面表达式1000次,(int) (Math.random()*20+0.5),统计其中生成的整数0、1、2、……、20的个数分别是多少,并输出统计结果。 3. 编写一个方法,返回一个double型的维数组,数组中的元素通过解析字符串参数获得。例如,字符串参数:“1,2;3,4,5;6,7,8”,对应的数组为: d[0,0] = 1.0 d[0,1] = 2.0 d[1,0] = 3.0 d[1,1] = 4.0 d[1,2] = 5.0 d[2,0] = 6.0 d[2,1] = 7.0 d[2,2] = 8.0 三、实验要求 完成程序设计并提交实验报告。 实验6 容器(2学时) 一、实验目的 1. 熟悉容器类库中常用类的使用方法。 2. 使用常用容器类解决一般性的应用问题。 实验内容 1. 用HashMap模拟一个网上购物车。要求:从键盘输入5本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可以使用Scanner类】 2. 使用两个Stack类(JDK容器类库中的Stack类)实现一个队列类MyQueue,提供队列的入队列和出队列操作:enQueue和deQueue。 3. 写一个彩票程序:30选7。随机(1~30之间)生成7个随机数,注意不能重复。然后从键盘输入7个数,对比7个数是否与随机数有相同的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示等奖;如果中了5个号,显示三等奖。要求:首先写出程序的实现思想,特别是程序所使用的数据结构,然后写出Java实现代码。【说明:键盘输入可以使用Scanner类】 三、实验要求 完成程序设计并提交实验报告。 实验7 流(2学时) 一、实验目的 1. 熟悉流类库中各种常用流的使用方法。 2. 能够使用流类实现基本的文件读写。 实验内容 1. 编写程序,在控制台窗口提示输入两个整数,然后接收这两个整数,并输出它们的和。(要求:键盘输入通过流封装System.in获取,不要使用Scanner类) 2. 设计学生类Student,属性:编号(整型);姓名(字符串),成绩(整型)。编写一个程序:要求:(1)输入5个学生的姓名和成绩,将其姓名和成绩保存到data.txt中;(2)然后从该文件中读取数据,求得这五个学生的平均成绩。 三、实验要求 完成程序设计并提交实验报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>