这里写自定义目录标题
一个最简单的ORM总结下来就两部分:
* 根据entity上的自定义注解生成mapping元数据信息
* 生成mapper接口的动态代理,根据具体的方法,动态生成sql并执行sql,然后通过反射的方式映射到具体的实体对象上去
解析自定义注解,生成元数据信息
首先我们先定义几个元信息注解:
@Table
注解在entity类上,标注这个实体类对应的数据库的表名
/**
* TODO
*
* @author : xiaojun
* @since 10:57 2018/11/19
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
/**
* <p>
* 实体对应的表名
* </p>
*/
String value() default "";
}
@Column
标注在实体类的属性上,用来和表的字段名进行映射
package com.example.mybatisplusdemo.orm.annotation;
import java.lang.annotation.*;
/**
* 数据库表的列名
*
* @author : xiaojun
* @since 10:58 2018/11/19
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
String value() default "";
}
@PK
用来标注表的主键字段
package com.example.mybatisplusdemo.orm.annotation;
import java.lang.annotation.*;
/**
* 主键标识
*
* @author : xiaojun
* @since 11:02 2018/11/19
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface PK {
}
- 以下是一个具体的User entity demo
package com.example.mybatisplusdemo.orm.entity;
import com.example.mybatisplusdemo.orm.annotation.Column;
import com.example.mybatisplusdemo.orm.annotation.PK;
import com.example.mybatisplusdemo.orm.annotation.Table;
import java.sql.Timestamp;
/**
* <p>
* 系统用户
* </p>
*
* @author xiaojun
* @since 2018-11-16
*/
@Table("sys_user")
public class User {
@PK
@Column("user_id")
private Long userId;
@Column("username")
private String username;
@Column("password")
private String password;
@Column("salt")
private String salt;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
@Column("status")
private Integer status;
@Column("dept_id")
private Long deptId;
@Column("create_time")
private Timestamp createTime;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt)