建表SQL:

  1. DROP TABLE IF EXISTS person;
  2. CREATE TABLE person(
  3. person_id serial PRIMARY KEY NOT NULL,
  4. person_name VARCHAR(60),
  5. gender INT,
  6. person_addr VARCHAR(100),
  7. birthday DATE
  8. );

注意:在postgresql中建表的时候,将主键id字段设置成serial类型,会自动生成一个关联主键id的序列(如下图中的数据库会创建一个隐含序列"person_person_id_seq"),SERIAL类型的字段和MySQL中的自增唯一ID等价。

当你在你的数据表中定义了一个SERIAL类型的列后,SERIAL的自增功能会被自动添加到数据库。

--------------------------------------------------------------------------------------

接口Controller:

  1. @Component
  2. @Path("/person")
  3. @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
  4. public class PersonController {
  5. @Autowired
  6. PersonService personService;
  7.  
  8. @POST
  9. @Path("/insert")
  10. @Consumes(MediaType.APPLICATION_JSON)
  11. public ResultModel insert() {
  12. Person person = new Person();
  13. person.setBirthday(new Date());
  14. person.setGender();
  15. person.setPersonAddr("广州");
  16. person.setPersonName("小红");
  17. personService.insert(person);
  18. return ResultModel.ok(person);
  19. }

注意上面的Person对象没有为personId赋值。因为person表的主键列person_id是自增的。

下面是使用mybatis的逆向工程生成的PersonMapper接口:

  1. public interface PersonMapper {
  2. @Insert({
  3. "insert into person (" +
  4. "PERSON_ID, " +
  5. "PERSON_NAME, " +
  6. "GENDER, " +
  7. "PERSON_ADDR, " +
  8. "BIRTHDAY)",
  9. "values (" +
  10. "#{personId,jdbcType=INTEGER}, " +
  11. "#{personName,jdbcType=VARCHAR}, " +
  12. "#{gender,jdbcType=INTEGER}, " +
  13. "#{personAddr,jdbcType=VARCHAR}, " +
  14. "#{birthday,jdbcType=DATE})"
  15. })
  16. int insert(Person person);
  17. }

由于person表的主键person_id是自增的,所以访问Controller中的"/person/insert"方法插入数据的时候会报如下错误:

  1. HTTP Status 500 - org.springframework.dao.DataIntegrityViolationException:
  2. type Exception report
  3. message org.springframework.dao.DataIntegrityViolationException:
  4. description The server encountered an internal error that prevented it from fulfilling this request.
  5. exception
  6.  
  7. javax.servlet.ServletException: org.springframework.dao.DataIntegrityViolationException:
  8. ### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  9. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  10. ### The error may involve com.zhaopin.dao.PersonMapper.insert-Inline
  11. ### The error occurred while setting parameters
  12. ### SQL: insert into person (PERSON_ID, PERSON_NAME, GENDER, PERSON_ADDR, BIRTHDAY) values (?, ?, ?, ?, ?)
  13. ### Cause: org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  14. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  15. ; SQL []; ERROR: null value in column "person_id" violates not-null constraint
  16. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).; nested exception is org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  17. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  18. org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:391)
  19. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
  20. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345)
  21. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220)
  22. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  23. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
  24. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  25. root cause
  26.  
  27. org.springframework.dao.DataIntegrityViolationException:
  28. ### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  29. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  30. ### The error may involve com.zhaopin.dao.PersonMapper.insert-Inline
  31. ### The error occurred while setting parameters
  32. ### SQL: insert into person (PERSON_ID, PERSON_NAME, GENDER, PERSON_ADDR, BIRTHDAY) values (?, ?, ?, ?, ?)
  33. ### Cause: org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  34. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  35. ; SQL []; ERROR: null value in column "person_id" violates not-null constraint
  36. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).; nested exception is org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  37. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  38. org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243)
  39. org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
  40. org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74)
  41. org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:399)
  42. com.sun.proxy.$Proxy23.insert(Unknown Source)
  43. org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:253)
  44. org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:52)
  45. org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
  46. com.sun.proxy.$Proxy31.insert(Unknown Source)
  47. com.zhaopin.service.impl.PersonServiceImpl.insert(PersonServiceImpl.java:30)
  48. com.zhaopin.api.PersonController.insert(PersonController.java:58)
  49. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  50. sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  51. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  52. java.lang.reflect.Method.invoke(Method.java:498)
  53. org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
  54. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
  55. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
  56. org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
  57. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
  58. org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
  59. org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
  60. org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
  61. org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:269)
  62. org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
  63. org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
  64. org.glassfish.jersey.internal.Errors.process(Errors.java:315)
  65. org.glassfish.jersey.internal.Errors.process(Errors.java:297)
  66. org.glassfish.jersey.internal.Errors.process(Errors.java:267)
  67. org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
  68. org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:252)
  69. org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1025)
  70. org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:372)
  71. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
  72. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345)
  73. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220)
  74. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  75. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
  76. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  77. root cause
  78.  
  79. org.postgresql.util.PSQLException: ERROR: null value in column "person_id" violates not-null constraint
  80. 详细:Failing row contains (null, 小兰, 2, 重庆, 2017-06-04).
  81. org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
  82. org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
  83. org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
  84. org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
  85. org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:420)
  86. org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:413)
  87. com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493)
  88. org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:45)
  89. org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:73)
  90. org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
  91. org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:115)
  92. org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
  93. org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:170)
  94. org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:157)
  95. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  96. sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  97. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  98. java.lang.reflect.Method.invoke(Method.java:498)
  99. org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:386)
  100. com.sun.proxy.$Proxy23.insert(Unknown Source)
  101. org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:253)
  102. org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:52)
  103. org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
  104. com.sun.proxy.$Proxy31.insert(Unknown Source)
  105. com.zhaopin.service.impl.PersonServiceImpl.insert(PersonServiceImpl.java:30)
  106. com.zhaopin.api.PersonController.insert(PersonController.java:58)
  107. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  108. sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  109. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  110. java.lang.reflect.Method.invoke(Method.java:498)
  111. org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
  112. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
  113. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
  114. org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
  115. org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
  116. org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
  117. org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
  118. org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
  119. org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:269)
  120. org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
  121. org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
  122. org.glassfish.jersey.internal.Errors.process(Errors.java:315)
  123. org.glassfish.jersey.internal.Errors.process(Errors.java:297)
  124. org.glassfish.jersey.internal.Errors.process(Errors.java:267)
  125. org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
  126. org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:252)
  127. org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1025)
  128. org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:372)
  129. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
  130. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345)
  131. org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220)
  132. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  133. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
  134. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  135. note The full stack trace of the root cause is available in the Apache Tomcat/7.0.53 logs.
  136.  
  137. Apache Tomcat/7.0.53

