入门:

数据库列名与实体类的属性名一致,无需dao接口实现类,导入需要的相应的pom坐标

  • xml配置
  1. 主配置文件:在<configuration></configuration>标签中配置数据库连接和映射配置文件位置。
主配置文件
  • 主配置文件:
  1. 在<mapper></mapper>标签下配置相应的具<select>/<update>/<insert>/<delete>标签。
  2. 配置过程中体现:namespace+id 为需要绑定的查询数据库的dao层接口方法
  3. "ResultType"体现返回值类型,"parameterType"体现参数类型,有就配上。
映射配置文件
  • 注解配置:删除xml配置文件,在dao层接口方法上添加注解,修改主配置文件的<mapper></mapper>标签内容
xml配置时dao层接口
注解配置时dao层接口
主配置文件mappers标签修改
  • 测试:
测试类实现
  • 结果:
查询获得的部分结果集

入门总结:

  1. 测试类编写思路:1.解析配置文件2.创建sqlSessionFactory对象3.获取代理对象4.获取实体类接口对象5.执行实体类方法6.释放资源 (用到了工厂模式、构建者模式、代理模式)
  2. 主配置配置文件中,在<configuration></configuration>标签中先配置<environments></environments>;再配置对应dao的mapper的resource属性是文件夹形式 resource="com/phonydao/StaffDao.xml;(配置文件位置),还可以用package标签(别名时使用)、class标签 (<mapper class="com.phony.dao.StaffDao"/>注解配置时使用)
  3. mybatis的映射配置文件位置(全限定类名)必须和dao的接口的包结构相同。
  4. 注解开发步骤: 1.注解开发,把resources具有相同包结构dao配置xml文件删除,在dao层的接口方法上写注解,并在SqlMapConfig.xml中mapper改为使用class即可,具体在dao层接口上使用@select注解,并指定sql语句,同时在【SqlMapConfig.xml中mapper中配置class属性】,属性值为dao接口的全限定类名

Dao层开发:

MyBatis支持Dao层实现类的实现:(新手看看就好,面向对象编程)测试类创建好“含有内容”的工厂,通过创建dao层实现类对象把工厂传入dao层,在实现类中创建该工厂私有变量,以及参数为该工厂的构造方法。之后利用传过来的工厂获取session对象,再去调用各种操作数据库的方法如:selectList、selectOne、update...,参数都为dao接口的方法的全限定类名,当方法存在参数,那么调用的这个方法需要增加第二个参数:

创建好“含有内容”的工厂
在实现类中创建该工厂私有变量,以及参数为该工厂的构造方法

下面详述几个dao层开发时配置文件的细节问题:

1、插入操作存在数据库乱码问题,在主数据库配置文件中,url属性增加字符设置,后面数据库配置在外部文件时,也是一样添加字符设置,略有不同。

<property 

2、所有操作都需要利用session对象关闭资源,除查询对象外,需要提交事务操作。

3、(基础)实体类可以包装实体类。当实现类的方法参数设置:
3.1、单独一个参数时可以在被调用时直接加上:

单独参数

3.2、实体类作为参数时,需要创建实体类对象,并在被调用方法下创建对象,并给对象赋值:

实体类作为参数

3.2.1、当设置的涉及到数据库主键字段id时,其他操作没影响,需要注意的是新增操作 时,id的值。dao映射配置文件没有在sql语句中设置id,那么语句可以正常执行,控制台打印id=0,数据库却在自增长(前提设置了id自增长);dao映射配置文件在sql语句中设置id,只要与数据库已存在id不重复即可。

这里提供配置一个 获取插入操作后id的值:

keyProperty:实体类主属性;keyColumn:数据库表主键字段;order:设置在操作前/后获取;最后注意sql的编写。

4、映射配置文件相关细节:

4.1、sql语句的参数格式 #{xxx};

4.2、parameterType:参数类型(例:parameterType="com.phony.domain.staff"、parameterType="Integer")、resultType:返回类型(同上)

ps:当参数类型为一个基本类型(包装类),参数的#{}中可以随意写,不必按照实体类属性名

4.3、模糊查询时参数的两种写法:#{xxxx} 、'%${value}%' 一定要有LIKE 后者一定是value:前者直接达成占位符效果,只是调用时参数两边要加上%;后者被调用时直接加参数就行了。

