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

这篇博客介绍了一个基于注解的对象关系映射实现,适用于熟悉数据库和注解的程序员。它能自动扫描对象并创建映射器,支持数据库的CRUD操作,并用工作单元管理事务。虽然要求对象有主键和无参构造器,但提供了简化数据库访问的示例,通过注解声明field与列的映射,仅需一行代码即可完成查询。作者计划发布更多关于此映射器设计的文章,读者可以在GitHub找到示例工程代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值