O2O错误记录

1、Error creating bean with name ‘dataSource’ defined in class path resource:Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method ‘dataSource’ threw exception; 报错是因为没有配置的数据源
Spring Boot + Mybatis数据源配置的三种方式

(1)application.properties文件时Spring Boot默认加载的文件,并会通过文件内容进行一些默认配置。比如在使用jdbcTemplate时,如果application.properties文件在*”spring.datasource.url”、”spring.datasource.password”、”spring.datasource.username”*时,Spring Boot会默认自动配置DataSource,它将优先采用HikariCP连接池,如果没有该依赖的情况则选取tomcat-jdbc,如果前两者都不可用最后选取Commons DBCP2。在使用Mybatis时,通常在application.properties文件中做如下配置:

2、mabatis自动创建表时,salMapGenerator和javaClientGenerator的位置不能换,否则出现错误。在项目的pom文件中需要加入插件。

<plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.5</version>
        <configuration>
            <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
            <verbose>true</verbose>
            <overwrite>true</overwrite>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.25</version>
            </dependency>
        </dependencies>
    </plugin>
</plugins>

generator.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--数据库驱动-->
    <!-- 引入配置文件 -->
    <properties resource="generator.properties"/>

    <context id="ssm" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="${driver}" connectionURL="${url}  userId="${username}" password="${password}">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--生成Model类存放位置-->
        <javaModelGenerator targetPackage="cn.malongbao.common.ds.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--salMapGenerator和javaClientGenerator的位置不能换,否则出现错误-->
        <!--生成xml映射文件存放位置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.malongbao.common.ds.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--生成对应表及类名-->
        <table tableName="address" domainObjectName="Address" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

在generator.properties配置中

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/green
username=root
password=123456

2、@mapperScan需要加mybatis依赖

org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1

@mapper注解用于mabatis,@repository多用于hibernate
为什么在ocular中的dao层都是用的@repository注解(用@mapper运行不会报错,但是在程序中会提示报错)。

3、Failed to bind properties under ‘’ to com.zaxxer.hikari.HikariDataSource:

Property: driverclassname
Value: com.mysql.cj.jdbc.Driver
Origin: "driverClassName" from property source "source"

Reason: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader 驱动不能实例化;
加上spring.datasource.driver-class-name=com.mysql.jdbc.Driver的配置

4、org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

**原因:**在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。
att:都是自动生成的,应该不会有错,但是mybatis默认的是mapper.xml文件都会被漏掉,所以还是需要在配置文件中显示的声明:

mybatis.mapper-locations=classpath:mapper/Mapper.xml

5、mybatis自动生成代码时,比如user里面包含了address,而又有address这个表,所以在项目启动时会出现(xml文件是在启动的读取的) --这个问题是因为重复执行插件,xml文件重复,导致报错
nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for cn.malongbao.common.ds.mapper.AddressMapper.BaseResultMap at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject

(1)mybatis自动生成表的时候,表名和对应的domainName没有对应好,具体表现为,有多个表对应了Address对象,导致AddressMapper映射错误。

(2)mybatis插件运行了很多次,但是自动生成的内容并没有覆盖而是追加了,导致有多个BaseResultMap,运行的时候出现了错误。

6、生成mybatis代码根据多个属性查询,generator.xml文件中的设置 model中的Example类生成

enableCountByExample=“false” enableUpdateByExample=“false” enableDeleteByExample=“false” enableSelectByExample=“false” selectByExampleQueryId=“false” 去掉,会生成相应的example类。

7、在写代码看东西的时候应该更加细心一点,由于对依赖的不理解会导致一点点的错误就以为是依赖的错,这样一个小问题都有可能弄半天。如果没有相应的方法,比较一下引入的类是否正确,保证自己的代码没有错,比如说是否新增了一个参数或者方法,方法是否写错了。细节细节啊。

8、maven的插件一直报错,这个插件没有自己引入过,但是还是有,因为是maven自带的site插件,报错的原因是因为没有下载相应的依赖,现在手动的引入该插件,下载相应的依赖。

