1.创建Person类,Person的属性有: Strng name 姓名 String sex 性别 Integer age 年龄, String idNo 身份证号 Boolean isMerried 是否已婚 请生成相应的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,实现数据库操作。只生成第二题代码

时间: 2023-06-18 13:08:45 浏览: 73
先给出完整代码,再一步步解释。 ```java import java.lang.annotation.*; import java.util.Scanner; public class PersonInput implements PersonAction { private static Scanner input = new Scanner(System.in); @Override public Person process(Person person) { Class cls = person.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { boolean isAccess = field.isAccessible(); if (!isAccess) { field.setAccessible(true); } Label label = field.getAnnotation(Label.class); Column column = field.getAnnotation(Column.class); if (label != null) { System.out.print(label.value() + ": "); } if (column != null) { String inputStr = input.nextLine(); if (!column.nullable() && (inputStr == null || inputStr.length() == 0)) { System.out.println(column.label() + "不能为空"); inputStr = input.nextLine(); } if (column.maxLength() > 0 && inputStr.length() > column.maxLength()) { System.out.println(column.label() + "长度不能超过" + column.maxLength() + "个字符"); inputStr = input.nextLine(); } if (column.minLength() > 0 && inputStr.length() < column.minLength()) { System.out.println(column.label() + "长度不能少于" + column.minLength() + "个字符"); inputStr = input.nextLine(); } if (column.maxValue() > Long.MIN_VALUE) { long value = Long.parseLong(inputStr); if (value > column.maxValue()) { System.out.println(column.label() + "不能大于" + column.maxValue()); inputStr = input.nextLine(); } } if (column.minValue() < Long.MAX_VALUE) { long value = Long.parseLong(inputStr); if (value < column.minValue()) { System.out.println(column.label() + "不能小于" + column.minValue()); inputStr = input.nextLine(); } } try { if (field.getType() == String.class) { field.set(person, inputStr); } else if (field.getType() == Integer.class) { int value = Integer.parseInt(inputStr); field.set(person, value); } else if (field.getType() == Long.class) { long value = Long.parseLong(inputStr); field.set(person, value); } else if (field.getType() == Boolean.class) { boolean value = Boolean.parseBoolean(inputStr); field.set(person, value); } } catch (Exception e) { e.printStackTrace(); } } if (!isAccess) { field.setAccessible(false); } } return person; } } import java.lang.annotation.*; public class PersonDisplay implements PersonAction { @Override public Person process(Person person) { Class cls = person.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { boolean isAccess = field.isAccessible(); if (!isAccess) { field.setAccessible(true); } Label label = field.getAnnotation(Label.class); if (label != null) { try { System.out.println(label.value() + ": " + field.get(person)); } catch (Exception e) { e.printStackTrace(); } } if (!isAccess) { field.setAccessible(false); } } return person; } } @Target({ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @interface Label { String value(); } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface Column { String label(); boolean nullable() default true; int maxLength() default 0; int minLength() default 0; long maxValue() default Long.MIN_VALUE; long minValue() default Long.MAX_VALUE; } interface PersonAction { Person process(Person person); } class Person { @Label("姓名") @Column(label = "姓名", nullable = false, maxLength = 32) private String name; @Label("性别") @Column(label = "性别") private String sex; @Label("年龄") @Column(label = "年龄", minValue = 0, maxValue = 200) private Integer age; @Label("身份证号") @Column(label = "身份证号", maxLength = 18) private String idNo; @Label("是否已婚") @Column(label = "是否已婚") private Boolean 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 getMarried() { return isMarried; } public void setMarried(Boolean married) { isMarried = married; } } public class Main { private static final String CREATE_TABLE_SQL = "CREATE TABLE `person` (\n" + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + " `name` varchar(32) NOT NULL,\n" + " `sex` varchar(8) DEFAULT NULL,\n" + " `age` int(11) DEFAULT NULL,\n" + " `id_no` varchar(18) DEFAULT NULL,\n" + " `married` tinyint(1) DEFAULT NULL,\n" + " PRIMARY KEY (`id`)\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; private static final String DROP_TABLE_SQL = "DROP TABLE IF EXISTS `person`;"; private static final String INSERT_SQL = "INSERT INTO `person` (`name`, `sex`, `age`, `id_no`, `married`) VALUES (?, ?, ?, ?, ?);"; private static final String UPDATE_SQL = "UPDATE `person` SET `name`=?,`sex`=?,`age`=?,`id_no`=?,`married`=? WHERE `id`=?;"; private static final String DELETE_SQL = "DELETE FROM `person` WHERE `id`=?;"; public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456"); Statement stmt = conn.createStatement(); stmt.executeUpdate(DROP_TABLE_SQL); stmt.executeUpdate(CREATE_TABLE_SQL); PersonInput input = new PersonInput(); PersonDisplay display = new PersonDisplay(); Person person = new Person(); input.process(person); display.process(person); ps = conn.prepareStatement(INSERT_SQL); ps.setString(1, person.getName()); ps.setString(2, person.getSex()); ps.setInt(3, person.getAge()); ps.setString(4, person.getIdNo()); ps.setBoolean(5, person.getMarried()); ps.executeUpdate(); ps = conn.prepareStatement(UPDATE_SQL); ps.setString(1, person.getName()); ps.setString(2, person.getSex()); ps.setInt(3, person.getAge()); ps.setString(4, person.getIdNo()); ps.setBoolean(5, person.getMarried()); ps.setInt(6, 1); ps.executeUpdate(); ps = conn.prepareStatement(DELETE_SQL); ps.setInt(1, 1); ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } } } ``` 首先,我们定义了两个注解,@Label和@Column。其中,@Label是用来给类和属性添加中文名称的,@Column是用来给属性添加数据库字段的一些配置信息的。 ```java @Target({ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @interface Label { String value(); } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface Column { String label(); boolean nullable() default true; int maxLength() default 0; int minLength() default 0; long maxValue() default Long.MIN_VALUE; long minValue() default Long.MAX_VALUE; } ``` 然后,我们定义了一个Person类,它有姓名、性别、年龄、身份证号、是否已婚等属性,每个属性都添加了@Label和@Column注解。我们使用注解处理器,可以根据@Column注解的配置信息来进行输入校验,这样就可以避免输入错误的数据。同时,我们还定义了PersonInput和PersonDisplay两个类,它们都实现了PersonAction接口,分别用于输入和输出一个Person对象。 ```java class Person { @Label("姓名") @Column(label = "姓名", nullable = false, maxLength = 32) private String name; @Label("性别") @Column(label = "性别") private String sex; @Label("年龄") @Column(label = "年龄", minValue = 0, maxValue = 200) private Integer age; @Label("身份证号") @Column(label = "身份证号", maxLength = 18) private String idNo; @Label("是否已婚") @Column(label = "是否已婚") private Boolean 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 getMarried() { return isMarried; } public void setMarried(Boolean married) { isMarried = married; } } interface PersonAction { Person process(Person person); } public class PersonInput implements PersonAction { @Override public Person process(Person person) { Class cls = person.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { boolean isAccess = field.isAccessible(); if (!isAccess) { field.setAccessible(true); } Label label = field.getAnnotation(Label.class); Column column = field.getAnnotation(Column.class); if (label != null) { System.out.print(label.value() + ": "); } if (column != null) { String inputStr = input.nextLine(); if (!column.nullable() && (inputStr == null || inputStr.length() == 0)) { System.out.println(column.label() + "不能为空"); inputStr = input.nextLine(); } if (column.maxLength() > 0 && inputStr.length() > column.maxLength()) { System.out.println(column.label() + "长度不能超过" + column.maxLength() + "个字符"); inputStr = input.nextLine(); } if (column.minLength() > 0 && inputStr.length() < column.minLength()) { System.out.println(column.label() + "长度不能少于" + column.minLength() + "个字符"); inputStr = input.nextLine(); } if (column.maxValue() > Long.MIN_VALUE) { long value = Long.parseLong(inputStr); if (value > column.maxValue()) { System.out.println(column.label() + "不能大于" + column.maxValue()); inputStr = input.nextLine(); } } if (column.minValue() < Long.MAX_VALUE) { long value = Long.parseLong(inputStr); if (value < column.minValue()) { System.out.println(column.label() + "不能小于" + column.minValue()); inputStr = input.nextLine(); } } try { if (field.getType() == String.class) { field.set(person, inputStr); } else if (field.getType() == Integer.class) { int value = Integer.parseInt(inputStr); field.set(person, value); } else if (field.getType() == Long.class) { long value = Long.parseLong(inputStr); field.set(person, value); } else if (field.getType() == Boolean.class) { boolean value = Boolean.parseBoolean(inputStr); field.set(person, value); } } catch (Exception e) { e.printStackTrace(); } } if (!isAccess) { field.setAccessible(false); } } return person; } } public class PersonDisplay implements PersonAction { @Override public Person process(Person person) { Class cls = person.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { boolean isAccess = field.isAccessible(); if (!isAccess) { field.setAccessible(true); } Label label = field.getAnnotation(Label.class); if (label != null) { try { System.out.println(label.value() + ": " + field.get(person)); } catch (Exception e) { e.printStackTrace(); } } if (!isAccess) { field.setAccessible(false); } } return person; } } ``` 最后,我们在Main类中使用JDBC,将Person对象保存到数据库中。在保存之前,先执行了一次删除表和创建表的操作。 ```java public class Main { private static final String CREATE_TABLE_SQL = "CREATE TABLE `person` (\n" + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + " `name` varchar(32) NOT NULL,\n" + " `sex` varchar(8) DEFAULT NULL,\n" + " `age` int(11) DEFAULT NULL,\n" + " `id_no` varchar(18) DEFAULT NULL,\n" + " `married` tinyint(1) DEFAULT NULL,\n" + " PRIMARY KEY (`id`)\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; private static final String DROP_TABLE_SQL = "DROP TABLE IF EXISTS `person`;"; private static final String INSERT_SQL = "INSERT INTO `person` (`name`, `sex`, `age`, `id_no`, `married`) VALUES (?, ?, ?, ?, ?);"; private static final String UPDATE_SQL = "UPDATE `person` SET `name`=?,`sex`=?,`age`=?,`id_no`=?,`married`=? WHERE `id`=?;"; private static final String DELETE_SQL = "DELETE FROM `person` WHERE `id`=?;"; public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456"); Statement stmt = conn.createStatement(); stmt.executeUpdate(DROP_TABLE_SQL); stmt.executeUpdate(CREATE_TABLE_SQL); PersonInput input = new PersonInput(); PersonDisplay display = new PersonDisplay(); Person person = new Person(); input.process(person); display.process(person); ps = conn.prepareStatement(INSERT_SQL); ps.setString(1, person.getName()); ps.setString(2, person.getSex()); ps.setInt(3, person.getAge()); ps.setString(4, person.getIdNo()); ps.setBoolean(5, person.getMarried()); ps.executeUpdate(); ps = conn.prepareStatement(UPDATE_SQL); ps.setString(1, person.getName()); ps.setString(2, person.getSex()); ps.setInt(3, person.getAge()); ps.setString(4, person.getIdNo()); ps.setBoolean(5, person.getMarried()); ps.setInt(6, 1); ps.executeUpdate(); ps = conn.prepareStatement(DELETE_SQL); ps.setInt(1, 1);

相关推荐

最新推荐

recommend-type

锂电池涂布模头,全球前7强生产商排名及市场份额.docx

锂电池涂布模头,全球前7强生产商排名及市场份额
recommend-type

ISO IEC 21964-2-2018.pdf

ISO IEC 21964-2-2018.pdf
recommend-type

编译程序构造的一般原理和基本方法.pdf

编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本
recommend-type

海关商品编码/HS编码表

用于海关申报商品编码/HS编码信息
recommend-type

node-v9.6.1-linux-arm64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

利用Python发现一组数据符合非中心t分布并获得了拟合参数dfn,dfc,loc,scale,如何利用scipy库中的stats模块求这组数据的数学期望和方差

可以使用scipy库中的stats模块的ncx2和norm方法来计算非中心t分布的数学期望和方差。 对于非中心t分布,其数学期望为loc,方差为(scale^2)*(dfc/(dfc-2)),其中dfc为自由度,scale为标准差。 代码示例: ``` python from scipy.stats import ncx2, norm # 假设数据符合非中心t分布 dfn = 5 dfc = 10 loc = 2 scale = 1.5 # 计算数学期望 mean = loc print("数学期望:", mean) # 计算方差 var = (scale**2) * (dfc /
recommend-type

