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

一个简单的、基于注解的对象关系映射的实现,分享给那些对数据对象关系映射有兴趣的程序员,共同学习(转载请注明出处)。

目前实现的功能有:

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

posted @ 2017-02-22 12:43  某不具名程序员  阅读(484)  评论(0)    收藏  举报