【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);
    }
}

运行结果:

 第二题:

@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)

 

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JavaMVC 是一个基于 Java 的 Web MVC 框架,它可以帮助开发者快速构建 Java Web 应用程序。JavaMVC 的核心设计思想是 MVC(Model-View-Controller)模式,将应用程序分为模型、视图和控制器三个部分,以实现解耦和模块化的设计。 下面是一个简单的 JavaMVC 应用程序的设计流程: 1. 定义模型(Model):模型是应用程序的核心,通常与数据库交互以提供数据。定义模型时需要考虑数据库表结构、数据型、数据校验等因素。 2. 定义视图(View):视图是用于展示数据的部分,通常是 HTML 页面或者 JSP 页面。视图需要根据需求设计页面结构、样式和交互效果。 3. 定义控制器(Controller):控制器是用于处理用户请求的部分,通常负责解析请求、调用模型获取数据、将数据传递给视图展示等工作。控制器需要考虑路由设计、请求参数获取、异常处理等因素。 4. 整合模型、视图和控制器:在 JavaMVC 中,可以使用框架提供的注解(Annotation)来定义模型、视图和控制器,然后使用框架提供的路由器(Router)将它们整合在一起。 5. 部署应用程序:最后,将应用程序部署到 Web 服务器上,用户就可以通过浏览器访问应用程序了。 以上是简单的设计流程,具体实现需要根据具体的应用场景进行调整。同时,在开发过程中需要注意安全性、性能、可维护性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天的命名词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值