基于注解的对象关系映射的实现(一):使用示例

来源:互联网 发布:魔兽副本数据库 编辑:程序博客网 时间:2024/04/30 08:44

一个简单的、基于注解的对象关系映射的实现,分享给那些对数据对象关系映射有兴趣的程序员,共同学习(转载请注明出处)。
目前实现的功能有:
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

0 0
原创粉丝点击