4.4、当参数是包装实体类的实体类,创建包装实体类的实体类,使用OGNL思想,参数类型选包装实体类,#{}中填写被包装的实体类再点需要的属性。被调用时一层一层往上保存

映射配置文件配置
调用并传参

4.5、数据库与实体累属性名称不一致时处理方案:

1.可以在映射配置文件中sql语句起别名;#{}中写实体类的属性名,重命名的是sql语句操作数据库字段后AS为实体类字段,多个参数用 逗号隔开。

方案一:重命名字段

2.映射配置文件中添加配置操作;配置<resultMap></resultMap>标签

方案二:配置resultMap标签

Type的值原先应该是实体类的全限定类名,由于在主配置文件mappers标签中用package标签配置,所以这里用别名就可以了

5、关于在外部配置数据库连接信息:

定义在内部
定义在外部
定义到外部配置文件
&amp;characterEncoding=UTF-8 

这个配置参数在配置信息转移到外部配置文件时,需要更改这样模糊查询就不会查询不到数据了

jdbc.url=jdbc:mysql://localhost:3306/java-web?characterEncoding=UTF-8

6、在主配置文件中给dao层映射配置文件用到该实体类时配置的别名:package标签配置时标识包类所有实体类被使用时都可以用类名做别名。

配置实体类别名

动态Sql

1、数据库与实体类映射。数据库字段与实体类属性不一致时,在映射配置文件中首要配置相应的映射关系:那么当操作返回实体类型时,我们不用写resultType属性了,需要写resultMap属性了

实体类与数据库映射
使用映射关系resultMap

2、使用<sql></sql>标签可以对常用的sql语句进行封装。

使用include标签引用:

<sql></sql>标签中不一定是完整的sql语句,只要是今后开发中出现次数比较多的都可放在里面,只要注意拼接的细节即可。

3、动态sql--if标签的使用。前提是sql语句结尾添加了WHERE 1=1,再去使用if标签,使用test标签属性做一个是否为空的判断,不为空if标签体内 AND开头做sql拼接(一般是WHERE的条件句)

if标签拼接sql

多个条件就多个if标签拼接:

多个if拼接

ps:实体类属性名可以写在#{}里、if标签test属性判断值。

4、动态sql--where标签的使用。用where标签包裹if标签,之前需要的前替就不没有了。

5、动态sql--foreach标签的使用。满足带有IN的子查询,如给定一个id集合,查询所有id的用户。在包装实体类中设定集合对象(方便被调用时设值);在where标签下嵌套if标签,if标签验证集合是否为空(多个判断依据用and连接,and切记不要大写);if标签体中在嵌套foreach标签,collection属性值为实体类集合名,open、close属性拼接"AND id IN ()",item属性为遍历集合的单个值,separator属性为IN中分隔符;foreach标签体内需要写#{xxx},xxx必须和item属性值一致。

实体类添加集合属性
配置拼接sql
测试类

关于事务

  • 在测试类中写在destroy方法中
  • 在测试类中获取session对象时设置参数为true,便设置成了自动提交事务(不常用)
//当设置参数为true时表明设置了自动提交.init方法就不需要提交事务了

多表连接先考虑写好sql,再去配置

一对一

在一个类中设置另一个类对象作为变量,在映射配置文件中配置类与该属性的分装,association标签连接,结合javatype属性

还有一种不常用的继承子类方式,toString加上子类的toString方式

一对多

在一个类中设置另一个类集合引用,在映射配置文件中配置该类与类集合的封装,用collection标签结合ofType属性。

多对多

多对多则互相在实体类中设置另一个实体类对象的属性,并都在映射配置文件中用collection标签结合ofType属性。

缓存

开启缓存
延迟加载开关

一级缓存:指的是Mybatis中的SqlSession对象的缓存
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供的一块区域
该区域的结构是一个Map.当我们再次查询同样的数据,mybatis会先去sqlSession中查询是否有,有的话直接拿出来用
当SalSession对象消失时,mybatis的一级缓存也就消失了

二级缓存:配置中使用ResultMap->association标签中添加select属性配置你需要的查询的全限定类名.方法

二级缓存开关

