首页/新闻资讯/正文详情

MyBatis(随笔2 : Sql映射文件 )

发布时间:2026/11/7 9:59:17 来源:云帆数科 栏目:资讯中心
MyBatis(随笔2 : Sql映射文件 )
Sql文件映射这里只是笔记,属性详情,关键还是要多练 ——实例代码MyBatisDemoMyBatis 真正的强大在于映射语句专注于SQL功能强大SQL映射的配置却是相当简单SQL映射文件的几个顶级元素name详情mappernamespace: 命名空间cache配置给定命名空间的缓存cache-ref从其他命名空间引用缓存配置resultMap用来描述数据库结果集和对象的对应关系sql可以重用的SQL块也可以被其他语句引用insert映射插入语句update映射更新语句delete映射删除语句select映射查询语句:--------:-------------:mappernamespace命名空间: 一般引用对应的接口类地址,也可以随便起名,如果面向接口编程则必须要是对应接口的地址引用…namespace和子元素的id联合保证唯一接口中的方法与映射文件中的sql 语句 一一对应;mappernamespace命名空间select idlogin … ……/select/mapperSelectselect是MyBatis中最常用的元素之一, 用于查询 sql 操作;select语句有很多属性可以详细配置每一条语句常用属性id命名空间中唯一的标识符可随意 但如果是 面向接口编程 方法名与映射文件中的SQL语句 id 一 一 对应(要相同);parameterType传入SQL语句的参数类型,基础数据类型: int、String、 Date等只能传入一个通过 #{随意参数名} 即可获取传入的值; 这里参数名可以随意… 因为参数只有一个无须细分了~复杂数据类型: Java实体类、Map等通过 #{属性名} 或者 #{map的keyName} 即可获取传入值; Map可用于多个参数;resultTypeSQL语句返回值的类型 与parameterType类似, 可以是基础或复杂数据类型…MyBatis中resultType自动映射, 字段名 和 属性名必须一致才可以哦~注意: 返回结果如果是 实体类类型,尽量类属性名 与数据库列名一致,不然会很麻烦哦~resultMap命名引用外部的resultMapflushCache将其设置为true不论语句什么时候被调用都会导致缓存被清空。默认值falseuseCache将其设置为true将会导致本条语句的结果被缓存。默认值truetimeout这个设置驱动程序等待数据库返回请求结果并抛出异常时间的最大等待值。默认不设置驱动自行处理fetchSize这是暗示驱动程序每次批量返回的结果行数…resultMap上面查询结果类型是 User类型, 但如果数据库列名与实体类的属性名, 不一致,MyBatis 文件映射不出来:而可以通过SQL 语句查询,列起别名形式进行, 改正:但还是不好,而且 两表连接查询时候, Java一般会在实体类中存在另一个类型对象…这个怎么解决呢~eg: 查看用户及用户的部门信息… 用户表/部门表; 而两表连接需要存部门的信息; 用户有部门属性,所以一般实体类 会放一个部门类的对象… 这就可以使用resultMap常用属性id唯一标识,id 值用于select元素 resuMap的引用;type表示resultMap的映射结果;id 标签子节点 id property属性名“ column”主键列名“ / 一般一个resultMap 只有一个表示查询的主键列,提高程序效率; 如果需要查询多个数据时, 不然你永远只会查到一条数据吃过亏的我...可别学我至于为啥resultMap中如果不定义类似主键之类的能够区分每一条结果集的字段的话会引起后面一条数据覆盖前面一条数据的现象。result:子节点用于标识属性, result property属性名“ column”列名“ / 如果查询时候有些属性应该有值,结果却是 null 就是没有映射上或 映射级别过低…assoction子节点 A表 B表, 两表连接… A类存在B类型对象属性; 就需要使用 assoction 进行映射;assoction 处理 ”一对一“ 的关联关系; w是人事部 s是技术部…property表示在A类中的属性名; javaType : 表示该属性的类名; …collection同 assoction 类似, assoction表示 一对一, 而 collection 则表示 一对多;即查询人事部的所有员工; Java的部门类中就需要一个用户集合…关于映射级别可以在MyBatis-config.xml 中 setting name“autoappMappingBehavior” value“PARTIAL” /NONE : 禁止自动映射;PARTIAL 默认值,允许自动映射; 但 collection/assoction 子元素中,无法自动映射;——级别不够FULL 更高级的映射, 允许 collection/assoction 子元素中自动映射;最后,最后 还要注意的是: 数据库列一定要和实体类类对应!sql语句多表查看不要出现相同的列名(这个问题不大) 实体类的数据类型 要注意! 与数据库的值可以匹配的Error getting nested result map values for sort. Cause: java.sql.SQLException: Invalid value for getInt() - 鏂囧叿中获取“sort”的嵌套结果映射值时出错。 无效的值 getInt() 鏂囧叿————这是我报的错真的是坑死了实体类是 int 数据库是 字符串一定注意SQL映射UserMapper.xml!-- 面向接口 --!-- resultMap元素属性和子节点: id 唯一标识,此ID 用于select元素 resultMap 属性的引用; type 表示resultMap 映射的类型; result: 子节点 property类属性 column库列名 进行一一对应,解决了名字不匹配问题; resultMap 与 resultType 的关联 resultType 直接表示返回结果类型,包括基本数据类型 和 复杂数据类型; resultMap 则是对外部 resultMap 定义的引用,它的场景一般是 数据库字段与实体类属性名不一致使用; 或 两表连接A类存在B类型对象; 关联 MyBatis进行查询映射时候,其实查询出来的字段值都放在一个对应的Map里面,key字段名 value值; select 设置 resultType 时,返回结果也是Map 结构,而底层将 Map的值取出来进行 resultType类型的 setter(xx);进行赋值了; 所以需要get/set!别忘了哦 resultType resultMap 本质上都是 Map 数据结构, 两者不可以同时在一个 select 中使用哦~; --resultMaptypeUseriduserMap!-- property类属性 column库列名 MyBatis也会对 数据库/实体列 相同的进行一一映射,不一致的就需要手动进行映射了; --idpropertyidcolumnid/resultpropertyuserCodecolumnuserCode/!-- ...还好我这儿与数据库都一样就不需要一一映射了 --associationpropertyrolejavaTypeRole!-- result propertyxxx columnxxx / --!-- ...还好我这儿与数据库都一样 且MyBatis: setting 设置 autoMappingBehavior 属性级别 FULL 就不需要一一映射了 --/association/resultMap!--MyBatis-config.xml setting 设置resultMap的自动映射级别NONE禁止自动匹配PARTIAL(默认)自动匹配所有属性有内部嵌套(association、collection)的除外FULL自动匹配所有属性 --!-- 面向接口形式, id 要与接口的方法名相同; --!-- 接口参数使用了 Java注解所以,映射文件这里就不需要,parameterType参数类型了, #{注解名} 找到对应注解值; --selectidloginresultMapuserMapSELECT su.*,sr.roleName FROM smbms_user su ,smbms_role sr WHERE su.userRole sr.id AND su.userName #{name} AND su.userPassword #{pwd}/selectJava接口UserMapper.JavaParam 注解实现多参数// 有时候, 参数需要很多可以使用 parameterType 的 Map Java实体类 但还是比较麻烦~ 还可使用Java 注解来解决…// 只需要在定义接口时候在参数列表需要的参数使用Param( sql中使用的name )参数类型 参数名即可;publicinterfaceUserMapper{//登录方法,根据用户名/密码用户登录,并显示用户部门名称.. 两表连接.. assoction;publicUserlogin(Param(name)Stringname,Param(pwd)Stringpwd);//使用了: 注解形式传参;}注意mybatis传单个类型参数,可以不用param注解,前提是xml中不含有 条件表达式(when,if..动态标签中没有引用到该参数) 大忌映射文件代码片段~!-- 动态SQl 后面文章有详细讲解~ --!-- 单个参数如果参数不加 param if/where/..中是无法使用的..大忌(当时找了好久~) --iftestw !null and w ! !-- 通过 #{w} 方式引入单个参数的值,拼接动态SQL --/if运行类Run.JavapublicUserlogin(Stringname,Stringpwd){SqlSessionsessionMyBatisUtil.createSqlSession();UserMapperumsession.getMapper(UserMapper.class);Useruum.login(name,pwd);MyBatisUtil.closeSqlSession(session);returnu;}collection一对多;根据部门ID查部门,及其所有员工SQL映射RoleMapper.xmlcacheevictionFIFOflushInterval60000size512readOnlytrue/!-- 二级缓存 --!-- eviction 文件的保存形式; flushInterval 缓存对象的毫秒数; size 缓存对象的个数; 先进先出原则,如果已经满了,则最先进的移除,添加新的 readOnly : 只读 --resultMaptypeRoleidRoleMapresultpropertyidcolumnid/collectionpropertyusersofTypeUser!-- ...还好我这儿与数据库都一样 且MyBatis: setting 设置 autoMappingBehavior 属性级别 FULL 就不需要一一映射了 --/collection/resultMapselectidcharesultMapRoleMapuseCachetrueSELECT rs.*,us.userName FROM smbms_role rs ,smbms_user us WHERE rs.id us.userRole AND rs.id#{id};/selectJava接口RoleMapper.Java//根据部门id查看部门信息,及该部门的所有员工publicRolecha(Param(id)intid);运行类Run.Java//根据编号查部门及 部门员工;publicvoidbmcha(){SqlSessionsessionMyBatisUtil.createSqlSession();RoleMapperrmsession.getMapper(RoleMapper.class);//一级缓存缓存数据存储在 sqlSession中;Rolerrm.cha(1);System.out.println(r.getRoleName()\tr.getId());ListUserur.getUsers();for(Useruser:u){System.out.println(user.getUserName());}MyBatisUtil.closeSqlSession(session);}insertinsert完成新增操作;增 删 改 : 会对数据库造成影响, 属于事务. 所以在MyBatisUtil类中SqlSessionFactory.openSession(false); // 参数false表是开启事务控制不传参数表示默认为true(为自动提交事务)如果是false 则记住需要手动提交事务哦, 不然数据不会改变哦常用属性id同上parameterType同上//一般只有查询,有返回结果… 增 删 改 差不多都一致。。。SQL映射UserMapper.xml!-- 新增 --!-- 面向接口形式, id 要与接口的方法名相同; --insertidxzparameterTypeUserINSERT into smbms_user values (null,#{userCode},#{userName},#{userPassword},1,1983-10-10,13688889999,北京市东城区前门东大街9号,2,1,2020-08-18 09:56:31,NULL,NULL);/insertJava接口UserMapper.JavapublicinterfaceUserMapper{//新增publicintxz(Useru);运行类Run.Javapublicvoidaddxz(){//新增的User 对象;UserusnewUser();us.setUserCode(WSM);us.setUserName(wangX);us.setUserPassword(540707);SqlSessionsessionMyBatisUtil.createSqlSession();intjg0;try{//采用面向接口方法//sqlSession.getMapper(接口类.Class); 前提是映射文件命名空间指向接口的地址;// 且映射文件对应的ID名要 和 接口的方法名相同;// Mybatis 底层实现了UserMapper接口,并返回了对应实例,方便调用起对应方法;// 好处,不用在在意 SqlSession 的增删改查的方法 selectone(); insert();...方法了; 可以根据,自定义的方法来实现 增删改查..操作;UserMapperumsession.getMapper(UserMapper.class);//返回影响行数jgum.xz(us);session.commit();//手动提交事务// 注意增删改查操作; 需要提交,虽然数据库进行了新增,但是事务还没结束,根据事务原子性; 成功/失败;}catch(Exceptione){e.printStackTrace();session.rollback();//出现异常,事务回滚;}finally{MyBatisUtil.closeSqlSession(session);if(jg1){System.out.println(新增成功);}else{System.out.println(新增失败);}}};UpdateUpdate完成修改操作;SQL映射UserMapper.xml!-- 修改 --updateidxiugaiUPDATE smbms_user SET userName #{name} WHERE id #{id}/updateJava接口UserMapper.Java//修改 根据角色ID 修改角色姓名;publicintxiugai(Param(id)intid,Param(name)Stringname);运行类Run.Javapublicvoidupd(){System.out.println(请输入要修改用户id);intidinput.nextInt();System.out.println(请输入修改后用户name);Stringnameinput.next();SqlSessionsessionMyBatisUtil.createSqlSession();try{UserMapperumsession.getMapper(UserMapper.class);if(um.xiugai(id,name)1){session.commit();//成功提交事务System.out.println(成功);}else{System.out.println(失败);}}catch(Exceptione){e.printStackTrace();session.rollback();}finally{MyBatisUtil.closeSqlSession(session);}}delete 完成删除操作SQL映射UserMapper.xml!-- 删除 --deleteiddelparameterTypeintDELETE FROM smbms_user WHERE id#{del}!-- 参数只有一个可以随意一点了.. --/deleteJava接口UserMapper.Java//删除 根据角色Id 删除;publicintdel(intid);运行类Run.Javapublicvoiddel(){System.out.println(请输入要删除ID);intidinput.nextInt();SqlSessionsessionMyBatisUtil.createSqlSession();try{UserMapperumsession.getMapper(UserMapper.class);if(um.del(id)1){session.commit();//成功提交事务System.out.println(成功);}else{System.out.println(失败);}}catch(Exceptione){e.printStackTrace();session.rollback();}finally{MyBatisUtil.closeSqlSession(session);}}这里只是笔记,属性详情,关键还是要多练 ——实例代码MyBatisDemo加油奥利硕

