mapper注解的主要作用(@mapperscan 注解什么时候起作用)

2024-07-23 11:01:18 19

mapper注解的主要作用(@mapperscan 注解什么时候起作用)

本文目录

@mapperscan 注解什么时候起作用

mapperscan 一般在启动类的时候就会生效,来进行mapper包下接口的扫描,在编译后生成对象的实现类,还可以在mybatis配置文件中使用。

@MapperScan注解

说明:日常mybatis研发,需要在每个interface配置@Mapper,为了开发简便使用@MapperScan可以指定要扫描的Mapper类的包的路径 优势:避免每个interface增加注解,提升开发效率 场景:仅需加载application启动main即可 @MapperScan注解多个包 @MapperScan({"com.kfit.demo","com.kfit.user”}) 参考资料: ***隐藏网址*** ***隐藏网址*** 注意:包名   import tk.mybatis.spring.annotation.MapperScan; @Mapper和@MapperScan实际编码时可以选其一,建议@MapperScan可以避免每个dao增加配置

为什么使用@requestmapper注解

类似BeanUtil 很简单,如果两个javaBean之间,属性名相同,类型为基本类型,那么下面代码就OK了,基本没有学习曲线。 Mappermapper=newDozerBeanMapper();DestinationObjectdestObject=mapper.map(sourceObject,DestinationObject.class);orDe

如何开发自己的通用Mapper

第一步,创建HsqldbMapper《T》public interface HsqldbMapper《T》 {}这个接口就是我们定义的通用Mapper,具体的接口方法在**第三步**写。其他的Mapper可以继承这个HsqldbMapper《T》。第二部,创建HsqldbProviderpublic class HsqldbProvider extends MapperTemplate { //继承父类的方法 public HsqldbProvider(Class《?》 mapperClass, MapperHelper mapperHelper) { super(mapperClass, mapperHelper); }}这个类是实际处理操作的类,需要继承MapperTemplate,具体代码在**第四步**写。第三步,在HsqldbMapper《T》中添加通用方法这里以一个分页查询作为例子。 public interface HsqldbMapper { /** * 单表分页查询 * * @param object * @param offset * @param limit * @return */ @SelectProvider(type=HsqldbProvider.class,method = "dynamicSQL") List selectPage(@Param("entity") T object, @Param("offset") int offset, @Param("limit") int limit); }返回结果为List,入参分别为查询条件和分页参数。在Mapper的接口方法中,当有多个入参的时候建议增加@Param注解,否则就得用param1,param2...来引用参数。同时必须在方法上添加注解。查询使用SelectProvider,插入使用@InsertProvider,更新使用UpdateProvider,删除使用DeleteProvider。不同的Provider就相当于xml中不同的节点,如《select》,《insert》,《update》,《delete》。因为这里是查询,所以要设置为SelectProvider,这4个Provider中的参数都一样,只有type和method。type必须设置为实际执行方法的HasqldbProvider.class,method必须设置为"dynamicSQL"。通用Mapper处理的时候会根据type反射HasqldbProvider查找方法,而Mybatis的处理机制要求method必须是type类中只有一个入参,且返回值为String的方法。"dynamicSQL"方法定义在MapperTemplate中,该方法如下:public String dynamicSQL(Object record) { return "dynamicSQL";}这个方法只是为了满足Mybatis的要求,没有任何实际的作用。第四步,在HsqldbProvider中实现真正处理Sql的方法在这里有一点要求,那就是HsqldbProvider处理HsqldbMapper《T》中的方法时,方法名必须一样,因为这里需要通过反射来获取对应的方法,方法名一致一方面是为了减少开发人员的配置,另一方面和接口对应看起来更清晰。除了方法名必须一样外,入参必须是MappedStatement ms,除此之外返回值可以是void或者SqlNode之一。这里先讲一下通用Mapper的实现原理。通用Mapper目前是通过拦截器在通用方法第一次执行的时候去修改MappedStatement对象的SqlSource属性。而且只会执行一次,以后就和正常的方法没有任何区别。使用Provider注解的这个Mapper方法,Mybatis本身会处理成ProviderSqlSource(一个SqlSource的实现类),由于之前的配置,这个ProviderSqlSource种的SQL是上面代码中返回的"dynamicSQL"。这个SQL没有任何作用,如果不做任何修改,执行这个代码肯定会出错。所以在拦截器中拦截符合要求的接口方法,遇到ProviderSqlSource就通过反射调用如HsqldbProvider中的具体代码去修改原有的SqlSource。最简单的处理Mybatis SQL的方法是什么?就是创建SqlNode,使用DynamicSqlSource,这种情况下我们不需要处理入参,不需要处理代码中的各种类型的参数映射。比执行SQL的方式容易很多。有关这部分的内容建议查看通用Mapper的源码和Mybatis源码了解,如果不了解在这儿说多了反而会乱。下面在HsqldbProvider中添加public SqlNode selectPage(MappedStatement ms)方法:/** * 分页查询 * @param ms * @return */public SqlNode selectPage(MappedStatement ms) { Class《?》 entityClass = getSelectReturnType(ms); //修改返回值类型为实体类型 setResultType(ms, entityClass); List《SqlNode》 sqlNodes = new ArrayList《SqlNode》(); //静态的sql部分:select column ... from table sqlNodes.add(new StaticTextSqlNode("SELECT " + EntityHelper.getSelectColumns(entityClass) + " FROM " + tableName(entityClass))); //获取全部列 List《EntityHelper.EntityColumn》 columnList = EntityHelper.getColumns(entityClass); List《SqlNode》 ifNodes = new ArrayList《SqlNode》(); boolean first = true; //对所有列循环,生成《if test="property!=null"》 column = #{property}《/if》 for (EntityHelper.EntityColumn column : columnList) { StaticTextSqlNode columnNode = new StaticTextSqlNode((first ? "" : " AND ") + column.getColumn() + " = #{entity." + column.getProperty() + "} "); if (column.getJavaType().equals(String.class)) { ifNodes.add(new IfSqlNode(columnNode, "entity."+column.getProperty() + " != null and " + "entity."+column.getProperty() + " != ’’ ")); } else { ifNodes.add(new IfSqlNode(columnNode, "entity."+column.getProperty() + " != null ")); } first = false; } //将if添加到《where》 sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes))); //处理分页 sqlNodes.add(new IfSqlNode(new StaticTextSqlNode(" LIMIT #{limit}"),"offset==0")); sqlNodes.add(new IfSqlNode(new StaticTextSqlNode(" LIMIT #{limit} OFFSET #{offset} "),"offset》0")); return new MixedSqlNode(sqlNodes);}注:对这段代码感觉吃力的,可以对比本页最下面**结构**部分XML形式的查看。首先这段代码要实现的功能是这样,根据传入的实体类参数中不等于null(字符串也不等于’’)的属性作为查询条件进行查询,根据分页参数进行分页。先看这两行代码://获取实体类型Class《?》 entityClass = getSelectReturnType(ms);//修改返回值类型为实体类型setResultType(ms, entityClass);首先获取了实体类型,然后通过setResultType将返回值类型改为entityClass,就相当于resultType=entityClass。这里为什么要修改呢?因为默认返回值是T,Java并不会自动处理成我们的实体类,默认情况下是Object,对于所有的查询来说,我们都需要手动设置返回值类型。对于insert,update,delete来说,这些操作的返回值都是int,所以不需要修改返回结果类型。之后从List《SqlNode》 sqlNodes = new ArrayList《SqlNode》();代码开始拼写SQL,首先是SELECT查询头,在EntityHelper.getSelectColumns(entityClass)中还处理了别名的情况。然后获取所有的列,对列循环创建《if entity.property!=null》column = #{entity.property}《/if》节点。最后把这些if节点组成的List放到一个《where》节点中。这一段使用属性时用的是 entity. + 属性名,entity来自哪儿?来自我们前面接口定义处的Param("entity")注解,后面的两个分页参数也是。如果你用过Mybatis,相信你能明白。之后在《where》节点后添加分页参数,当offset==0时和offset》0时的分页代码不同。最后封装成一个MixedSqlNode返回。返回后通用Mapper是怎么处理的,这里贴下源码:SqlNode sqlNode = (SqlNode) method.invoke(this, ms);DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);setSqlSource(ms, dynamicSqlSource);返回SqlNode后创建了DynamicSqlSource,然后修改了ms原来的SqlSource。第五步,配置通用Mapper接口到拦截器插件中《plugins》 《plugin interceptor="com.github.abel533.mapper.MapperInterceptor"》 《!--================================================--》 《!--可配置参数说明(一般无需修改)--》 《!--================================================--》 《!--UUID生成策略--》 《!--配置UUID生成策略需要使用OGNL表达式--》 《!--默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "")--》 《!--《property name="UUID" value="@java.util.UUID@randomUUID().toString()"/》--》 《!--主键自增回写方法,默认值MYSQL,详细说明请看文档--》 《property name="IDENTITY" value="HSQLDB"/》 《!--序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle--》 《!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName--》 《property name="seqFormat" value="{0}.nextval"/》 《!--主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)--》 《!--《property name="ORDER" value="AFTER"/》--》 《!--支持Map类型的实体类,自动将大写下划线的Key转换为驼峰式--》 《!--这个处理使得通用Mapper可以支持Map类型的实体(实体中的字段必须按常规方式定义,否则无法反射获得列)--》 《property name="cameHumpMap" value="true"/》 《!--通用Mapper接口,多个用逗号隔开--》 《property name="mappers" value="com.github.abel533.mapper.Mapper,com.github.abel533.hsqldb.HsqldbMapper"/》 《/plugin》《/plugins》这里主要是**mappers**参数:《property name="mappers" value="com.github.abel533.mapper.Mapper,com.github.abel533.hsqldb.HsqldbMapper"/》 多个通用Mapper可以用逗号隔开。测试接下来编写代码进行测试。public interface CountryMapper extends Mapper《Country》,HsqldbMapper《Country》 {}在CountryMapper上增加继承HsqldbMapper《Country》。编写如下的测试:@Testpublic void testDynamicSelectPage() { SqlSession sqlSession = MybatisHelper.getSqlSession(); try { CountryMapper mapper = sqlSession.getMapper(CountryMapper.class); //带查询条件的分页查询 Country country = new Country(); country.setCountrycode("US"); List《Country》 countryList = mapper.selectPage(country, 0, 10); //查询总数 Assert.assertEquals(1, countryList.size()); //空参数的查询 countryList = mapper.selectPage(new Country(), 100, 10); Assert.assertEquals(10, countryList.size()); } finally { sqlSession.close(); }}测试输出日志如下:DEBUG - ==》 Preparing: SELECT ID,COUNTRYNAME,COUNTRYCODE FROM COUNTRY WHERE COUNTRYCODE = ? LIMIT ? DEBUG - ==》 Parameters: US(String), 10(Integer)TRACE - 《== Columns: ID, COUNTRYNAME, COUNTRYCODETRACE - 《== Row: 174, United States of America, USDEBUG - 《== Total: 1DEBUG - ==》 Preparing: SELECT ID,COUNTRYNAME,COUNTRYCODE FROM COUNTRY LIMIT ? OFFSET ? DEBUG - ==》 Parameters: 10(Integer), 100(Integer)TRACE - 《== Columns: ID, COUNTRYNAME, COUNTRYCODETRACE - 《== Row: 101, Maldives, MVTRACE - 《== Row: 102, Mali, MLTRACE - 《== Row: 103, Malta, MTTRACE - 《== Row: 104, Mauritius, MUTRACE - 《== Row: 105, Mexico, MXTRACE - 《== Row: 106, Moldova, Republic of, MDTRACE - 《== Row: 107, Monaco, MCTRACE - 《== Row: 108, Mongolia, MNTRACE - 《== Row: 109, Montserrat Is, MSTRACE - 《== Row: 110, Morocco, MADEBUG - 《== Total: 10测试没有任何问题。这里在来点很容易实现的一个功能。上面代码中:countryList = mapper.selectPage(new Country(), 100, 10);传入一个没有设置任何属性的Country的时候会查询全部结果。有些人会觉得传入一个空的对象不如传入一个null。我们修改测试代码看看结果。执行测试代码后抛出异常:Caused by: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "id") 为什么会异常呢,因为我们上面代码中直接引用的entity.property,在引用前并没有判断entity != null,因而导致了这里的问题。我们修改HsqldbProvider中的selectPage方法,将最后几行代码进行修改,原来的代码://将if添加到《where》sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), new MixedSqlNode(ifNodes)));修改后://增加entity!=null判断IfSqlNode ifSqlNode = new IfSqlNode(new MixedSqlNode(ifNodes),"entity!=null");//将if添加到《where》sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), ifSqlNode));之后再进行测试就没有问题了。

mapper注解的主要作用(@mapperscan 注解什么时候起作用)

本文编辑:admin

更多文章:


mysql修改视图(mysql 如何对视图的名称重命名)

mysql修改视图(mysql 如何对视图的名称重命名)

大家好,如果您还对mysql修改视图不太了解,没有关系,今天就由本站为大家分享mysql修改视图的知识,包括mysql 如何对视图的名称重命名的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录mysql 如何对视图的

2024年6月29日 16:40

flash游戏网站源码(高手进来,怎样下在网页中的FLASH源代码)

flash游戏网站源码(高手进来,怎样下在网页中的FLASH源代码)

本篇文章给大家谈谈flash游戏网站源码,以及高手进来,怎样下在网页中的FLASH源代码对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录高手

2024年7月17日 19:55

taste用法?taste怎么读 英语

taste用法?taste怎么读 英语

本文目录taste用法taste怎么读 英语taste英文taste可数吗taste啥意思taste是什么意思 解析taste的含义和用法taste什么意思taste的用法合集taste意思eat和taste的区别taste用法taste既

2024年6月18日 17:43

administrators权限怎么获得(win7 hosts需要Administrators权限 win7 hosts如何获取Administrators权限)

administrators权限怎么获得(win7 hosts需要Administrators权限 win7 hosts如何获取Administrators权限)

本文目录win7 hosts需要Administrators权限 win7 hosts如何获取Administrators权限怎么获得Administrators的权限administrators权限怎么获得华硕win10系统的怎么获得Ad

2024年2月6日 09:20

香港云服务器(香港有云服务器么是真正的云服务器 不是vps哦)

香港云服务器(香港有云服务器么是真正的云服务器 不是vps哦)

本文目录香港有云服务器么是真正的云服务器 不是vps哦为什么有的人更偏向香港云服务器香港服务器和内地服务器有什么区别有没有稳定一点的香港云服务器推荐价格不要太贵了就行选择香港云主机需要注意哪些问题做网站选择香港服务器和国内服务器有哪些利弊求

2024年7月19日 19:54

java自学教学入门(初学者学Java要掌握哪些知识)

java自学教学入门(初学者学Java要掌握哪些知识)

本文目录初学者学Java要掌握哪些知识Java入门怎么学初学者学Java要掌握哪些知识当下选择学编程语言的时候,大家的首选就是Java语言,因为Java语言在编程语言中的主角光环,真的是太大了。在学Java中,大部分的朋友都是零基础,零基础

2024年7月19日 05:21

苹果短信烟花特效(iphone发短信放烟花只能看一次嘛)

苹果短信烟花特效(iphone发短信放烟花只能看一次嘛)

这篇文章给大家聊聊关于苹果短信烟花特效,以及iphone发短信放烟花只能看一次嘛对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录iphone发短信放烟花只能看一次嘛苹果通过火焰效果发送的短信怎么查看苹果发信息烟花特效对方看得到

2024年7月17日 07:35

中国美食网站模板(有什么介绍全国各地美食的网站给我说说)

中国美食网站模板(有什么介绍全国各地美食的网站给我说说)

本文目录有什么介绍全国各地美食的网站给我说说推荐几个美食论坛或者网站全国性热点美食论坛有哪些全国性热点美食网站有哪些有什么介绍全国各地美食的网站给我说说太原:过油肉 太原的餐馆被粤、川、京、鲁菜占据了,本地菜系叫得上名字似乎还就是些面点小吃

2024年7月14日 11:04

软件后端开发好就业吗(后端和前端哪个就业好)

软件后端开发好就业吗(后端和前端哪个就业好)

大家好,如果您还对软件后端开发好就业吗不太了解,没有关系,今天就由本站为大家分享软件后端开发好就业吗的知识,包括后端和前端哪个就业好的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录后端和前端哪个就业好软件方面好就业

2024年8月24日 15:00

数组先定义在初始化(数组变量一般应该先定义后使用,当定义数组变量后,该数组各元素的初值是什么)

数组先定义在初始化(数组变量一般应该先定义后使用,当定义数组变量后,该数组各元素的初值是什么)

本文目录数组变量一般应该先定义后使用,当定义数组变量后,该数组各元素的初值是什么二维数组不能先定义,然后初始化么c语言中数组能不能先定义,然后直接赋给初值数组变量一般应该先定义后使用,当定义数组变量后,该数组各元素的初值是什么该数组各元素的

2024年7月2日 21:01

sql的标准语句有哪些(常用标准SQL语句..)

sql的标准语句有哪些(常用标准SQL语句..)

各位老铁们好,相信很多人对sql的标准语句有哪些都不是特别的了解,因此呢,今天就来为大家分享下关于sql的标准语句有哪些以及常用标准SQL语句..的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录常用标准SQL语句

2024年9月8日 23:00

浮点运算对什么有影响(CPU浮点运算与整点运算分别决定其什么方面性能)

浮点运算对什么有影响(CPU浮点运算与整点运算分别决定其什么方面性能)

各位老铁们好,相信很多人对浮点运算对什么有影响都不是特别的了解,因此呢,今天就来为大家分享下关于浮点运算对什么有影响以及CPU浮点运算与整点运算分别决定其什么方面性能的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目

2024年10月8日 14:10

margin(margin金融术语是什么意思)

margin(margin金融术语是什么意思)

本文目录margin金融术语是什么意思经济学中的边际margin是什么概念什么是Marginmargin call是什么意思CSS属性margin是什么意思css中margin和padding的区别margin金融术语是什么意思边际(mar

2024年5月7日 17:51

0基础学平面设计要多久(现在学平面设计最快多久能够学会)

0基础学平面设计要多久(现在学平面设计最快多久能够学会)

本文目录现在学平面设计最快多久能够学会零基础真的不能学平面设计吗是不是很难现在学平面设计最快多久能够学会关于这个问题本喵觉自己挺有资格说一下的,毕竟本喵是半路出家的平面设计!现在转为做游戏也全部依赖于自己曾经做平面设计的底子,因为游戏人物的

2024年5月7日 21:35

儿童摄影网页制作代码(大连艾可儿儿童摄影有限公司怎么样)

儿童摄影网页制作代码(大连艾可儿儿童摄影有限公司怎么样)

本文目录大连艾可儿儿童摄影有限公司怎么样北京花开了儿童摄影中心怎么样长沙市小叮当儿童摄影有限公司怎么样西安市碑林区芳妮豆丁儿童摄影店怎么样长沙市小象集儿童摄影有限公司怎么样葫芦岛市连山区贵族宝贝儿童摄影工作室怎么样北京网站优化哪家好,手上有

2024年7月6日 04:33

手机网页开发者工具(哪个手机浏览器有开发者工具)

手机网页开发者工具(哪个手机浏览器有开发者工具)

“手机网页开发者工具”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看手机网页开发者工具(哪个手机浏览器有开发者工具)!本文目录哪个手机浏览器有开发者工具如何开发手机端网页开发调试工具手机端的页面怎么开发,和webhtml有区

2024年8月23日 04:40

计算机应用基础教程答案(计算机应用基础课后习题答案(人民邮电出版社 杨起帆 颜晖编))

计算机应用基础教程答案(计算机应用基础课后习题答案(人民邮电出版社 杨起帆 颜晖编))

本文目录计算机应用基础课后习题答案(人民邮电出版社 杨起帆 颜晖编)计算机应用基础教程2011版华东师范大学出版社的答案计算机应用基础教程课后答案段晓婧《计算机应用基础教程》课后答案 清华大学出版社清华大学出版社 《计算机应用基础教程》课后

2024年7月8日 06:18

铃铛边框素材图片(饥荒铃铛怎么做)

铃铛边框素材图片(饥荒铃铛怎么做)

大家好,如果您还对铃铛边框素材图片不太了解,没有关系,今天就由本站为大家分享铃铛边框素材图片的知识,包括饥荒铃铛怎么做的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录饥荒铃铛怎么做PS制作精致圣诞小铃铛怎么用PS制

2024年7月27日 22:25

计算机基础知识教学视频(计算机基础知识的讲座视频哪里有)

计算机基础知识教学视频(计算机基础知识的讲座视频哪里有)

“计算机基础知识教学视频”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看计算机基础知识教学视频(计算机基础知识的讲座视频哪里有)!本文目录计算机基础知识的讲座视频哪里有MS Office 高级应用计算机基础知识 (2)文字处

2024年9月2日 21:25

codeblocks下面的框不见了怎么办(codeblocks不出现黑框)

codeblocks下面的框不见了怎么办(codeblocks不出现黑框)

本文目录codeblocks不出现黑框codeblocks编译框不见了codeblocks下面的框怎么固定codeblock左边框的路径怎么打开codeblocks不出现黑框按F2恢复。不出现黑框是因电脑系统黑屏,把logs窗口不慎拖到其他

2024年7月23日 13:18

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1736
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索