spring ibatis 框架 点击添加按钮 出现了插入两条相同的数据 可能原因 是 ? 求各位大神 指教~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring ibatis 框架 点击添加按钮 出现了插入两条相同的数据 可能原因 是 ? 求各位大神 指教~相关的知识,希望对你有一定的参考价值。

哈哈,各种诡异的问题出现的时候,就是你成长最快的时候!


    首先看页面的请求,点击按钮的时候是否会发起两次请求,如果是,那应该是页面JS的问题,比如按钮上绑定了一个提交事件,而按钮原生又有提交的效果,在绑定事件执行完以后又执行了原生的提交事件,所以提交了两次。在提交表单的时候经常出现的。

    如果请求只有一次,那就要看看你的代码逻辑里面是否有两次SQL提交执行。

    如果逻辑也正确,看看你的ibatis文件中的sQL,不会写了两遍吧。呵呵。


god

参考技术A 插入SQL运行了2次

Spring Boot框架 - MyBatis专题

一、MyBatis发展史 

  MyBatis原是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation 迁移到了google code,随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis ,代码于2013年11月迁移到Github。
  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

二、SpringBoot集成MyBatis

1、添加依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.0</version>
</dependency>

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

2、配置文件

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 配置当前要使用的数据源的操作类型
    driver-class-name: oracle.jdbc.driver.OracleDriver      # 配置ORACLE的驱动程序类
    url: jdbc:oracle:thin:@localhost:1521:ORCL              # 数据库连接地址
    username: "plat_user"                                   # 数据库用户名
    password: 123
    druid:                                                  # 进行数据库连接池的配置
      min-idle: 5                                           # 数据库连接池的最小维持连接数    
      initial-size: 5                                       # 初始化提供的连接数
      max-total: 5                                          # 最大的连接数
      max-wait-millis: 200                                  # 等待连接获取的最大超时时间
mybatis:
  type-aliases-package: com.example.demo.dao.mapper                # 定义所有操作类的别名所在包
  mapper-locations: classpath:com/example/demo/dao/config/**/*.xml # 所有的mapper映射文件
  logImpl: org.apache.ibatis.logging.log4j2.Log4j2Impl                    # mybatis日志
pagehelper:
    reasonable: false
    supportMethodsArguments: true
    params: pageNum=start;pageSize=limit;

3、注解

@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.example.demo.dao.mapper")
public class Application
{
    public static void main(String[] args )
    {
        SpringApplication.run(Application.class, args);
    }
}

三、MyBatis深入

1、分页插件PageHelper

  pagehelper使用时要注意版本号,重要的事情说三遍,一定要注意,一定要注意,如果版本号不对应,那么分页插件不会生效。

a) 添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.0</version>
</dependency>

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

b) 实现

  pagehelper使用有两种方式,配置文件方式和代码声明方式。

  配置文件方式(yaml):

pagehelper:
    reasonable: false
    supportMethodsArguments: true
    params: pageNum=start;pageSize=limit;

  代码声明方式

@Bean
public PageHelper pageHelper() {
    PageHelper pageHelper = new PageHelper();
    Properties p = new Properties();
    p.setProperty("offsetAsPageNum", "true");
    p.setProperty("rowBoundsWithCount", "true");
    p.setProperty("reasonable", "true");
    pageHelper.setProperties(p);
    return pageHelper;
}

2、多数据源支持

a) 添加依赖

  添加依赖和单个数据与无区别,同“二、SpringBoot集成MyBatis ->1、添加依赖”。

b) 配置文件

spring:
  datasource:
    example1:
      password: root
      url: jdbc:mysql://127.0.0.1:3306/master?useUnicode=true&characterEncoding=UTF-8
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      type: com.zaxxer.hikari.HikariDataSource
    example2:
      password: root
      url: jdbc:mysql://127.0.0.1:3306/slave1?useUnicode=true&characterEncoding=UTF-8
      idle-timeout: 20000
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      type: com.zaxxer.hikari.HikariDataSource

c)  代码实现