建筑供配电系统相关课件.pptx

建筑供配电系统是建筑中的重要组成部分,负责为建筑内的设备和设施提供电力支持。在建筑供配电系统相关课件中介绍了建筑供配电系统的基本知识,其中提到了电路的基本概念。电路是电流流经的路径,由电源、负载、开关、保护装置和导线等组成。在电路中,涉及到电流、电压、电功率和电阻等基本物理量。电流是单位时间内电路中产生或消耗的电能,而电功率则是电流在单位时间内的功率。另外,电路的工作状态包括开路状态、短路状态和额定工作状态,各种电气设备都有其额定值,在满足这些额定条件下,电路处于正常工作状态。而交流电则是实际电力网中使用的电力形式,按照正弦规律变化,即使在需要直流电的行业也多是通过交流电整流获得。 建筑供配电系统的设计和运行是建筑工程中一个至关重要的环节,其正确性和稳定性直接关系到建筑物内部设备的正常运行和电力安全。通过了解建筑供配电系统的基本知识,可以更好地理解和应用这些原理,从而提高建筑电力系统的效率和可靠性。在课件中介绍了电工基本知识,包括电路的基本概念、电路的基本物理量和电路的工作状态。这些知识不仅对电气工程师和建筑设计师有用,也对一般人了解电力系统和用电有所帮助。 值得一提的是,建筑供配电系统在建筑工程中的重要性不仅仅是提供电力支持,更是为了确保建筑物的安全性。在建筑供配电系统设计中必须考虑到保护装置的设置,以确保电路在发生故障时及时切断电源,避免潜在危险。此外,在电气设备的选型和布置时也需要根据建筑的特点和需求进行合理规划,以提高电力系统的稳定性和安全性。 在实际应用中,建筑供配电系统的设计和建设需要考虑多个方面的因素,如建筑物的类型、规模、用途、电力需求、安全标准等。通过合理的设计和施工,可以确保建筑供配电系统的正常运行和安全性。同时,在建筑供配电系统的维护和管理方面也需要重视,定期检查和维护电气设备,及时发现和解决问题,以确保建筑物内部设备的正常使用。 总的来说,建筑供配电系统是建筑工程中不可或缺的一部分,其重要性不言而喻。通过学习建筑供配电系统的相关知识,可以更好地理解和应用这些原理,提高建筑电力系统的效率和可靠性,确保建筑物内部设备的正常运行和电力安全。建筑供配电系统的设计、建设、维护和管理都需要严谨细致,只有这样才能确保建筑物的电力系统稳定、安全、高效地运行。