codecamp

插入前后的设置

插入之前 - @Prev

在插入之前,你想通过一段 SQL 为你的 POJO 某一个字段设值。你可以通过 @Prev 属性

@Table("t_pet")
public class Pet{
    @Name
    private String name;

    @Column("photo")
    @Prev( @SQL("SELECT txt FROM t_pet_photo WHERE pname=@name") )
    private String photoPath;
...

@Prev 注解接受一组 @SQL 作为参数,它遵守如下约定:

  • @SQL 声明了一条 SQL 语句,支持动态占位符。
    • 变量 - 形式如: $变量名
      • 其值由 org.nutz.dao.TableName 来设置,具体使用方式请参看 动态表名
      • 特殊占位符不需要手工设值,Nutz.Dao 自动为你设置,它们是:
        • $view - 表示当前实体对象的视图名称
        • $field - 表示注解所在字段数据库名称
      • 其他特殊占位符,会被对象自身的同名属性值替换
    • 参数 - 形式如:@参数名
      • 其值直接使用 POJO 自身的属性值
      • 比如上例,将会参考对象自身的 name 字段的值
  • 如果 SQL 执行没有结果,即结果集合为空,将不会为相应字段设置
  • 如果 SQL 执行的结果集包含多条记录,只有第一条记录的第一列的值会被使用
  • @SQL 更详细的语法规范请参看 自定义 SQL

此外,@Prev 也支持传入 EL 表达式,详情请查看 @EL 的 javadoc

@Prev(els=@EL("$me.genID()"))
private String id;

public String genID(){
    return org.nutz.lang.random.R.UU16();
}

插入之后 - @Next

在插入之后,你想通过一段 SQL 为你的 POJO 某一个字段设值。你可以通过 @Next 属性

@Table("t_pet")
public class Pet{
    @Id
    @Next( @SQL("SELECT currval('t_pet_id_seq')") )
    private long id;
...

如上例,执行插入后,你的 Pet 对象的 id 会被数据库中新的值更新。

@Next 的规则和 @Prev 是一样的

以 @Prev 来举例

下面让我们举两个例子,详细说明一下 变量 和 参数 的异同点。

使用变量的例子

@Prev(@SQL("SELECT pet_name FROM t_user_pet WHERE ownm='$ownerName'"))
private String name;

在执行 dao.inert 操作时, Nutz.Dao 会预先执行这段 SQL, 执行之前,变量 $ownerName 会被对象本身的 ownerName 字段的值替 换,如果对象本身的 ownerName 字段的值恰好是 "zzh",那么执行的 SQL 会变成:

SELECT pet_name FROM m_user_pet WHERE ownm='zzh';

这段 SQL 执行的结果会复制给对象的 name 字段。

使用参数的例子

@Prev(@SQL("SELECT pet_name FROM t_user_pet WHERE ownm=@ownerName"))
private String name;

在执行 dao.inert 操作时, Nutz.Dao 会预先执行这段 SQL, 执行之前,参数 @ownerName 会被 '?' 替换,并根据这段 SQL 生成 PreparedStatement 对象:

SELECT pet_name FROM m_user_pet WHERE ownm=?;

然后,根据对象本身的 ownerName 字段的值,为这个 PreparedStatement 设置参数,执行之后,这段 SQL 执行的结果会复制给对象的 name 字段。

数据库方言

无论是 @Prev 还是 @Next,你都是通过 @SQL 声明的数据库方言。但是,假设你并不确定你的 POJO 将会工作在哪一个数据 库上,比如你的项目有两个数据源,一个是 Oracle 一个是 Postgresql,那么你的 POJO 该如何写方言呢?

@Table("t_pet")
public class Pet{
    @Id
    @Next({
        @SQL(db = DB.PSQL,   value="SELECT currval('t_pet_id_seq')"),
        @SQL(db = DB.ORACLE, value="SELECT t_pet_id_seq.currval FROM dual"),
        @SQL(db = DB.OTHER,  value="SELECT MAX(id) FROM t_pet") 
    })
    private long id;
...

现在 Nutz.Dao 支持这些数据库:

public enum DB {
    H2, DB2, PSQL, ORACLE, SQLSERVER, MYSQL, OTHER
}

特别说一下Oracle的seq

@Table("t_pet")
public class Pet{
    @Id(auto=false)
    @Prev({
        @SQL(db = DB.ORACLE, "SELECT t_pet_id_seq.nextval FROM dual")
    })
    private long id;
...
分页查询
使用视图
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

表达式引擎

maplist结构

图像处理小军刀

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }