自定义ORM注解实现生成查询语句

package Annotation.Test;

@Table("Student")
public class Student {

	@Column("Id")
	private String Id;
	
	@Column("name")
	private String name;
	
	@Column("age")
	private int age;

	public String getId() {
		return Id;
	}

	public void setId(String id) {
		Id = id;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

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

}



注解类:



/*用来映射表名称的注解*/
@Target({ElementType.TYPE})  //应用于类或接口
@Retention(RetentionPolicy.RUNTIME)  //方便运行时通过反射获取到
@Inherited  //类注解可被类继承
@Documented
public @interface Table {
	String value();
}


@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Column {
	String value();// 用于描述映射表字段的值
}


测试方法:


/*测试通过获取注解的信息生成sql语句*/
public class TestGenerateSQL {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

		Student stu = new Student();
		//stu.setId("1000");
		stu.setName("水田奈落");
		stu.setAge(23);
		System.out.println(QueryStu(stu));

	}

	public static String QueryStu(Student stu) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		StringBuilder sb=new StringBuilder("select * from ");
		
		// 获取类的class
		Class stuClass = stu.getClass();
		
		/*通过获取类的类注解,来获取类映射的表名称*/
		if(stuClass.isAnnotationPresent(Table.class)){  //如果类映射了表
			Table table=(Table)stuClass.getAnnotation(Table.class);
			sb.append(table.value()+" where 1=1 ");  //加入表名称
			
			/*遍历所有的字段*/
			Field[] fields=stuClass.getDeclaredFields();//获取类的字段信息
			for(Field field : fields){
				if(field.isAnnotationPresent(Column.class)){
					Column col=field.getAnnotation(Column.class); //获取列注解
					String fieldName=field.getName(); //获取字段名称
					String MethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);//获取字段的get方法
					Method method=stuClass.getMethod(MethodName); //get到field的值
					
					/*空字段跳过拼接过程。。。*/
					if(method.invoke(stu)==null || (method.invoke(stu) instanceof Integer && (Integer)method.invoke(stu)==0)){ //如果没有值,不拼接
						continue;
					}
					
					/*通过函数的返回值类型来判断我强制转换时候该转换成什么类型*/
					if(method.getReturnType()==String.class){ 
						String fieldValue=(String)method.invoke(stu, null);
						sb.append("and "+fieldName+"="+"'"+fieldValue+"'");
					}else if(method.getReturnType()==int.class){
						Integer fieldValue=(Integer) method.invoke(stu, null);
						sb.append("and "+fieldName+"="+fieldValue);
					}//根据情况else 其他数据类型,看着玩儿吧....
				}else{
					continue;
				}
			}
		}else{
			return null;
		}
		return sb.toString();
	}

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis Plus 是一个增强的 MyBatis 框架,提供了许多常用的注解来简化操作。以下是一些常用的 MyBatis Plus 注解: - `@TableName`:标注实体类对应的数据库表名。 - `@TableId`:标注实体类中对应的主键字段。 - `@TableField`:标注实体类中对应的数据库字段。 - `@Version`:标注乐观锁字段。 - `@Transient`:标注不需要映射到数据库表中的字段。 - `@KeySequence`:标注使用数据库序列生成主键的实体类。 - `@SqlParser`:标注是否需要 MyBatis Plus 的执行分析插件。 ### 回答2: MyBatisPlus是一个基于MyBatis的轻量级ORM框架,提供了一些常用注解来简化数据库操作。 1. @TableName:用于指定实体类对应的数据库表名,可以在类级别上使用。 2. @TableId:用于指定实体类的主键字段,并可以设置主键生成策略。 3. @TableField:用于指定实体类字段与数据库表字段的映射关系,可以指定字段名、是否进行主键策略等。 4. @Version:用于实现乐观锁,指定实体类中的版本字段。 5. @EnumValue:用于枚举字段与数据库中存储值的映射关系。 6. @TableLogic:用于逻辑删除,实体类中指定一个逻辑删除的字段。 7. @KeySequence:用于指定主键序列的名称,主要用于Oracle数据库。 8. @SqlParser:用于指定在进行SQL解析时的一些属性,如过滤条件等。 9. @SqlJoin:用于指定查询时的多表关联查询。 10. @SqlStatement:用于自定义SQL的注解,可以指定SQL语句和对应的操作类型。 这些注解可以在实体类中使用,通过对实体类进行注解配置,MyBatisPlus可以自动根据注解生成对应的SQL语句,简化了数据库操作的编写。同时,这些注解提供了一些额外的功能,如乐观锁、逻辑删除等,方便开发者进行数据库操作和管理。总之,MyBatisPlus的常用注解可以简化开发者对数据库的操作,提高开发效率。 ### 回答3: MyBatisPlus是一个用于简化MyBatis操作的开源框架,它提供了许多常用的注解来增强MyBatis的功能,使开发更加便捷和高效。 1. @TableName注解:用于标识实体类与数据库表之间的映射关系,通过指定表名可以方便地进行CRUD操作。 2. @TableField注解:用于标识实体类中的字段,可以指定字段名、是否为主键、是否为自增等属性,方便进行数据库操作。 3. @TableId注解:用于标识实体类中的主键字段,可以指定主键的生成策略,包括自增、UUID、雪花算法等,简化主键的处理。 4. @Result注解:用于指定查询结果的映射关系,可以通过指定列名、Java属性名等方式进行映射,确保查询结果正确转换为实体对象。 5. @Insert注解:用于标识插入操作,可以直接将实体对象插入到数据库中,提高插入效率。 6. @Update注解:用于标识更新操作,可以根据条件更新实体对象的属性值,避免手动拼接更新语句。 7. @Delete注解:用于标识删除操作,可以根据条件删除数据库中的数据,简化删除数据的操作。 8. @Select注解:用于标识查询操作,可以根据条件查询数据库中的数据,方便地进行数据查询。 总之,MyBatisPlus提供了一系列常用的注解,可以简化开发人员的操作,提高开发效率。使用这些注解,我们可以更加方便地完成数据库操作,减少了手动sql编写的工作量,提高了开发速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值