@Bean("dataSource")// 将这个对象放入Spring容器中
@Primary           // 表示这个数据源是默认数据源
@ConfigurationProperties(prefix = "spring.datasource.example1")// 读取application.properties中的配置参数映射成为一个对象 prefix表示参数的前缀
public DataSource getDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "sqlSessionFactory")// 表示这个数据源是默认数据源
@Primary                         // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource datasource)
        throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(datasource);
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/example1/*.xml"));// 设置mybatis的xml所在位置
    return bean.getObject();
}

@Bean("dataSourceExample2")// 将这个对象放入Spring容器中
@ConfigurationProperties(prefix = "spring.datasource.example2")// 读取application.properties中的配置参数映射成为一个对象 prefix表示参数的前缀
public DataSource getDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "sqlSessionFactoryExample2")// 表示这个数据源是默认数据源
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceExample2") DataSource datasource)
        throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(datasource);
    bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/examplew/*.xml"));// 设置mybatis的xml所在位置
    return bean.getObject();
}

3、去本地化配置(spring cloud config)

a) 项目配置文件

#日志文件名
logging:
  file: ${spring.application.name}
#配置中心地址
logging:
  config: http://172.17.30.111:9001/plat-config/test/develop/log4j2.yml?resolvePlaceholders=false&type=.yml

b) 日志配置文件

Configuration:
  status: error
  name: YAMLConfig
  properties:
    property:
     - name: log_file
       value: "${sys:LOG_FILE}"
     - name: log_pattern
       value: "%d{yyyy-MM-ddHH:mm:ss,SSS z} %t [${log_file},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-B3-ParentSpanId}] %-5level %class{36} %L %M - %msg%xEx%n"
     - name: base_path
       value: "/java/apache-tomcat-8.0.36/webapps"
     - name: file_name
       value: "${base_path}/log/${log_file}.log"
     - name: rolling_file_name
       value: "${base_path}/backup/${log_file}-%d{yyyy-MM-dd}-%i.log.gz"
     - name: every_file_size
       value: 10M
  Appenders:
    Console:
      name: Console
      target: SYSTEM_OUT
      PatternLayout:
        Pattern: ${log_pattern}
      ThresholdFilter:
        level: trace
        onMatch: ACCEPT
        onMismatch: DENY
    RollingFile:
      name: RollingFile
      fileName: ${filename}
      filePattern: ${rolling_file_name}
      PatternLayout:
        Pattern: ${log_pattern}
      Policies:
        SizeBasedTriggeringPolicy:
          size: ${every_file_size}
    Kafka: #输出到Kafka
      name: Kafka
      topic:  app_log
      #Kafka appender ignoreExceptions 必须设置为false,否则无法触发Failover
      ignoreExceptions: false
      PatternLayout:
        Pattern: ${log_pattern}
      Property:
        - name: bootstrap.servers
          value: 172.17.30.143:9092
        # KafkaClient包里默认值是60000ms,当Kafka宕机时,尝试写Kafka需要1分钟才能返回Exception,之后才会触发Failover,当请求量大时,log4j2 队列很快就会打满,之后写日志就Blocking,严重影响到主服务响应。所以要设置足够短,队列长度足够长
        - name: max.block.ms
          value: 20000
    Failover: #此处的Failover Appender就是解耦对Kafka的依赖,当Kafka Crash时,日志触发Failover,写本地即可
      name: Failover
      primary: Kafka
      #retryIntervalSeconds 是通过异常来切换的,所以可以适量加大间隔,比如上面的10分钟
      retryIntervalSeconds: 600  
      Failovers:
        AppenderRef: 
          - ref: Console
  Loggers:
    logger:
     - name: org.apache.http
       level: INFO
       additivity: false
       AppenderRef:
        - ref: Console
        - ref: RollingFile
        - ref: Failover
     - name: com.netflix.discovery
       level: ERROR
       additivity: false
       AppenderRef:
        - ref: Console
        - ref: RollingFile
        - ref: Failover
    Root:
      level: DEBUG
      AppenderRef:
       - ref: Console
       - ref: RollingFile
       - ref: Failover

c) 添加依赖

<dependency> <!-- 引入log4j2依赖 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<dependency>  <!-- 加上这个才能辨认到log4j2.yml文件 -->
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

注意:pom文件要添加yaml文件支持的依赖

 

附录: 《MyBatis中文官网地址》

以上是关于spring ibatis 框架 点击添加按钮 出现了插入两条相同的数据 可能原因 是 ? 求各位大神 指教~的主要内容,如果未能解决你的问题,请参考以下文章

一个使用struts2,spring,ibatis做的web项目,使用tomcat服务器!

用struts+spring+hibernate/ibatis 框架配合,写一个输入用户名、密码,然后到数据库校验的功能

spring+ibatis 插入是正确的,但查询不出数据

spring+ibatis环境搭建

Spring Boot框架 - MyBatis专题

spring集成ibatis进行项目中dao层基类封装