【Java高级程序设计】注解实验

这篇具有很好参考价值的文章主要介绍了【Java高级程序设计】注解实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.创建Person类,Person的属性有: String name 姓名 String sex 性别 Integer age 年龄, String idNo 身份证号 Boolean isMarried 是否已婚 请生成相应的getter、setter方法。请编写注解@Label,表示所注解对象的中文名称, 请把@Label注解标注在Person类和Person的每个属性上面。 请编写PersonInput类,负责提示录入人员的相关属性,提示必须是注解@Label所标注的中文名称。 请编写PersonDisplay,负责显示人员信息,显示时的属性名称必须为注解@Label所标注的中文名称 PersonInput类与PersonDisplay类实现了共同的接口PersonAction,接口PersonAction有方法process,方法process的签名为:public Person process(Person person);

2.

在第一题目的基础上,编写注解@Column, 属性有Label 表示类的属性的显示名称, Nullable 表示是否允许属性值为空, MaxLength 表示文本属性的最大长度, MinLength表示文本属性的最小长度, MaxValue表示最大值, MinValue表示最小值,

把注解@Column加在Person类的每个属性上,在输入Person时根据注解@Column的配置进行校验。 第一题的@Label只标注在类上。根据注解生成Person类对应的数据库表创建语句,以及生成数据库表的删除、新增、修改SQL语句。 并利用JDBC,实现数据库操作。

第一题:

@Label注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Label {
    String value();
}

person类:

public class Person {

    @Label("姓名")
    String name;         //姓名
    @Label("性别")
    String sex;          //性别
    @Label("年龄")
    Integer age;         //年龄
    @Label("身份证号")
    String idNo;         //身份证号
    @Label("是否已婚")
    Boolean isMarried;   //是否已婚

    public Person() {
    }

    public Person(String name, String sex, Integer age, String idNo, boolean isMarried) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.idNo = idNo;
        this.isMarried = isMarried;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getIdNo() {
        return idNo;
    }

    public void setIdNo(String idNo) {
        this.idNo = idNo;
    }

    public Boolean isMarried() {
        return isMarried;
    }

    public void setMarried(Boolean married) {
        isMarried = married;
    }
}

 PersonAction接口:

//注解处理器接口
public interface PersonAction {
    public Person process(Person person) throws IllegalAccessException;
}

PersonInput类,负责提示录入人员的相关属性,提示必须是注解@Label所标注的中文名称。

import java.lang.reflect.Field;
import java.util.Scanner;

/**
 * 负责提示录入人员的相关属性,提示必须是注解@Label所标注的中文名称。
 */
public class PersonInput implements PersonAction {


    @Override
    public Person process(Person person) throws IllegalAccessException {
        Scanner input = new Scanner(System.in);

        Class clazz = person.getClass();//获取Class对象
        Field[] fields = clazz.getDeclaredFields();//通过Class对象获取Field对象

        //遍历获取的person对象的所有字段
        for (Field field : fields) {
            Object obj = field.get(person);
            if (obj == null) {
                String s = field.getAnnotation(Label.class).value();
                System.out.print("请输入" + s + ":");
                String s1 = input.next();

                if (field.getType().getName().contains("String")) {//获取的字段是String类型
                    field.set(person, s1);
                } else if (field.getType().getName().contains("Integer")) {//获取的字段是Integer类型
                    field.set(person, Integer.parseInt(s1));
                } else if (field.getType().getName().contains("Boolean")) {//获取字段是Boolean类型
                    field.set(person, Boolean.parseBoolean(s1));
                }
            }
        }

        return person;

    }
}


PersonDisplay,负责显示人员信息,显示时的属性名称必须为注解@Label所标注的中文名称

import java.lang.reflect.Field;

/**
 * 负责显示人员信息,显示时的属性名称必须为注解@Label所标注的中文名称,
 */
public class PersonDisplay implements PersonAction {

    @Override
    public Person process(Person person) throws IllegalAccessException {
        Class clazz = person.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {

            //获取Label注解的value值
            if (field.isAnnotationPresent(Label.class)) {
                String name = field.getAnnotation(Label.class).value();
                System.out.print(name + ":");
            }

            //获取属性的值
            Object obj = field.get(person);
            System.out.println(obj);
        }
        return person;
    }
}

