11
回答
JFinal 用 Postgresql 插入数据 ,获得 的自增主键 id 的值始终为1
华为云实践训练营,热门技术免费实践!>>>   

JFinal 用 Postgresql 插入数据 ,获得 的自增主键 id 的值始终为1 

sql:

CREATE TABLE pre_bbs_reply
(
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  id serial NOT NULL,
  CONSTRAINT reply_id PRIMARY KEY (id)
)
@JFinal      ,

代码 :

    ReplyModel reply = getModel(ReplyModel.class);
    reply.set("create_uid", 1);
    reply.set("create_name", "红星");
    reply.set("create_time", System.currentTimeMillis() / 1000);
    reply.set("create_ip", IpTableHelp.getIpAddress(getRequest()));
    reply.set("content", ParserHelp.dirtyHtml(getPara("content")));
    reply.set("status", 0);
    boolean statusReply = reply.save();
    if (statusReply != false) {
        System.out.println(reply);
        renderJson("id", reply.get("id"));
    }
    else {
        renderJson("msg", "数据写入失败,错误代码:reply");
    }           
System打印的值:

com.service.bbs.model.ReplyModel@b2176532 {id:1, content:11111, status:0, create_ip:127.0.0.1, create_name:红星, create_uid:1, create_time:1378972267}

数据都确实录入数据库了 ,没有错误 ,但多次插入的时候 用 get("id")  ,getInt("id"); 都始终为1 ; 获取不到变化的数值

举报
红星xx
发帖于4年前 11回/2K+阅
共有11个答案 最后回答: 4年前
CREATE TABLE pre_bbs_reply
(
  id serial NOT NULL,
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  CONSTRAINT reply_id PRIMARY KEY (id)
)

把id放到第一个位置,再试一试,应该就好了。

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

引用来自“玛雅牛”的答案

CREATE TABLE pre_bbs_reply
(
  id serial NOT NULL,
  create_uid integer,
  create_name character varying(25),
  create_time integer,
  create_ip character varying(15),
  content text,
  status smallint,
  CONSTRAINT reply_id PRIMARY KEY (id)
)

把id放到第一个位置,再试一试,应该就好了。

震精了  ,可以成功获取了。 感谢 。 最佳答案奉上 ,表示这是 为什么呢?能否讲解一下 。

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

, 波总 没 认真看标题啊 。id 是 pgsql 的 自增ID  ,怎么会为空呢 ,都说了数据成功插入 。

感谢玛雅牛  ,将 id 主键 移到 表第一个 就 可以了 ,

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('.
                self::quote(array_values($data),$db).')'." returning ".self::quote_column($return_cols);

            $id = self::query(self::SELECT,$_sql,$as_object)->execute($db)->get($return_cols);

其实这个才是PG或者 Oracle的标准操作手法

这里 self::SELECT 是用来指定取回一个结果集. 

更高级的用法:

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column($cols,$db).') values ';
        $_vsql = array();
        foreach ($values as $value){
            $_vsql[] = '('.self::quote($value,$db).')';
        }

        $_sql .= implode(',',$_vsql);

        $_sql .= ' returning '.self::quote_column($return_cols,$db);

        return self::query(self::SELECT,$_sql)->execute($db)->as_array();
通过一个sql 语句,插入多条

将ID以结果集形式返回.

MySQL是一个非常害人的东西





引用来自“红星xx”的答案

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

, 波总 没 认真看标题啊 。id 是 pgsql 的 自增ID  ,怎么会为空呢 ,都说了数据成功插入 。

感谢玛雅牛  ,将 id 主键 移到 表第一个 就 可以了 ,

把第一次增加的值给缓存了?

引用来自“宏哥”的答案

引用来自“JFinal”的答案

  多次调用此 action,数据库插入了多少条数据? 注意检查一下,每次前端提交过来的的 id 值是否为 null。搞定后别忘了回来分享

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('.
                self::quote(array_values($data),$db).')'." returning ".self::quote_column($return_cols);

            $id = self::query(self::SELECT,$_sql,$as_object)->execute($db)->get($return_cols);

其实这个才是PG或者 Oracle的标准操作手法

这里 self::SELECT 是用来指定取回一个结果集. 

更高级的用法:

$_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column($cols,$db).') values ';
        $_vsql = array();
        foreach ($values as $value){
            $_vsql[] = '('.self::quote($value,$db).')';
        }

        $_sql .= implode(',',$_vsql);

        $_sql .= ' returning '.self::quote_column($return_cols,$db);

        return self::query(self::SELECT,$_sql)->execute($db)->as_array();
通过一个sql 语句,插入多条

将ID以结果集形式返回.

MySQL是一个非常害人的东西





jfinal 这个 获取主键确实 不好理解 ,插入按说只返回 受影响的 行数 。甚至没有返回  。都没返回 是怎么获取的主键值呢。
--- 共有 1 条评论 ---
光石头update 是返回影响行数,单条insert可以返回自增主键,这是jdbc规范,数据库基本都是支持的。 4年前 回复
com.jfinal.plugin.activerecord.Model.getGeneratedKey(PreparedStatement, TableInfo) 的处理方式是直接获取第一个字段的值.也就是必须把id作为表的第一个字段!这写法......

引用来自“屁屁果”的答案

com.jfinal.plugin.activerecord.Model.getGeneratedKey(PreparedStatement, TableInfo) 的处理方式是直接获取第一个字段的值.也就是必须把id作为表的第一个字段!这写法......

要看 jfinal 源码就仔细点,要看懂,请勿对jfinal 使用者产生误导,如果还看不懂,告诉你要看如下这一句关键的:

ResultSet rs = pst.getGeneratedKeys();
if (rs.next()) {
  ....
}
你可以用 mysql 测试一下,无论你将 id 放在哪个位置都可以获取到,与位置半毛钱关没有
--- 共有 3 条评论 ---
光石头是sequece 不是自增列 4年前 回复
JFinal回复 @屁屁果 : mysql、oracle、postgresql都测试过,没有问题 4年前 回复
光石头我是在线浏览了代码,没有测试,的确是我看的马虎了.不过这样写也是有问题的,能够使用sequence的不仅仅是oracle...... 4年前 回复
顶部