1.TypeHandler概念 TypeHandler,类型转换器,在mybatis中用于实现java类型和JDBC类型的相互转换.mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的set方法实现的;在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用ResultSet对象不同类型的get方法时间的;所以不同类型的typeHandler其实就是调用PrepareStatement和ResultSet的不同方法来进行类型的转换,有些时候会在调用PrepareStatement和ResultSet的相关方法之前,可以对传入的参数进行一定的处理. 当我们没有指定typeHandler的时候mybatis会根据传入参数的类型和返回值的类型调用默认的typeHandler进行处理.对于一个typeHandler需要配置java类型(javaType)和JDBC类型(jdbcType),typeHandler的作用就是实现这两种类型的转换,在传入的参数为指定的Java类型时,将其转换为指定的JDBC类型,当返回值为指定JDBC类型时将其转换为配置的Java类型.
2.mybatis默认定义的TypeHandler mybatis默认定义了一批TypeHandler,正常情况下这些TypeHandler就可以满足我们的使用了.mybatis通过TypeHandlerRegister来管理TypeHandler 所以在这个类里面可以看到所有定义好的typeHandler,下面是源码.
private final Map> JDBC_TYPE_HANDLER_MAP = new EnumMap>(JdbcType.class);
private final Map>> TYPE_HANDLER_MAP = new ConcurrentHashMap>>();
private final TypeHandler UNKNOWN_TYPE_HANDLER = new UnknownTypeHandler(this);
private final Map, TypeHandler> ALL_TYPE_HANDLERS_MAP = new HashMap, TypeHandler>();
private static final Map> NULL_TYPE_HANDLER_MAP = new HashMap>();
public TypeHandlerRegistry() {
register(Boolean.class, new BooleanTypeHandler());
register(boolean.class, new BooleanTypeHandler());
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
register(JdbcType.BIT, new BooleanTypeHandler());
register(Byte.class, new ByteTypeHandler());
register(byte.class, new ByteTypeHandler());
register(JdbcType.TINYINT, new ByteTypeHandler());
register(Short.class, new ShortTypeHandler());
register(short.class, new ShortTypeHandler());
register(JdbcType.SMALLINT, new ShortTypeHandler());
register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());
register(Long.class, new LongTypeHandler());
register(long.class, new LongTypeHandler());
register(Float.class, new FloatTypeHandler());
register(float.class, new FloatTypeHandler());
register(JdbcType.FLOAT, new FloatTypeHandler());
register(Double.class, new DoubleTypeHandler());
register(double.class, new DoubleTypeHandler());
register(JdbcType.DOUBLE, new DoubleTypeHandler());
register(Reader.class, new ClobReaderTypeHandler());
register(String.class, new StringTypeHandler());
register(String.class, JdbcType.CHAR, new StringTypeHandler());
register(String.class, JdbcType.CLOB, new ClobTypeHandler());
register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler());
register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());
register(String.class, JdbcType.NCHAR, new NStringTypeHandler());
register(String.class, JdbcType.NCLOB, new NClobTypeHandler());
register(JdbcType.CHAR, new StringTypeHandler());
register(JdbcType.VARCHAR, new StringTypeHandler());
register(JdbcType.CLOB, new ClobTypeHandler());
register(JdbcType.LONGVARCHAR, new ClobTypeHandler());
register(JdbcType.NVARCHAR, new NStringTypeHandler());
register(JdbcType.NCHAR, new NStringTypeHandler());
register(JdbcType.NCLOB, new NClobTypeHandler());
register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());
register(JdbcType.ARRAY, new ArrayTypeHandler());
register(BigInteger.class, new BigIntegerTypeHandler());
register(JdbcType.BIGINT, new LongTypeHandler());
register(BigDecimal.class, new BigDecimalTypeHandler());
register(JdbcType.REAL, new BigDecimalTypeHandler());
register(JdbcType.DECIMAL, new BigDecimalTypeHandler());
register(JdbcType.NUMERIC, new BigDecimalTypeHandler());
register(InputStream.class, new BlobInputStreamTypeHandler());
register(Byte[].class, new ByteObjectArrayTypeHandler());
register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());
register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());
register(byte[].class, new ByteArrayTypeHandler());
register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());
register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());
register(JdbcType.LONGVARBINARY, new BlobTypeHandler());
register(JdbcType.BLOB, new BlobTypeHandler());
register(Object.class, UNKNOWN_TYPE_HANDLER);
register(Object.class, JdbcType.OTHER, UNKNOWN_TYPE_HANDLER);
register(JdbcType.OTHER, UNKNOWN_TYPE_HANDLER);
register(Date.class, new DateTypeHandler());
register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());
register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());
register(JdbcType.TIMESTAMP, new DateTypeHandler());
register(JdbcType.DATE, new DateOnlyTypeHandler());
register(JdbcType.TIME, new TimeOnlyTypeHandler());
register(java.sql.Date.class, new SqlDateTypeHandler());
register(java.sql.Time.class, new SqlTimeTypeHandler());
register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());
// mybatis-typehandlers-jsr310
try {
// since 1.0.0
register("java.time.Instant", "org.apache.ibatis.type.InstantTypeHandler");
register("java.time.LocalDateTime", "org.apache.ibatis.type.LocalDateTimeTypeHandler");
register("java.time.LocalDate", "org.apache.ibatis.type.LocalDateTypeHandler");
register("java.time.LocalTime", "org.apache.ibatis.type.LocalTimeTypeHandler");
register("java.time.OffsetDateTime", "org.apache.ibatis.type.OffsetDateTimeTypeHandler");
register("java.time.OffsetTime", "org.apache.ibatis.type.OffsetTimeTypeHandler");
register("java.time.ZonedDateTime", "org.apache.ibatis.type.ZonedDateTimeTypeHandler");
// since 1.0.1
register("java.time.Month", "org.apache.ibatis.type.MonthTypeHandler");
register("java.time.Year", "org.apache.ibatis.type.YearTypeHandler");
// since 1.0.2
register("java.time.YearMonth", "org.apache.ibatis.type.YearMonthTypeHandler");
register("java.time.chrono.JapaneseDate", "org.apache.ibatis.type.JapaneseDateTypeHandler");
} catch (ClassNotFoundException e) {
// no JSR-310 handlers
}
// issue #273
register(Character.class, new CharacterTypeHandler());
register(char.class, new CharacterTypeHandler());
}
可以看到对于一个Java类型是可以有多个JDBC类型相对应的,所以会存在多个TypeHandler,在这种情况下需要根据传入参数的javaType以及其在数据库中对应JdbcType一起来选定一个TypeHandler进行处理(mybatis如何知道每个字段对应的数据库字段类型的?).下面来看一个具体的TypeHandler的实现:实现Java中Date类型和jdbc中JdbcType.Time类型转换的TimeOnlyTypeHandler.JDBC中的Time类型只记录时分秒,所以如果我们传入一个代表2017-11-21 11:55:59的Date对象,那么数据库中存储的时间是11:55:59.下面看下具体的源码实现:
package org.apache.ibatis.type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Date;
/**
* @author Clinton Begin
*/
public class TimeOnlyTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType)
throws SQLException {
ps.setTime(i, new Time(parameter.getTime()));
}
@Override
public Date getNullableResult(ResultSet rs, String columnName)
throws SQLException {
java.sql.Time sqlTime = rs.getTime(columnName);
if (sqlTime != null) {
return new Date(sqlTime.getTime());
}
return null;
}
@Override
public Date getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
java.sql.Time sqlTime = rs.getTime(columnIndex);
if (sqlTime != null) {
return new Date(sqlTime.getTime());
}
return null;
}
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
java.sql.Time sqlTime = cs.getTime(columnIndex);
if (sqlTime != null) {
return new Date(sqlTime.getTime());
}
return null;
}
}
3.使用自定义TypeHandler 虽然大部分时候mybatis提供的typeHandler已经够用了,但总有些情况下需要我们自己定义TypeHandler.下面通过一个实例来研究如何自己定义和使用TypeHandler. 现在的场景是:首先是建立了一个person表存储个人信息,这个表里有一栏hobbys是记录个人爱好的,爱好包括足球,排球,游泳之类的,在Java的Person对象中对应的是一个String类型的list,而在数据库中是以逗号分隔的字符串表示的,心事如”足球,排球,游泳”,所以现在需要定义一个TypeHandler实现在插入数据和查询数据时string和list类型的相互转换.自定义一个TypeHandler需要继承TypeHandler T接口,T是传入的java类型,并需要使用@MappedTypes定义需要被拦截的java类型@MappedJdbcTypes配置jdbc类型,这里的JdbcType必须org.apache.ibatis.type.JdbcType中的枚举类型,然后还需要实现TypeHandler接口中一系列的get set方法,具体实现的代码如下:
package com.sankuai.lkl.typeHandler;
import com.sun.deploy.util.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class})
public class ListTypeHandler implements TypeHandler> {
@Override
public void setParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException {
String hobbys = StringUtils.join(parameter, ",");
try {
ps.setString(i, hobbys);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public List getResult(CallableStatement cs, int columnIndex) throws SQLException {
String hobbys = cs.getString(columnIndex);
return Arrays.asList(hobbys.split(","));
}
@Override
public List getResult(ResultSet rs, int columnIndex) throws SQLException {
return Arrays.asList(rs.getString(columnIndex).split(","));
}
@Override
public List getResult(ResultSet rs, String columnName) throws SQLException {
return Arrays.asList(rs.getString(columnName).split(","));
}
}
自定义完成之后就需要在mybatis-config.xml文件中配置以注册到mybatis中
但注册完成之后也仍然不能起作用,因为还需要标识那些参数和返回的结果是需要使用这个TypeHandler进行处理的;具体来说,在插入数据和对返回结果进行处理的时候,可以对参数配置javaType和jdbcType或直接配置typeHandler属性来进行标识 下面是插入数据时标识用指定TypeHandler进行处理
INSERT INTO person (id,name,sex,hobbys,data_time) values(#{id},#{name},#{sex},#{hobbys,typeHandler=com.sankuai.lkl.typeHandler.ListTypeHandler},#{date})
下面是标识对返回的结果用指定TypeHandler进行处理
你可能感兴趣的:(mybatis)
【Spring】_Spring事务与事务传播机制
_周游
Spring JavaEE 数据库 sql
目录1.创建项目、数据库及MyBatis配置1.1创建数据库及java实体类1.2使用yml配置MyBatis1.3对应三层架构开发2.Spring编程式事务2.1编写UserController类2.2接口测试2.23关于事务回滚与事务提交的日志3.Spring声明式事务3.1编写TransController类3.2接口测试3.3关于@Transactional实现事务回滚的情况3.3.1重新
由 Mybatis 源码畅谈软件设计(五):ResultMap 的循环引用
方圆想当图灵
由 Mybatis 源码畅谈软件设计 mybatis 代码规范
本节我们来了解Mybatis是如何处理ResultMap的循环引用,它的解决方案非常值得在软件设计中参考。另外作为引申,大家可以了解一下Spring是如何解决Bean的循环注入的。以单测org.apache.ibatis.submitted.permissions.PermissionsTest#checkNestedResultMapLoop为例,它对应表结构和表中的数据为:createtabl
MyBatis Plus 在 Java 项目中的高效使用
随风九天
匠心数据库 java spring java mybatis MyBatis Plus
1.前言1.1MyBatisPlus简介MyBatisPlus是一个MyBatis的增强工具,旨在简化开发人员在数据库操作上的工作量。它提供了丰富的功能,如自动化的CRUD操作、条件构造器、分页查询等,极大地提高了开发效率。1.2为什么选择MyBatisPlus简化代码:自动生成基础的CRUD方法,减少重复代码。提高效率:内置多种插件和工具,提升开发速度。易于维护:代码结构清晰,便于后续维护和扩展
Mysql、MyBatis一键删除重复数据实现方案
冰糖码奇朵
数据库 mysql mybatis sql
一.问题背景项目中有全表数据一键剔除重复的需求场景,也就是一张数据表中除了主键、创建时间、修改时间等基本字段,其他业务字段均参与剔重校验,任何两行数据中,参与剔重校验的所有字段值完全相同则为重复,重复数据仅保留一行,其余删除。二.实现思路将所有参与剔重校验的字段进行分组,保留分组数据中id最大的那一条,其余删除。三.实现代码此处展示MyBatis代码,转换为sql同理。update`${table
Easy-ES(用Mybatis-Plus语法来操作ElasticSearch)
充满希望的程序员
elasticsearch mybatis 大数据 搜索引擎
简介Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在RestHighLevelClient的基础上,只做增强不做改变,为简化开发、提高效率而生,如果有用过Mybatis-Plus(简称MP),那么基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独
SpringBoot整合MyBatis-Plus全攻略:从零实现高效CRUD
rider189
java spring boot mybatis
一、MyBatis-Plus核心优势MyBatis-Plus作为MyBatis的增强工具包,在保留原生特性的基础上,提供了多项开箱即用的功能:自动生成基础CRUD操作内置代码生成器(3.5.3+版本支持最新模板引擎)强大的条件构造器Wrapper支持Lambda形式调用主键自动生成策略(支持雪花算法、UUID等)二、环境搭建与配置1.创建SpringBoot项目使用SpringInitializr
MyBatis-Plus 复杂查询与分页教程
嘵奇
提升自己 mybatis java
精心整理了最新的面试资料和简历模板,有需要的可以自行获取点击前往百度网盘获取点击前往夸克网盘获取MyBatis-Plus复杂查询与分页教程目录环境准备基础回顾复杂查询实现条件构造器QueryWrapper动态条件拼接多表关联查询(非Join方案)分页功能分页插件配置分页查询基本用法分页与复杂查询结合完整示例代码常见问题与注意事项1.环境准备确保项目中已引入MyBatis-Plus依赖(以Maven
计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw
诺诺网络
java mybatis 开发语言
计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw计算机毕业设计JAVA人职匹配推荐系统mybatis+源码+调试部署+系统+数据库+lw本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5
苍穹外卖(Springboot3实现) day01
十年不明
苍穹外卖学习 spring spring boot java
黑马给的起步代码基础工程版本是springboot2.x我的电脑用的是JDK21springboot3.x所以第一天整了很长时间需要慢慢修改配置环境目录依赖版本更换springboot版本更换mybatis版本更换lombok版本更换数据库依赖更新(很重要)swagger配置问题代码补全依赖版本更换springboot版本更换父工程sky-take-out的pom文件添加spring-boot-s
MyBatis-Plus 自定义 SQL 和复杂查询
rkmhr_sef
面试 学习路线 阿里巴巴 mybatis sql 数据库
MyBatis-Plus自定义SQL和复杂查询详解MyBatis-Plus是MyBatis的增强版,提供了许多开箱即用的CRUD操作。然而,在实际项目中,开发者常常需要编写自定义SQL以处理更复杂的查询需求。MyBatis-Plus提供了灵活的机制,允许开发者通过注解或XML自定义SQL,同时也能支持复杂查询、动态SQL等高级操作。1.自定义SQL的两种方式MyBatis-Plus支持两种自定义S
net.sf.jsqlparser.statement.select.Select.getSelectBody()
m0_74824002
面试 学习路线 阿里巴巴 java
1、问题原因发生这个问题就是因为Pagehelper中jsqlparser和Mybatis-puls中jsqlparser冲突,以我的项目来说,我项目中的Pagehelper中jsqlparser版本为4.2而Mybatis-puls中jsqlparser的版本为4.9,就导致版本兼容问题2、解决方法如果你想以Pagehelper中jsqlparser的版本来使用的话,那么项目将启动不起来,就比如
2025年毕设ssm网上超市论文+源码
SSM毕设程序源码JAVA
课程设计
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景关于网上超市系统的研究,现有研究主要集中在电子商务平台的设计与开发、供应链管理、以及用户行为分析等领域。尽管这些研究已经取得了一定的成果,但专门针对基于SSM(Spring、SpringMVC、MyBatis)框架的网上超市系统的研究仍相对较少。随着电子商务的蓬勃发展,网上超市
Java初级入门学习
周杰伦fans
ai学习参考 JAVA 后端框架 java 学习 开发语言
JAVA学习@[TOC](JAVA学习)**一、Java初级入门学习路径****1.Java基础语法****2.面向对象编程(OOP)****3.数据库与JDBC****4.JavaWeb基础****二、主流框架推荐与学习建议****1.Spring框架****2.SpringMVC****3.MyBatis****4.SpringBoot****三、后续学习建议****1.实战项目****2.进
MyBatis-Plus 与 Redis
#sakura
mybatis redis 数据库
1MyBatis-Plus1.1MyBatis-Plus简介MyBatis是一款优秀的持久层框架,它能将接口和JavaPOJO(PlainOldJavaObjects,普通Java对象)映射为数据库中的数据。支持自定义SQL、存储过程,功能强大。MyBatis承担了几乎所有的JDBC代码,包括设置参数和获取结果等工作,可通过简单的XML或注解进行配置。MyBatis-Plus是MyBatis的最佳
MyBatis-Plus 中 LambdaQueryWrapper 方法引用的完整解析
蒸只小鱼
mybatis java tomcat
MyBatis-Plus中LambdaQueryWrapper方法引用的完整解析本文详细分析MyBatis-Plus中LambdaQueryWrapper方法引用的核心作用、实现原理、使用场景及常见问题,并通过完整代码示例演示其用法。1.什么是LambdaQueryWrapper?LambdaQueryWrapper是MyBatis-Plus提供的一个链式查询条件构造器,允许通过Lambda表达式
Mybatis-plus使用wrapper实现分页查询
impl柴猿滚滚
java mybatis-plus
pom.xml3.0.7com.baomidoumybatis-plus-boot-starter${mybatisplus.version}com.baomidoumybatis-plus-generatorController@AutowiredprivateXXXServicexxxService;@GetMapping(value="/xxx/list")@ApiOperation(val
Mybatis中使用的设计模式
rice_88
Mybatis mybatis 设计模式
建造者模式这里讲得很清楚了深入浅出设计模式——建造者模式(BuilderPattern)在mybatis中,在解析配置文件的时候使用。Builder角色是org.apache.ibatis.builder.BaseBuilderConcreteBuilder角色就是它的实现类,分别负责解析不同类型的配置文件,包括org.apache.ibatis.builder.xml.XMLConfigBuil
使用 MyBatis XML 和 QueryWrapper 实现动态查询
曹天骄
mybatis xml
本文档介绍了如何在MyBatis中结合XML配置和MyBatis-Plus的QueryWrapper来实现动态查询。1.XML中定义基本查询首先,在MyBatisXML文件中定义一个基本的select查询:SELECT*FROMorder2.在Mapper接口中定义方法在Mapper接口中定义一个方法,接受QueryWrapper作为参数:packagecom.example.order.mapp
MyBatis @Param 注解详解:多参数传递与正确使用方式
扣丁梦想家
mybatis Java mysql java 数据库 mybatis mysql
@Param注解主要用于MyBatis进行参数传递时给SQL语句中的参数起别名,通常用于多参数方法,使参数在XMLMapper文件或注解SQL语句中更清晰易用。1.基本用法在@Mapper接口中使用@Param来为参数命名,避免MyBatis解析时出现参数名丢失的问题(尤其是多个参数时)。示例:查询用户@MapperpublicinterfaceUserMapper{@Select("SELECT
MyBatis使用log4j打印日志相关配置
劲雨波
MyBatis maven java intellij-idea log4j mybatis
目录一、环境二、依赖三、配置1、log4j.properties2、配置信息一、环境maven:3.6.3ideal:2020MyBatis:3.5.4二、依赖org.slf4jslf4j-log4j121.7.5三、配置1、log4j.properties在resources中新建log4j.properties2、配置信息在log4j.properties中输入以下信息log4j.rootLo
Mybatis-Plus 批量插入速度慢的问题优化
自在如风。
mybatis mybatis-plus mysql sql java
MyBatis-Plus的batchSave接口:实现分页批量插入在实际开发中,批量插入数据是一个常见需求,尤其当数据量较大时,直接使用循环插入效率低下,而MyBatis-Plus提供了强大的批量操作支持。本文将详细讲解如何通过配置和代码实现batchSave接口的分页批量插入功能,优化性能并避免内存溢出。1.背景介绍MyBatis-Plus的BaseMapper默认提供了insert方法,但它只
Mybatis xml 无法正常解析 Invalid bound statement
javaspringboot
问题背景使用插件mybatisX生成的mapper.xml没有办法被正常解析,项目使用的是nacos作为配置中心;问题定位首先看了一下网上说的常见几种问题,比如id不匹配,或者说pom里缺少resource配置导致target里没有xml;这些都没有出现;那接下来就只能从源码出发解决问题;通过报错的堆栈信息我发现问题的出发点是在这里publicSqlCommand(Configurationcon
MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存
Darling &you&
mybatis 缓存 spring boot
前言MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发、减少工作量。本文将介绍如何使用SpringBoot集成MyBatis-Plus来操作数据库,并结合Redis实现数据的缓存功能。1项目搭建1.1创建SpringBoot项目可以通过SpringInitializr快速创建一个新的SpringBoot项目,选择必要的依赖如SpringWeb,MyBatisPlus,MySQLD
SHEIN面试——Java高级开发
有鹿如溪
面试 Java 面试 职场和发展
2022年7月20希音二面高级开发工程师(供应链)面试流程1自我介绍2问问题开始多线程:1线程间的通信方式2什么是pua定义3什么是内卷的定义4spring和mybatis怎么操作数据库的5平时工作量怎么定义的6工作技巧7如何提升工作效率8对加班有啥看法9为啥离职耗时:30分钟
Mybatis的映射文件中,不同的映射文件,id是否可以重复
欣欣爱吃香菜
mybatis
首先如果xml映射文件中配置了namespace,那么id可以重复,如果没有配置namespace,id不可以重复;原因是namespace+id是作为Map的key使用的,如果没有namespace,只有id,那么id重复会导致数据相互覆盖;有了namespace,id也就可以重复,namespace+id自然也就不同。
(六) MyBatis面试通关宝典:让你在面试中脱颖而出的关键
Java_young
JAVA mybatis 面试 职场和发展
一、MyBatis中的工作原理1。介绍MyBatis的基本情况:ORM框架2。原理:MyBatis框架的初始化操作处理SQL请求的流程1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在Configuration对象@Testpublicvoidtest1()throwsException{//1.获取配置文件InputStreamin=Resources.getRes
Mybatis-Plus 配合Sharding-JDBC 实现分库分表
drebander
mybatis-plus mybatis Mybatis-Plus
在现代数据库设计中,随着数据量的不断增长,单一数据库往往无法满足高并发、高性能的业务需求。因此,分库分表策略成为数据库架构优化的重要手段。本文将介绍分库分表的基本概念,并重点探讨垂直拆分与水平拆分的区别,以及如何在MyBatis-Plus中结合Sharding-JDBC实现数据库的分库分表。数据库分库分表概念分库分表是数据库优化的一种常见方式,其核心目的是为了减少单库单表的数据压力,提高查询效率,
手把手教mybatis 第三节
_AndyLau
Mybatis手把手教程 mybatis java 服务器
手把手教mybatis第三节动态SQL查询条件:客户姓名模糊查询客户性别精确查询Stringsql="select*fromtb_customerwherecusNamelike'%"+cusName+"%'andsex="+sex;StringcusName;Integersex;Stringsql="select*fromtb_customer";Stringsql="select*fromt
【java后端学习路线4】SpringBoot+MyBatisPlus+Redis学习指南,985本海硕自学转码
程序员城南
java后端学习路线 java spring boot mybatis redis
JAVA后端学习路线路线总览javase->Mysql->计算机网络->JavaWeb->Maven(1)->Spring->SpringMVC->Mybatis->Maven(2)->Linux->Git->SpringBoot->MyBatisPlus->Redis->JVM->JUC->Nginx->Docker->RabbitMQ->SpringCloud->项目(谷粒商城/仿牛客网)方法
四、MyBatis获取参数值的两种方式(重点)
计算机数学仿真智能硬件算法
@[toc]四、MyBatis获取参数值的两种方式(重点)MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号4.1单个字面量类型的参数若mapp
ios内付费
374016526
ios 内付费
近年来写了很多IOS的程序,内付费也用到不少,使用IOS的内付费实现起来比较麻烦,这里我写了一个简单的内付费包,希望对大家有帮助。
具体使用如下:
这里的sender其实就是调用者,这里主要是为了回调使用。
[KuroStoreApi kuroStoreProductId:@"产品ID" storeSender:self storeFinishCallBa
20 款优秀的 Linux 终端仿真器
brotherlamp
linux linux视频 linux资料 linux自学 linux教程
终端仿真器是一款用其它显示架构重现可视终端的计算机程序。换句话说就是终端仿真器能使哑终端看似像一台连接上了服务器的客户机。终端仿真器允许最终用户用文本用户界面和命令行来访问控制台和应用程序。(LCTT 译注:终端仿真器原意指对大型机-哑终端方式的模拟,不过在当今的 Linux 环境中,常指通过远程或本地方式连接的伪终端,俗称“终端”。)
你能从开源世界中找到大量的终端仿真器,它们
Solr Deep Paging(solr 深分页)
eksliang
solr深分页 solr分页性能问题
转载请出自出处:http://eksliang.iteye.com/blog/2148370
作者:eksliang(ickes) blg:http://eksliang.iteye.com/ 概述
长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。直到solr
数据库面试题
18289753290
面试题 数据库
1.union ,union all
网络搜索出的最佳答案:
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
2.索引有哪些分类?作用是
Android TV屏幕适配
酷的飞上天空
android
先说下现在市面上TV分辨率的大概情况
两种分辨率为主
1.720标清,分辨率为1280x720.
屏幕尺寸以32寸为主,部分电视为42寸
2.1080p全高清,分辨率为1920x1080
屏幕尺寸以42寸为主,此分辨率电视屏幕从32寸到50寸都有
适配遇到问题,已1080p尺寸为例:
分辨率固定不变,屏幕尺寸变化较大。
如:效果图尺寸为1920x1080,如果使用d
Timer定时器与ActionListener联合应用
永夜-极光
java
功能:在控制台每秒输出一次
代码:
package Main;
import javax.swing.Timer;
import java.awt.event.*;
public class T {
private static int count = 0;
public static void main(String[] args){
Ubuntu14.04系统Tab键不能自动补全问题解决
随便小屋
Ubuntu 14.04
Unbuntu 14.4安装之后就在终端中使用Tab键不能自动补全,解决办法如下:
1、利用vi编辑器打开/etc/bash.bashrc文件(需要root权限)
sudo vi /etc/bash.bashrc
接下来会提示输入密码
2、找到文件中的下列代码
#enable bash completion in interactive shells
#if
学会人际关系三招 轻松走职场
aijuans
职场
要想成功,仅有专业能力是不够的,处理好与老板、同事及下属的人际关系也是门大学问。如何才能在职场如鱼得水、游刃有余呢?在此,教您简单实用的三个窍门。
第一,多汇报
最近,管理学又提出了一个新名词“追随力”。它告诉我们,做下属最关键的就是要多请示汇报,让上司随时了解你的工作进度,有了新想法也要及时建议。不知不觉,你就有了“追随力”,上司会越来越了解和信任你。
第二,勤沟通
团队的力
《O2O:移动互联网时代的商业革命》读书笔记
aoyouzi
读书笔记
移动互联网的未来:碎片化内容+碎片化渠道=各式精准、互动的新型社会化营销。
O2O:Online to OffLine 线上线下活动
O2O就是在移动互联网时代,生活消费领域通过线上和线下互动的一种新型商业模式。
手机二维码本质:O2O商务行为从线下现实世界到线上虚拟世界的入口。
线上虚拟世界创造的本意是打破信息鸿沟,让不同地域、不同需求的人
js实现图片随鼠标滚动的效果
百合不是茶
JavaScript 滚动属性的获取 图片滚动 属性获取 页面加载
1,获取样式属性值
top 与顶部的距离
left 与左边的距离
right 与右边的距离
bottom 与下边的距离
zIndex 层叠层次
例子:获取左边的宽度,当css写在body标签中时
<div id="adver" style="position:absolute;top:50px;left:1000p
ajax同步异步参数async
bijian1013
jquery Ajax async
开发项目开发过程中,需要将ajax的返回值赋到全局变量中,然后在该页面其他地方引用,因为ajax异步的原因一直无法成功,需将async:false,使其变成同步的。
格式:
$.ajax({ type: 'POST', ur
Webx3框架(1)
Bill_chen
eclipse spring maven 框架 ibatis
Webx是淘宝开发的一套Web开发框架,Webx3是其第三个升级版本;采用Eclipse的开发环境,现在支持java开发;
采用turbine原型的MVC框架,扩展了Spring容器,利用Maven进行项目的构建管理,灵活的ibatis持久层支持,总的来说,还是一套很不错的Web框架。
Webx3遵循turbine风格,velocity的模板被分为layout/screen/control三部
【MongoDB学习笔记五】MongoDB概述
bit1129
mongodb
MongoDB是面向文档的NoSQL数据库,尽量业界还对MongoDB存在一些质疑的声音,比如性能尤其是查询性能、数据一致性的支持没有想象的那么好,但是MongoDB用户群确实已经够多。MongoDB的亮点不在于它的性能,而是它处理非结构化数据的能力以及内置对分布式的支持(复制、分片达到的高可用、高可伸缩),同时它提供的近似于SQL的查询能力,也是在做NoSQL技术选型时,考虑的一个重要因素。Mo
spring/hibernate/struts2常见异常总结
白糖_
Hibernate
Spring
①ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
缺少aspectjweaver.jar,该jar包常用于spring aop中
②java.lang.ClassNotFoundException: org.sprin
jquery easyui表单重置(reset)扩展思路
bozch
form jquery easyui reset
在jquery easyui表单中 尚未提供表单重置的功能,这就需要自己对其进行扩展。
扩展的时候要考虑的控件有:
combo,combobox,combogrid,combotree,datebox,datetimebox
需要对其添加reset方法,reset方法就是把初始化的值赋值给当前的组件,这就需要在组件的初始化时将值保存下来。
在所有的reset方法添加完毕之后,就需要对fo
编程之美-烙饼排序
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
/*
*《编程之美》的思路是:搜索+剪枝。有点像是写下棋程序:当前情况下,把所有可能的下一步都做一遍;在这每一遍操作里面,计算出如果按这一步走的话,能不能赢(得出最优结果)。
*《编程之美》上代码有很多错误,且每个变量的含义令人费解。因此我按我的理解写了以下代码:
*/
Struts1.X 源码分析之ActionForm赋值原理
chenbowen00
struts
struts1在处理请求参数之前,首先会根据配置文件action节点的name属性创建对应的ActionForm。如果配置了name属性,却找不到对应的ActionForm类也不会报错,只是不会处理本次请求的请求参数。
如果找到了对应的ActionForm类,则先判断是否已经存在ActionForm的实例,如果不存在则创建实例,并将其存放在对应的作用域中。作用域由配置文件action节点的s
[空天防御与经济]在获得充足的外部资源之前,太空投资需有限度
comsci
资源
这里有一个常识性的问题:
地球的资源,人类的资金是有限的,而太空是无限的.....
就算全人类联合起来,要在太空中修建大型空间站,也不一定能够成功,因为资源和资金,技术有客观的限制....
&
ORACLE临时表—ON COMMIT PRESERVE ROWS
daizj
oracle 临时表
ORACLE临时表 转
临时表:像普通表一样,有结构,但是对数据的管理上不一样,临时表存储事务或会话的中间结果集,临时表中保存的数据只对当前
会话可见,所有会话都看不到其他会话的数据,即使其他会话提交了,也看不到。临时表不存在并发行为,因为他们对于当前会话都是独立的。
创建临时表时,ORACLE只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会
基于Nginx XSendfile+SpringMVC进行文件下载
denger
应用服务器 Web nginx 网络应用 lighttpd
在平常我们实现文件下载通常是通过普通 read-write方式,如下代码所示。
@RequestMapping("/courseware/{id}")
public void download(@PathVariable("id") String courseID, HttpServletResp
scanf接受char类型的字符
dcj3sjt126com
c
/*
2013年3月11日22:35:54
目的:学习char只接受一个字符
*/
# include <stdio.h>
int main(void)
{
int i;
char ch;
scanf("%d", &i);
printf("i = %d\n", i);
scanf("%
学编程的价值
dcj3sjt126com
编程
发一个人会编程, 想想以后可以教儿女, 是多么美好的事啊, 不管儿女将来从事什么样的职业, 教一教, 对他思维的开拓大有帮助
像这位朋友学习:
http://blog.sina.com.cn/s/articlelist_2584320772_0_1.html
VirtualGS教程 (By @林泰前): 几十年的老程序员,资深的
二维数组(矩阵)对角线输出
飞天奔月
二维数组
今天在BBS里面看到这样的面试题目,
1,二维数组(N*N),沿对角线方向,从右上角打印到左下角如N=4: 4*4二维数组
{ 1 2 3 4 }
{ 5 6 7 8 }
{ 9 10 11 12 }
{13 14 15 16 }
打印顺序
4
3 8
2 7 12
1 6 11 16
5 10 15
9 14
13
要
Ehcache(08)——可阻塞的Cache——BlockingCache
234390216
并发 ehcache BlockingCache 阻塞
可阻塞的Cache—BlockingCache
在上一节我们提到了显示使用Ehcache锁的问题,其实我们还可以隐式的来使用Ehcache的锁,那就是通过BlockingCache。BlockingCache是Ehcache的一个封装类,可以让我们对Ehcache进行并发操作。其内部的锁机制是使用的net.
mysqldiff对数据库间进行差异比较
jackyrong
mysqld
mysqldiff该工具是官方mysql-utilities工具集的一个脚本,可以用来对比不同数据库之间的表结构,或者同个数据库间的表结构
如果在windows下,直接下载mysql-utilities安装就可以了,然后运行后,会跑到命令行下:
1) 基本用法
mysqldiff --server1=admin:12345
spring data jpa 方法中可用的关键字
lawrence.li
java spring
spring data jpa 支持以方法名进行查询/删除/统计。
查询的关键字为find
删除的关键字为delete/remove (>=1.7.x)
统计的关键字为count (>=1.7.x)
修改需要使用@Modifying注解
@Modifying
@Query("update User u set u.firstna
Spring的ModelAndView类
nicegege
spring
项目中controller的方法跳转的到ModelAndView类,一直很好奇spring怎么实现的?
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* yo
搭建 CentOS 6 服务器(13) - rsync、Amanda
rensanning
centos
(一)rsync
Server端
# yum install rsync
# vi /etc/xinetd.d/rsync
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait
Learn Nodejs 02
toknowme
nodejs
(1)npm是什么
npm is the package manager for node
官方网站:https://www.npmjs.com/
npm上有很多优秀的nodejs包,来解决常见的一些问题,比如用node-mysql,就可以方便通过nodejs链接到mysql,进行数据库的操作
在开发过程往往会需要用到其他的包,使用npm就可以下载这些包来供程序调用
&nb
Spring MVC 拦截器
xp9802
spring mvc
Controller层的拦截器继承于HandlerInterceptorAdapter
HandlerInterceptorAdapter.java 1 public abstract class HandlerInterceptorAdapter implements HandlerIntercep