测试类:

public class text {
    public static void main(String[] args) throws IllegalAccessException {
        Person person = new Person();

        PersonInput personInput = new PersonInput();
        personInput.process(person);

        PersonDisplay personDisplay = new PersonDisplay();
        personDisplay.process(person);
    }
}

运行结果:

【Java高级程序设计】注解实验

 第二题:

@Column注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    Label label(); //  表示类的属性的显示名称,

    boolean Nullable() default false;//  Nullable 表示是否允许属性值为空

    int MaxLength() default 100;//  MaxLength 表示文本属性的最大长度

    int MinLength() default 0;//  MinLength表示文本属性的最小长度

    int MaxValue() default 999999999;//  MaxValue表示最大值

    int MinValue() default 0;//   MinValue表示最小值

}

Person类:

@Column(label = @Label("Person"))
public class Person {


    @Column(label = @Label("姓名"))
    String name;         //姓名
    @Column(label = @Label("性别"))
    String sex;          //性别
    @Column(label = @Label("年龄"), MaxValue = 120)
    Integer age;         //年龄
    @Column(label = @Label("身份证号"))
    String idNo;         //身份证号
    @Column(label = @Label("是否已婚"))
    Boolean isMarried;   //是否已婚

    public Person() {
    }

    public Person(String name, String sex, Integer age, String idNo, boolean isMarried) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.idNo = idNo;
        this.isMarried = isMarried;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getIdNo() {
        return idNo;
    }

    public void setIdNo(String idNo) {
        this.idNo = idNo;
    }

    public Boolean isMarried() {
        return isMarried;
    }

    public void setMarried(Boolean married) {
        isMarried = married;
    }
}

MySqlDAO类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MySqlDAO {
    public static Connection getConnection() throws Exception {
        String driverName = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/demo";
        String userName = "root";
        String pw = "xx";
        Class.forName(driverName);
        Connection con = DriverManager.getConnection(url, userName, password);
        return con;
    }

    public static PreparedStatement preparedStatement(String sql) throws Exception {
        return getConnection().prepareStatement(sql);
    }
}

CreateSQL类:

import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

/**
 * 把注解@Column加在Person类的每个属性上,在输入Person时根据注解@Column的配置进行校验。
 * 第一题的@Label只标注在类上。根据注解生成Person类对应的数据库表创建语句,以及生成数据库表的删除、新增、修改SQL语句。
 * 并利用JDBC,实现数据库操作。
 */
public class CreateSQL {
    static PreparedStatement pd = null;
    static ResultSet rs;
    static Scanner input = new Scanner(System.in);

    public String CreateTable(Person person) {
        Class<? extends Person> clazz = person.getClass();
        Field[] fields = clazz.getDeclaredFields();
        Label name = clazz.getAnnotation(Column.class).label();
        StringBuilder sql = new StringBuilder("create table if not exists " + name.value() + "(\n");

        for (Field field : fields) {
            String str = field.getAnnotation(Column.class).label().value();
            int maxLength = field.getAnnotation(Column.class).MaxLength();

            //如果时Integer类型
            if (field.getType().getName().contains("Integer")) {
                sql.append(str).append(" int,\n");
            }
            //如果是Boolean或者String类型
            if (field.getType().getName().contains("String") || field.getType().getName().contains("Boolean")) {
                sql.append(str).append(" varchar(").append(maxLength).append("),\n");
            }

            //添加主键
            if (str.equals("身份证号")) {
                sql = new StringBuilder(sql.substring(0, sql.length() - 2));//截取字符串
                sql.append(" primary key,\n");
            }
        }

        sql = new StringBuilder(sql.substring(0, sql.length() - 2));
        sql.append("\n);");
        System.out.println(sql);
        return sql.toString();
    }

