一个简单的、基于注解的对象关系映射的实现,分享给那些对数据对象关系映射有兴趣的程序员,共同学习(转载请注明出处)。
目前实现的功能有:
1、自动扫描指定包,查找使用了注解声明的对象,自动生成对应映射器。
2、自动完成数据库的CRUD操作。
3、使用工作单元来完成事务管理。
局限性(如果各位有兴趣,可以修改这部分):
1、需要有主键。
2、需要对象有默认无参构造器。
那么先来看一段使用示例,如何使用映射器来简化数据库访问:
@Table(name="userpublicinfo")
public class UserPublicInfo extends DomainObject{
@PrimaryKeyColumn(columnName="username")
private String username;
@OneToOneColumn(columnName="firstname")
private String firstname;
@OneToOneColumn(columnName="lastname")
private String lastname;
@OneToOneColumn(columnName="lang")
private String lang;
@OneToOneColumn(columnName="profession")
private String profession;
@OneToOneColumn(columnName="country")
private String country;
@OneToOneColumn(columnName="sex")
private String sex;
@OneToOneColumn(columnName="birthday")
private Date birthday;
@OneToOneColumn(columnName="profile")
private String profile;
public UserPublicInfo(){}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
markDirty();
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
markDirty();
}
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
markDirty();
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
markDirty();
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
markDirty();
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
markDirty();
}
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
markDirty();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
markDirty();
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
markDirty();
}
}
public class App {
public static void main(String[] args) {
DBConnectionFactory.initDataBaseContext();
UserPublicInfo info = (UserPublicInfo) MapperRegister.getMapper(UserPublicInfo.class)
.findObjectByPrimaryKey("admin");
System.out.println("Name: " + info.getFirstname() + info.getLastname());
DBConnectionFactory.closeAllConnection();
}
}
程序运行结果(具体结果):
Name: admin
可以看到,使用映射器只需要两步:
1、使用注解来声明对象中field与数据库列名的映射关系。
2、获取映射器然后通过主键查询。从数据库中查询并生成一个UserPublicInfo只需要一行代码,不需要写任何的sql语句。(请忽略DBConnectionFactory的初始化跟closeAllConnection。- -!,这个是上一篇文章里面的数据库连接池代码,然后我为了简化数据库表的创建及获取连接,所以拿来用了。当然在具体使用过程中,可以替换为你想要获取连接的方式,或者直接DriverManager.getConnection()都是可以的)
后续会完成几篇关于该映射器设计思路的文章,敬请关注!
整个示例工程代码链接:https://github.com/hu-xuemin/mapper.git