在pom文件中引入依赖,重新下载以来然后刷新即可,要是在idea里面无法自动下载,就去http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-site-plugin/3.8.2/链接中下载,然后添加到相应的文件目录下,删掉lastUpdated文件即可。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>3.7</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.doxis</groupId>
            <artifactId>doxis-site-renderer</artifactId>
            <version>1.8</version>
        </dependency>
    </dependencies>
</plugin>

9、Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

10、aop表示声明一个切面,该切面有before和after等等方法,表示该切面在执行之前或者执行之后要进行的操作,该切面会绑定相应的方法。表示在执行该方法的时候执行在该操作之前或者之后的方法。
@AspectJ 声明一个切面
@execute(package = “cn.malongbao…”)

11、fastjson打印相应的参数
java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)

使用fastjson报的错误,原因是序列化了ServletRequest,ServletResponse,MultipartFile,这些类的对象不能被序列化。

12、通过AOP做登录的验证可以传递HttpServletRequest等参数,在aop里面获取Session的时候出现了空指针异常。

问题:当使用AOP进行验证时,可以获取到HttpServletRequest等参数,可以做’当session存在时直接登录,不需要重新登录’的认证,这个验证也可以通过拦截器来实现的。

13、在AOP和自定义拦截器里面得到的HttpServletRequest都是SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@6927e5e6],最后得到的都是空指针异常;