    public String InsertInf(Person person) {
        Class<? extends Person> clazz = person.getClass();
        Label name = clazz.getAnnotation(Column.class).label();
        StringBuilder sql = new StringBuilder("insert into " + name.value() + " values(");
        Field[] fields = clazz.getDeclaredFields();

        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            String value = field.getAnnotation(Column.class).label().value();
            System.out.println("请输入" + value + ": ");
            String str = input.next();

            //根据注解@Column的配置进行校验
            if (!isTrue(field, str)) {
                i--;
                continue;
            }

            //判断性别输入是否输入正确
            if (value.equals("性别")) {
                if (!str.equals("男") && !str.equals("女")) {
                    System.out.println("您输入的性别不符合规范请重新输入!");
                    i--;
                    continue;
                }
            }
            //判断是否结婚输入是否正确
            if (value.equals("是否结婚")) {
                if (!str.equals("是") && !str.equals("否")) {
                    System.out.println("您输入的结婚情况不符合规范请重新输入!");
                    i--;
                    continue;
                }
            }
            if (!isContainNum(str)) {
                sql.append("'").append(str).append("'").append(", ");
            } else {
                sql.append(str).append(", ");
            }
        }

        sql = new StringBuilder(sql.substring(0, sql.length() - 2));
        sql.append(");");
        System.out.println(sql);
        return sql.toString();

    }

    public String deleteInf(Person person) {
        Class<? extends Person> clazz = person.getClass();
        Label name = clazz.getAnnotation(Column.class).label();
        StringBuilder sql = new StringBuilder("delete from " + name.value() + " where ");
        Field[] fields = clazz.getDeclaredFields();
        String value = fields[0].getAnnotation(Column.class).label().value();

        System.out.println("请输入您要删除的" + value + ": ");
        String str = input.next();
        if (!isContainNum(str)) {
            sql.append(value).append(" = ").append("'").append(str).append("'");
        } else
            sql.append(value).append(" = ").append(str).append(";");
        System.out.println(sql);
        return sql.toString();

    }

    //更新操作
    public String updateInf(Person person) {
        Class<? extends Person> clazz = person.getClass();
        Label tableName = clazz.getAnnotation(Column.class).label();
        String sql = "update " + tableName.value() + " set ";
        Field[] fields = clazz.getDeclaredFields();
        String[] values = new String[fields.length];

        System.out.println("请输入要修改的姓名:");
        String str2 = input.nextLine();
        System.out.println("请选择您要修改的属性:");
        for (int i = 0; i < values.length; i++) {
            values[i] = fields[i].getAnnotation(Column.class).label().value();
            System.out.println((i + 1) + "--" + values[i]);
        }
        String choice = input.nextLine();
        int choiceNum = Integer.parseInt(choice);

        String str1;
        while (true) {
            System.out.println("请输入修改后的值:");
            str1 = input.nextLine();
            if (isTrue(fields[choiceNum - 1], str1)) {
                break;
            }
        }

        switch (choiceNum) {
            case 1:
                if (!isContainNum(str1)) {
                    sql += values[0] + " = " + "\"" + str1 + "\"";
                } else {
                    sql += values[0] + " = " + str1;
                }
                break;
            case 2:
                if (!isContainNum(str1)) {
                    sql += values[1] + " = " + "\"" + str1 + "\"";
                } else {
                    sql += values[1] + " = " + str1;
                }
                break;
            case 3:
                if (!isContainNum(str1)) {
                    sql += values[2] + " = " + "\"" + str1 + "\"";
                } else {
                    sql += values[2] + " = " + str1;
                }
                break;
            case 4:
                if (!isContainNum(str1)) {
                    sql += values[3] + " = " + "\"" + str1 + "\"";
                } else {
                    sql += values[3] + " = " + str1;
                }
                break;
            case 5:
                if (!isContainNum(str1)) {
                    sql += values[4] + " = " + "\"" + str1 + "\"";
                } else {
                    sql += values[4] + " = " + str1;
                }
                break;
            default:
                break;
        }

        if (!isContainNum(str2)) {
            sql += " where " + fields[0].getAnnotation(Column.class).label() + " = " + "\"" + str2 + "\"";
        } else {
            sql += " where " + fields[0].getAnnotation(Column.class).label() + " = " + str2;
        }
        System.out.println(sql);
        return sql;
    }


    //根据注解@Column的配置进行校验
    public boolean isTrue(Field f, String str) {
        String value = f.getAnnotation(Column.class).label().value();
        boolean nullable = f.getAnnotation(Column.class).Nullable();
        int maxLength = f.getAnnotation(Column.class).MaxLength();
        int minLength = f.getAnnotation(Column.class).MinLength();
        int maxValue = f.getAnnotation(Column.class).MaxValue();
        int minValue = f.getAnnotation(Column.class).MinValue();
        if (!nullable && str.isEmpty()) {
            System.out.println("输入的信息不能为空!请重新输入");
            return false;
        }
        if (maxLength == 0) {
            int num;
            try {
                num = Integer.parseInt(str);
            } catch (Exception e) {
                System.out.println("您输入的" + value + "不符合规范!请重新输入");
                return false;
            }

            if (num < minValue || num > maxValue) {
                System.out.println("您输入的" + value + "不符合规范!请重新输入");
                return false;
            }
        } else {
            int len = str.length();
            if (len > maxLength || len < minLength) {
                System.out.println("您输入的" + value + "不符合规范!请重新输入");
                return false;
            }
        }
        return true;
    }

    public static boolean isContainNum(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) > '0' && str.charAt(i) < '9') {
                return true;
            }
        }
        return false;
    }
}