意思是说"person_id"这一列违反非空约束,不能为null。

解决办法:修改PersonMapper中的@Insert注解中的SQL语句,首先把person_id列去掉。

然后增加一个@Options注解,声明主键列是自增的:

  1. public interface PersonMapper {
  2. @Insert({
  3. "insert into person (" +
  4. "person_name, " +
  5. "gender, " +
  6. "person_addr, " +
  7. "birthday)",
  8. "values (#{personName,jdbcType=VARCHAR}, " +
  9. "#{gender,jdbcType=INTEGER}, " +
  10. "#{personAddr,jdbcType=VARCHAR}, " +
  11. "#{birthday,jdbcType=DATE})"
  12. })
  13. @Options(useGeneratedKeys=true, keyProperty="personId",keyColumn = "person_id")
  14. int insert(Person person);
  15. }

表名都改为了小写,数据库中表字段名也都是小写。保持一致。经测试,如果数据库中的表字段名是大写的话,会报错。

再次测试插入,成功,接口返回结果:

如果觉得本文对您有帮助,不妨扫描下方微信二维码打赏点,您的鼓励是我前进最大的动力:

mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法的更多相关文章

  1. Mybatis里Mapper映射sql文件里insert的主键返回selectKey使用

    有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...

  2. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  3. 使用navicat操作PostPreSql创建表并设置主键自增和触发器

    使用navicat操作PostPreSql创建表并设置主键自增和触发器 1).创建递增序列 2).创建表,使用序列,设置主键递增 3)定义触发函数 自动生成时间戳函数 CREATE OR REPLAC ...

  4. 更新oracle数据库表如何实现主键自增长

     在数据库中实现主键自动增长有利于我们做数据插入操作,在SQL SERVER上创建表时可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置 ...

  5. Mybatis insert 获取主键自增id

    Mybatis insert 返回自增主键 mysql 准备一张带有自增主键的表users 字段:id,name,phone sql <!--插入记录并获取刚插入记录的主键--> < ...

  6. Oracle 创建表并设置主键自增

    创建数据库 CREATE TABLE STUDENT(ID NUMBER PRIMARY KEY, NAME VARCHAR(200) NOT NULL, SEX VARCHAR(200), CREA ...

  7. Oracle创建表(包含、主键自增)

    注意:Oracle导出建表语句不会导出触发器及自增索引 第一步:创建一张表 create table member( memberId number primary key, --主键.自增长 mem ...

  8. oracle建表 和 设置主键自增

    1.新建table CREATE TABLE ysb_log( id ) primary key not null , tbdate ) NULL, tb_time ) NOT NULL, tblog ...

  9. 通过DbVisualizer 工具运行DB2存储过程实现INSERT语句主键自增造数

    1.需求简介 最近开发人员需要进行一批数据进行生产上SQL语句耗时过长问题的验证与优化.所以在性能测试库中批量建造数据,由于交易本身业务逻辑过于复杂以及需要各种授权,最后决定采用插表的方式完成. 2. ...