注解开发

当数据库字段和实体类属性名不一致时:

@One注解(一对一)代替了<assocation>标签;@Many注解(多对一)代替了<Collection>标签。

配合注解完成二级缓存设置。

欢迎指错。。。

mybatis 多表插入_CRUD_Operator-Mybatis相关推荐

  1. case mybatis 不同表_解决mybatis case when 报错的问题

    在mybatis中使用case when进行条件筛选判断时遇到 Failed to process, please exclude the tableName or statementId. 这样的报 ...

  2. mybatis批量夺标添加_MyBatis+MySQL同时执行多条SQL,实现多表插入数据

    相信很多人都遇到过往Mybatis的Mapper.xml文件粘贴SQL的时候,因为多了一个';'而导致SQL报错的情形吧. 难道就不能执行多条SQL了么?其实是可以的.在分表的情况下,这种需求是强烈的 ...

  3. ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置

    一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...

  4. mybatis多表联查

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献]八个方面深度解析后端知识/技能. 大家好,我是IT修真院深圳分院一 ...

  5. Mybatis多表联查简简单单

    Mybatis多表联查 1.一对一关系`association` 2.一对多关系`collection` 3.多对多关系 Mybatis中实现了对数据库中的数据进行封装,那么进行多表查询时就会遇到查询 ...

  6. SpringBoot+MyBatis多表联合查询

    SpringBoot+MyBatis多表联合查询 写在前面 联合查询在实际工作中用的并不多,因为很多表的数据比较大,或者说未来比较大的表,都要谨慎使用联合查询 数据准备 建表语句 create tab ...

  7. 极其方便的使用Mybatis单表的增删改查

    [活动]Python创意编程活动开始啦!!!      CSDN日报20170427 --<如何在没有实际项目经验的情况下找到工作>      深入浅出,带你学习 Unity 目录(?)[ ...

  8. MyBatis多表查询之XML和注解实现(resultMap结果集映射配置数据库字段与实体类属性一一映射)

    MyBatis多表查询 多表模型分类 一对一:在任意一方建立外键,关联对方的主键. 一对多:在多的一方建立外键,关联一的一方的主键. 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键. 数 ...

  9. mysql基础----mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  10. Mybatis—多表查询

    Mybatis多表查询 一对一查询 一对一查询的模型MapperScannerConfigurer 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 创建Order和User实体 ...

最新文章

  1. MySQL面试三连杀:如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...
  2. java的classpath配置文件_Java Classpath及.properties配置文件
  3. 使用Java 8流进行快速失败的验证
  4. 前端学习(1142):预定义类
  5. 韵乐x5效果器ktv最佳参数_家庭ktv(卡拉ok)家庭影院ktv选购推荐攻略
  6. 【模块化开发】之 Webpack、Rollup、Parcel
  7. js数据结构hashMap -----hashMap
  8. 智慧工厂3D物联网可视化建模管理系统
  9. google code prettify 多款主题颜色及下载
  10. Linux服务器安装mysql
  11. 2019~2020数字货币领域发展趋势报告
  12. 葫芦娃手游服务器未响应,葫芦娃手游闪退解决方法_葫芦娃手游闪退原因_玩游戏网...
  13. WIFI万能钥匙显密码版
  14. 软件设计-UML类图详解说明
  15. 【机器学习实战系列】读书笔记之DecisionTree(ID3算法)(三)
  16. Android 魅族 线性马达 mEngine 震动适配
  17. 正点原子LCD转接板与最小系统板的连接
  18. 超声换能器的主要性能指标
  19. 常见商品期货量化交易策略
  20. TextRank算法的基本原理及textrank4zh使用实例

热门文章

  1. Spring Data JPA
  2. sersync+rsync多实例网站数据同步
  3. JQuery Show()的几种效果 总有一种是你需要的
  4. Linux:init 0~6
  5. 自定义标签之使用struts的valueStack取值
  6. 在dll中用DirectSound8同时播放多个wav文件不能发声
  7. Windows下运行linux桌面程序
  8. html能不能连数据库,html下利用javascript连数据库
  9. vue .native 方法未定义_技术分享谈谈Vue的响应式原理
  10. 计算机课堂热身游戏,电脑课我们常玩的13个小游戏