通常情况下,对象和数据库表的映射有2种方式:
1.通过命名约定
2.通过注解
Sql Generator很强大,但是不好用,要方便还是用Template SQL(底层也是在用Sql Generator)
Template SQL也很强大,但用起来仍然麻烦,用DbEntitySql基本可以达到业务逻辑级别的操作:
new DbOomQuery(session, DbEntitySql.insert(new Girl(...)).executeUpdateAndClose();
Girl girl = ...
DbEntitySql.find(girl);
DbEntitySql.findById(girl); DbEntitySql.deleteById(girl);
DbEntitySql.find(s) 根据s中的所有非空字段生成查询条件,这就要求我们在设计实体类的时候,int等基本数据类型由Integer等包装类实现。
下一步考虑如何做模糊查询,如范围内查询?like查询?
是否只能用Templae SQL来做?有其他工具类吗?
DbOomQuery在findOne的要求类名和数据库表名一致,否则无法检测出数据。
而普通的execute是不需要这样做的。
在未作深入研究前 最好类名 属性名和表名 列名完全一致!
在一对一的关系中,实体A中包含实体B的完整对象。使用Join Hints
DbOomQuery q = new DbOomQuery(session,
"select girl.*, boy.* from GIRL girl join BOY boy on girl.ID=boy.GIRL_ID");
List<Boy> boys = q.withHints("boy.girl, boy").list(Girl.class, Boy.class);
返回Boy对象,每一个Boy对象中包含一个Girl实例。
public class Boy{
//....
private Gril gril;
}
Sql Generator:
DbSqlBuilder dsb = sql()._("select").column("k.*")._(" from")
.table("Knowledge","k")._(" where").column("k.content")._(" like '%")._("MySQL")._("%'");
select k.K_ID, k.K_CONT, k.K_CRE_TIME, k.K_MODIFY_TIME, k.K_SUBJ, k.RE_U_ID from Knowledge k where k.K_CONT like '%MySQL%'
DbSqlBuilder dsb = sql(
"SELECT * FROM $T{Knowledge k} where $k.content like")._()
._("'%")._("MySQL")._("%'");
SELECT * FROM Knowledge k where k.K_CONT like '%MySQL%'