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)
文章来源:https://www.toymoban.com/news/detail-469012.html
文章来源地址https://www.toymoban.com/news/detail-469012.html
到了这里,关于【Java高级程序设计】注解实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!