ExecuteSQL类:

import java.sql.PreparedStatement;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.Scanner;

/**
 * 把注解@Column加在Person类的每个属性上,在输入Person时根据注解@Column的配置进行校验。
 * 第一题的@Label只标注在类上。根据注解生成Person类对应的数据库表创建语句,以及生成数据库表的删除、新增、修改SQL语句。
 * 并利用JDBC,实现数据库操作。
 */
public class ExecuteSQL {
    static PreparedStatement ps = null;
    static CreateSQL sql = new CreateSQL();
    static Scanner input = new Scanner(System.in);
    static Person person = new Person();

    public static void main(String[] args) throws Exception {
        mainMenu();
        closeConnection();

    }

    public static void mainMenu() throws Exception {
        System.out.println("请选择您要进行的操作:");
        System.out.println("1--自动生成表Person");
        System.out.println("2--增加数据");
        System.out.println("3--删除数据");
        System.out.println("4--修改数据");
        System.out.println("5--退出程序");

        Scanner sc = new Scanner(System.in);
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                createTable();
                mainMenu();
                break;
            case 2:
                insert();
                mainMenu();
                break;
            case 3:
                delete();
                mainMenu();
                break;
            case 4:
                update();
                mainMenu();
                break;
            case 5:
                break;
            default:
                System.out.println("请输入正确的选项!");
                mainMenu();
                break;
        }
    }

    //建表
    public static void createTable() throws Exception {
        System.out.println("生成表中......");
        String create = sql.CreateTable(person);
        ps = MySqlDAO.preparedStatement(create);
        ps.executeUpdate();
        System.out.println("成功生成");
    }

    //向表中添加信息
    public static void insert() throws Exception {
        try {
            String insertSQL = sql.InsertInf(person);
            ps = MySqlDAO.preparedStatement(insertSQL);
            ps.executeUpdate();
        } catch (SQLIntegrityConstraintViolationException e) {
            System.out.println("您输入的身份证号码有重复,请重新输入");
            insert();
        }
    }

    //删除信息1
    public static void delete() throws Exception {
        String deleteSQL = sql.deleteInf(person);
        ps = MySqlDAO.preparedStatement(deleteSQL);
        ps.executeUpdate();
    }

    //更新信息
    public static void update() throws Exception {
        String updateSQL = sql.updateInf(person);
        ps = MySqlDAO.preparedStatement(updateSQL);
        ps.executeUpdate();
    }

    public static void closeConnection() throws Exception {
        ps.close();
        MySqlDAO.getConnection().close();
    }


}

运行结果:(当时时间不太够,如果时间够建议自己做一个GUI)

【Java高级程序设计】注解实验

 文章来源地址https://www.toymoban.com/news/detail-469012.html