相关推荐

MyBatis(随笔: 动态SQL映射文件)
MyBatis(随笔: 动态SQL映射文件)

动态SQL 我们可以用mybatis执行sql的形式来对数据的表进行增删改查操作,不过遇到比较复杂的业务需要写复杂的sql时(比如说sql的条件不确定,可能有一个条件或者多个), 我们就需要动态sql来提高sql的灵活性。 基于OGNL… · 2026/11/6 4:49:50

powershell自动化操作AD域、Exchange邮箱系列(7)—get-aduser/get-user获取信息 取值方法及区别
powershell自动化操作AD域、Exchange邮箱系列(7)—get-aduser/get-user获取信息 取值方法及区别

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 4:49:50

Spring配置补充 (随笔详情扩展:)
Spring配置补充 (随笔详情扩展:)

Spring配置补充&#xff1a; 实现Spring 和 MyBatis 集成过程中学习了,Spring 的配置数据源的方法; 实际开发过程中还有很多灵活的配置文件; 灵活配置DataSource: <!-- 远古方法&#xff08;最初方法&#xff09;,数据库连接池,不过我最喜欢用的; --><bean id"… · 2026/11/6 4:49:50

郑州新郑电工证怎么报名外省证能转吗
郑州新郑电工证怎么报名外省证能转吗