随机推荐

  1. iOS获取真机沙盒文件、获取真机本地数据

    有时我们需要对真机内的数据进行分析,那么如何获取沙盒所有数据文件呢? 1.设备连接到电脑,打开xcode 2.打开window-devices 3.打开后,选择设备名,选择app,导出数据 4.最后拿 ...

  2. 接口测试-Http状态码-postman上传文件

    转自:https://www.cnblogs.com/jiadan/articles/8546015.html 一. 接口   接口:什么是接口呢?接口一般来说有两种,一种是程序内部的接口,一种是系统 ...

  3. dx11的一些数据结构

    功能是什么创建一个设备(device)来代表显示适配器(display adapter)并且创建一个交换链(swap chain)用于渲染 设备device在dx11里是用来干什么的从ID3DX11D ...

  4. Xcode 8 的 Debug 新特性 —- WWDC 2016 Session 410 & 412 学习笔记

    Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...

  5. 新系统基础优化--Centos6.6

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. 73条日常shell命令汇总,总有一条你需要!

    1.检查远程端口是否对bash开放: echo >/dev/tcp/8.8.8.8/53 && echo "open" 2.让进程转入后台: Ctrl + z ...

  7. FormsAuthentication.SetAuthCookie

    这两天在研究 Forms 进行用户验证, 它本身没有什么上msdn上查一下就知道怎么个搞法了! 不过我在测试的时候发现也会产生 了一些疑问! 1. 什么我在web.config 的 authentic ...

  8. ASP.NET Core之项目文件简介及配置文件与IOC的使用

    原文地址:https://www.cnblogs.com/knowledgesea/p/7079880.html 序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Cor ...

  9. python学习笔记——提取网页中的信息正则表达式re

    被用来检索\替换那些符合某个模式(规则)的文本,对于文本过滤或规则匹配,最强大的就是正则表达式,是python爬虫里必不可少的神兵利器. 1 正则表达式re基本规则 [0-9] 任意一个数字,等价\d ...

  10. golang学习笔记 ----读写文件

    使用io/ioutil进行读写文件 ioutil包 其中提到了两个方法: func ReadFile func ReadFile(filename string) ([]byte, error) Re ...