到了这里,关于【Java高级程序设计】注解实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面向对象程序设计实验报告(实验二 面向对象基础练习)

     ✨ 作者: 命运之光  ✨  专栏:Java面向对象程序设计实验报告 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) 测试类demo2 Address类 Employee类 实验二 面向对象基础练习 实验环境: Eclipse+JDK 实验目的:

    2024年02月06日
    浏览(55)
  • Java程序设计:选实验6 输入输出应用

    (1) 编写一个程序,如果文件Exercisel_01.txt 不存在,就创建一个名为Exercisel_01.txt 的文件。向这个文件追加新数据。使用文本I/O将20个随机生成的整数写入这个文件。文件中的整数用空格分隔。 (2) 编写一个程序,如果文件Exercisel_02.dat 不存在,就创建一个名为Exercisel_02.dat 的文件

    2024年01月19日
    浏览(32)
  • 实验六 Java流式编程与网络程序设计

    Client Server ClientPlus ServerPlus ReceiveThread 本关任务:编写应用程序(SortArray.java),使用字节输入/输出流实现数据的保存和读取。 Java 流功能相关的类都封装在 java.io包中,所以要使用流类,必须导入java.io包。数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的

    2024年02月03日
    浏览(36)
  • 【Java基础教程】(二十六)Java新特性篇 · 第六讲:注解——解码程序设计中的元数据利器,用小小的@符里做大大的开发~

    Java 注解(Annotation) 是Java语言中一种元数据形式,它提供了一种在代码中添加元数据的方式。注解为程序员提供了向代码中添加额外信息的能力,这些额外信息可以被编译器、工具或者运行时环境使用。 优点: 提供了一种 更加简洁和可读性强 的代码编写风格; 增强代码的

    2024年02月16日
    浏览(25)
  • 基于java微信小程序教室实验室预约系统设计与实现

    开发概要 小程序开发:微信开发者工具(MINA框架) 后台环境:JDK1.8 + Tomcat8 后台开发语言:Java 后台开发框架:springboot 后台模板引擎:Thymeleaf 后台开发工具:Idea2020 数据库:mysql8 数据库管理工具:navicat 其他开发语言:html + css +javascript

    2024年02月11日
    浏览(55)
  • 计算机团队毕业设计:JAVA教室实验室预约系统+微信小程序系统设计与实现

    本次选用JAVA进行教室实验室预约系统团队毕业设计开发,包含:WEB网站系统+微信小程序系统。   开发操作系统:windows10 + 8G内存 + 500G WEB开发环境:JDK1.8 + Tomcat8 WEB开发语言:Java WEB开发框架:springboot WEB模板引擎:Thymeleaf WEB常规技术:html + css +javascript WEB开发工具:Idea 数据

    2024年02月13日
    浏览(38)
  • 合肥工业大学宣城校区Java技术实验二 基于GUI的网络通信程序设计

    1.掌握Java中GUI程序的编写,包括事件监听机制。 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用。 3.掌握Java中多线程的编程,Thread类,Runnable接口的使用。 4.掌握用面向对象的方法分析和解决复杂问题。 编写程序完成以下功能: 1.设计一个基于GUI的客户-服务器的

    2023年04月24日
    浏览(33)
  • 郑州轻工业大学-程序设计技术(Java)-PTA实验1(7-5)-打印杨辉三角

    本段代码知识点在于对 for循环的应用 以及 二维数组的使用 ,同时将 if/else语句 嵌套在for循环中,并且在输出阶段对 格式 进行了规范,以下是详解: 1. for循环 在Java语言中,有三种循环语句,分别是for语句,while语句以及do-while语句,其中for语句的使用在代码编写的过程中最

    2024年04月08日
    浏览(33)
  • 【高级程序设计语言C++】特殊类设计

    拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 用C++11的话,可以使用特殊的语法来实现一个不能被拷贝的类。在C++11中,可以使用删除函数(deleted function)来禁用拷

    2024年02月10日
    浏览(29)
  • 【高级程序设计语言C++】初识模板

    概念: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 具体格式: templatetypename T1, typename T2,…,typename Tn 返回值类型 函数名(参数列表){} 输出结果: typename是用来定义模板参数,也可以使用class(切记

    2024年02月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包