郑州新郑电工证怎么报名外省证能转吗 之前考的证在外省能不能转过来?这是很多在外地考了电工证的朋友最关心的问题。尤其是像漯河应届工程类毕业生,刚毕业就准备进工地或者企业上班,手里一张“郑州新郑电工证”能直接影响就业机会。那到底外省的电工证能不… · 2026/11/7 9:58:59

吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试
吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试

吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试 实操考试心里没底怕挂科?吉安电工证考试报名流程复杂,考前押题成了很多人的救命稻草。特别是对于周口房建工程从业者来说,电工证不仅是上岗的“通行证”,更是保障施工安全的“底线”。但很多人对考… · 2026/11/7 9:58:59

株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介
株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介

株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介 你是不是也担心不知道哪里报名、怕被中介坑?尤其是在株洲市电工证免费培训这条路上,信息太多反而让人更迷茫。今天咱们就从头聊起,帮你理清楚怎么报名、怎么备考、怎么避开那些打着“免费”旗… · 2026/11/7 9:58:59

钢结构施工所需特种工千万别踩坑,别让培训费打水漂
钢结构施工所需特种工千万别踩坑,别让培训费打水漂

钢结构施工所需特种工千万别踩坑,别让培训费打水漂 怕考不过白交培训费?钢结构施工所需特种工考试真的很难?别担心,今天我以许昌培训机构学员的身份,来跟你聊聊这些事儿。说实话,这证考过的人不少,但真正知道怎么考、怎么准备的不多,很多人就是踩坑了… · 2026/11/7 9:58:59

郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道
郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道

郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道 怕考不过白交培训费?我身边就有朋友因为没搞清楚郑州新郑电工证的实操考试内容,结果培训费打了水漂。今天就从真实经历出发,讲讲这个证到底值不值得考,以及它背后隐藏的薪资前景和职业发展机… · 2026/11/7 9:58:59

国企单位什么是特种工?真实经历告诉你怎么考
国企单位什么是特种工?真实经历告诉你怎么考

国企单位什么是特种工?真实经历告诉你怎么考 你是不是也遇到过这种情况:明明是国企单位的岗位,但入职前非要你提供一张特种作业操作证,还说不交就别来上班?结果你连特种工是什么都不清楚,更别提怎么考了。别急,我来给你讲讲,这事儿到底咋整,也给你点… · 2026/11/7 9:57:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41

电工作业提示版通过率揭秘:怎么考才能一次过?
电工作业提示版通过率揭秘:怎么考才能一次过?

电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41

电工证年审报名千万别踩坑 外省证转过来要搞清这几点
电工证年审报名千万别踩坑 外省证转过来要搞清这几点

电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码