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 框架配合,写一个输入用户名、密码,然后到数据库校验的功能