原因:if (httpSession.getAttribute(“is_Login”).equals(“Y”)

如果没有is_Login属性,那么调用equals的时候会报空指针异常,这个时候的异常不是因为httpSession没有找到,而是因为没有该属性,获取该属性为null!!不要想当然,要调试啊!!

编码规范:Object的equals方法容易抛出空指针异常,应使用常量或者确定的值的对象来调用。

14、拦截操作实现的方式:

(1)AOP:声明一个切面,该切面的aspect方法绑定一个或者多个execution,写before和afterReturning等方法来进行验证。

(2)实现HandlerInterceptor接口,重写preHandle,postHandle,afterCompletion等方法来实现拦截。继承WebMvcConfigurerAdapter类,将要拦截的url和相应的类进行绑定。

15、AOP切面里面的参数必须要是显示的声明的,比如在controller层里面如果不写HttpServletRequest httpServletRequest参数,在joinPoint.getArgs()是无法得到该参数的,会报空指针异常。

16、slf4j的日志,要不引入依赖用@slf4j注解,要不使用:

private Logger logger = LoggerFactory.getLogger(SecurityHandleInterceptor.class);

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

17、更改某些代码之后,再次运行的时候发现结果与之前会不一样,会不会是因为浏览器的缓存问题?还有就是服务端的缓存问题?

之前设置的时候仅仅只对最后一个“/O2O/loginPage”不进行拦截,误以为仅仅排除最后一个添加的url。

(1)对“/O2O/login”进行拦截的原因是:在controller里面“/O2O/login”是带了username和password的参数的,当直接访问http://localhost:5006/O2O/login时,其实在controller中是没有该url的,当需要排除的url在项目中并不存在的时候,springboot会将路径编成/error,从而无法进行排除。

(2)对“/O2O/logout”进行拦截的原因是:可能是因为服务器和浏览器的缓存问题??

18、WebSecurityConfigurer之后可以用在zuul里面,结合security的单点登录,在common中有HandlerInterceptor就可以了。

19、在swaggerConfig里面没有添置bean,导致显示的时候出现了base-error-controller,operation-handler还有link-mvc等等不必要的选项,是因为没有在Docket上面添加@Bean,并且添加了@Bean之后项目启动错误,是因为ApiInfo这个类的默认构造方法已经@Deprecate,在新的构造方法中有一个参数不可为null,但是在构造方法实现的时候将值置为了null,导致错误。

解决问题的方法:习惯看源码,找到问题出现的原因,而不是一直瞎找。要是api等等变了,就直接做出相应的改变就好了。(10分钟搞定)

20、为了方便,当访问swagger页面的时候不需要做登录,把权限都去掉。(暂不做处理,到时候结合security做)

在SecurityInterceptor里面把swagger-ui.html的页面给排除掉,但是还是拦截下来了,原因是:SecurityInterceptor里面拦截的是定义在controller中的url,swagger-ui.html并没有在controller中定义,在拦截的时候会默认项目中不存在这个url,因此还是会进行拦截。所以,SecurityInterceptor拦截与否,都是根据controller里面定义的url来的

所以这里的SecurityInterceptor无法实现不对swagger-ui.html进行拦截,因为该url并不定义在controller中。

21、DB该怎么设置;

22、文件上传和下载的依赖包ftpClient方式

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

公司的PC不能开启ftp服务,所以目前写的代码还没有验证过

23、邮件服务:最早期使用JavaMail相关api来写发送邮件的相关代码,后来spring推出了JavaMailSender更加简化了邮件发送的过程,在之后SpringBoot对此进行了封装就有了现在的spring-boot-starter-mail

<!--邮件服务的依赖包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

启动Field mailSender in cn.malongbao.common.service.MailService required a bean of type ‘org.springframework.mail.javamail.JavaMailSender’ that could not be found.

The injection point has the following annotations:

@org.springframework.beans.factory.annotation.Autowired(required=true)
Action:Consider defining a bean of type ‘org.springframework.mail.javamail.JavaMailSender’ in your configuration.

需要在application.properties中加上以上配置,否则不能自动注入JavaMailSender
很多Spring对象,要是没有相应的配置,在项目启动的时候不能装配对象,会报错

24、声明为static的方法或者属性都是静态的,可以使用类名调用,也可以用类的对象形式来调用。非static属性方法要通过对象来进行访问。

25、 Calendar对象和Date对象之间的互转

1.将Calendar对象转换为Date(c.getTime())

Calendar c = Calendar.getInstance();  //当前时间
Date d = c.getTime();

2.将Date转换为Calendar对象(s.setTime(date))

Calendar c1 = Calendar.getInstance();
Date d1 = new Date();

26、java Locale类

Locale locale = LocaleContextHolder.getLocale();

假设正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言lei型返回对应的界面。就是为每种语言提供一套相应的资源文件,并以规范化命名的方式保存在特定的目录中,由系统自动根据客户端语言选择合适的资源文件。

一般需要两个条件可以确定一个特定类型的本地化信息,它们分别是“语言类型”和“国家/地区的类型”。Java通过java.util.Locale类表示一个本地化对象,它允许同故宫语言参数和国家/地区参数创建一个确定的本地化对象。

如果应用系统中某些信息需要支持国际化功能,则必须为希望支持的不同本地化类型分别提供对应的资源文件,并以规范的方式进行命名。国际化资源文件的命名规范规定资源名称采用以下的方式进行命名:

<资源名><语言代码><国家/地区代码>.properties

messages_en_US.properties
messages_zh_CN.properties

No message found under code ‘IC100’ for locale ‘zh_CN’.

1、在application.properties中添加spring.messages.basename=exception/messages

Att:要带上/messages,否则会出错。/message不是表示exception下面还有一个message的文件夹,是表示exception下面的messages.properties文件的文件名称。
exception/messages是默认的配置

2、在resources下新建exception文件夹,然后新增messages.properties

总结:
spring.messages.basename=exception/A

(1)根据LocaleContextHolder.getLocale()得到当前locale,假设为B,然后去寻找A_B.properties,如果找不到的话,就在A.properties中找默认的配置,如果都找不到,就报错。

重要的类:MessageSource

String message = messageSource.getMessage(code,args,locale);
spring.messages.basename=exception/messages

26、检查数据的时候,不一定要返回true和false,这样其实会造成很多无用的代码,当输入的数据不对时,直接抛出异常。

思路:添加异常处理机制,加入统一的异常处理
学会自定义异常处理类,使用locale和messageSource来配置异常信息。

27、commom模块自定义了页面拦截的功能,在访问swagger页面的时候,只需要登录自定义的login页面就可以了,然后再登录swagger页面就不需要登录。但是order模块的swagger页面在没有设置的情况下默认是需要登录的?

commom模块中为了自定义拦截功能,引入了

<!--安全认证的相关依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

order模块中也有该security依赖,解决方法:

1、如果没有实际使用security的功能,可以直接移除spring-boot-starter-security或者是spring-cloud-starter-oauth2依赖。
2、默认用户名是user,密码是服务启动的时候随机生成的一串数字
3、设置用户名和密码

spring.security.user.name=admin    
spring.security.user.password=123456

28、很多包都有StringUtils类,在写项目的时候要弄清楚用的是哪个包下的StringUtils

StringUtils的isBlank()方法和isEmpty()最大的区别就是对字符串中是否有空白字符的判断。

记得给控制器加注解@RestController

29、swagger 在新建content模块之后,明明没有security依赖,但是访问swagger页面的时候需要登录???而且之前其实没有配置swagger,但是却可以访问到swagger的登录界面,是因为引入了common的依赖,然后common里面有swagger页面,所以出错吗? <不是,因为没有扫描swagger的配置类>需要验证也是因为common中有security依赖<是的>???

在content模块中,在启动类中有

@ComponentScan(basePackages = "cn.malongbao.~~**context**~~ ")
@MapperScan(basePackages = "cn.malongbao.context.ds.mapper")

并且添加了common的依赖,结果content服务启动的时候没有错误(此时的componentSan和MapperScan中的basePackages是错的)<缓存问题???>,swagger页面访问要先登录并且swagger页面报错不可访问。

改正为:

@ComponentScan(basePackages = "cn.malongbao.content")
@MapperScan(basePackages = "cn.malongbao.content.ds.mapper")

之后,服务启动报错。<原因:没有办法识别到common中的ExceptionService,无法自动注入,因为目前的common服务在content服务中不是以maven包的形式存在。在启动content服务的时候根本没有办法初始化bean>

Description:Field exceptionService in cn.malongbao.content.controller.AnnounceQueryController required a bean of type ‘cn.malongbao.common.service.ExceptionService’ that could not be found.

The injection point has the following annotations:

@org.springframework.beans.factory.annotation.Autowired(required=true)

Action:Consider defining a bean of type ‘cn.malongbao.common.service.ExceptionService’ in your configuration.

@Mapper:在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。
@MapperScan:如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan。作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类。

添加位置:是在Springboot启动类上面添加。

需要deploy一下common的包,这样其他的服务才可以使用,直接引用common服务中的代码,项目启动的时候bean是不能初始化的。(理解的不正确)

ocular中的jar包什么都可以正常下载,其他项目就需要配置??? ocular的父pom文件中有maven的配置。应该是权限的问题,所以没有办法deploy包。(没有办法deploy但是可以本地install,还是可以用的,只要引入该jar包就行。deploy功能只是让其他项目可以通过依赖来使用它。)

原因:对注解的理解不够,是项目结构的问题,在content项目启动时,只有@SpringBootApplication 所在的包被被扫描,在本例中,启动类是ContentApplication.java,并没有说要扫描cn.malongbao.common.service这个包,而ExceptionService这个类在common包中,所以并没有被扫描。要显示的设置

@ComponentScan(basePackages = {“cn.malongbao.common.service”})

表示要扫描common对应包下面的文件。

并不是说引入了common的依赖,就可以自动注入common里面所有可以注解的类。还是需要设置!!!

30、使用maven安装install的时候出现The packaging for this project did not assign a file to the build artifact -> [Help 1]

不要使用Plugins的install,使用Lifecycle中的install

31、common中没有特别定义controller,service和swagger的注解,但是项目启动和访问都没有什么问题。为什么在content模块中,如果不显示的在启动类中声明@controller,@service,@EnableSwagger2,那么对应的注解类就无法被识别成controller和swagger页面的配置类呢?经过测试发现:如果是content和order模块中没有使用common中类进行@Autowired,在content和order模块启动的时候还是会自动扫描@RestController和@EnableSwagger2注解的类的。

(默认会自动扫描Application启动类下的所有文件)

原因:为了访问common中的注解类,需要引入@ComponentScan。@ComponentScan 和@SpringBootApplication注解的包扫描有冲突,**@ComponentScan注解包扫描会覆盖掉@SpringBootApplication的包扫描。**即order和content中就无法扫描到@RestController等注解注解的类。

解决方法:在content和order类中需要显示的声明需要扫描的类。

@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan,其中扫描包的范围为启动类所在包和子包,不包括第三方的jar包。如果我们需要扫描通过maven依赖添加的jar,我们就要单独使用@ComponentScan注解扫描第三方包。

但是,如果@SpringBootApplication和@ComponentScan注解共存,那么@SpringBootApplication注解的扫描的作用将会失效,也就是说不能够扫描启动类所在包以及子包了。因此,我们必须在@ComponentScan注解配置本工程需要扫描的包范围。

32、get请求和post请求的使用时机?

(1)get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

(2)在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

get请求和post请求的区别表现?

(1)get是从服务器上获取数据,post是向服务器传送数据。

(2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

(3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

(4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

(5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

33、由于在order模块中引入了common的依赖,而common中加入了安全中心的认证和url的校验,导致order在检验接口的时候会出现403Forbidden的情况。其实更好的做法是直接在独立出一个securityCenter,而不是在common中嵌入securityCenter。common要做的就是提供公共service工具类等等。这个地方到时候需要改正。

但是在order中无法正常访问???同样引入common依赖的content服务却可以正常访问??? <对于POST请求都有问题>

1、403Forbidden问题

使用浏览器进行调试,F12对比content和order调用接口,发现order访问了

springfox.js?v=2.9.2:1 GET http://localhost:8009/csrf 404

ATT:POST请求会进行CSRF访问,暂时先改成GET,发现正常,并且执行sql报错,加上&serverTimezone=UTC后解决

根本原因:在使用method = RequestMethod.POST请求时,content和order都会出现403Forbidden的情况。但是common不会出现403情况。

解决思路:

(1)csrf是什么?是如何发生的?

CSRF跨站请求攻击:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作。因为浏览器之前认证过,所以被访问的的站点会认为这是用户的操作而去进行。

从而暴露出web中用户身份认证验证的一个漏洞:简单的身份验证仅仅能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

造成跨域的主要原因是由于请求方的1、域名 2、端口与被请求方不一致。而CORS可以提供跨域的资源分享(比如一个网站需要访问另一个网站的资源,这个资源可以是一张图片,或者是一个API接口),它需要前后端共同去实现。

(2)如何解决?

给order和content模块来设置WebSecurityConfigurer类的配置,在common中引入了security依赖,但是common中的安全设置无法用在order和content模块,需要重新设置才行。

csrf().disable(); //关闭csrf请求

2、mybatis自动生成表,common和content正常,order报错” Invalid bound statement (not found)”………<在application.properties中没有声明xml文件所在的路径>

3、数据库配置也是:common正常,order正常,content服务报错,加上了&serverTimezone=UTC后解决

34、Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.

HikariPool-1 - Exception during pool initialization.

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

在application.properties中加上“&serverTimezone=UTC”即可

spring.datasource.url=jdbc:mysql://localhost:3306/greenCollection?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=UTC

35、Invalid bound statement (not found): cn.malongbao.order.ds.mapper.OrderInfoMapper.selectByExample

#mybatis配置:声明xml文件所在的路径,没有会出现Invalid bound statement(not found)错误
mybatis.mapper-locations=classpath:mapper/Mapper.xml

(1)mapper的xml文件配置路径是否正确。

(2)接口名与Mybatis的xml映射文件名一定要一模一样。

36、mybatis中插入orderInfo后如何返回值主键

在mapper文件中填写的insert配置中加入useGeneratedKeys=“true” keyProperty=“orderId” keyColumn="order_id"

<insert id="insert" parameterType="cn.malongbao.order.ds.model.OrderInfo" useGeneratedKeys="true" keyProperty="orderId" keyColumn="order_id">

在执行insert操作之后,真正插入操作的主键其实是赋值到了实体类orderInfo。

直接使用orderInfo.getOrderId()即可得到主键,而不是根据返回值,返回值是表示修改了多少行。

1、添加记录能够返回主键的关键点在于需要在标签中添加以下三个属性

useGeneratedKeys:必须设置为true,否则无法获取到主键id。

keyProperty:设置为POJO对象的主键id属性名称。

keyColumn:设置为数据库记录的主键id字段名称

2、新添加主键id并不是在执行添加操作时直接返回的,而是在执行添加操作之后将新添加记录的主键id字段设置为POJO对象的主键id属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值