SSM - Mybatis

发布时间 2023-07-11 23:12:27作者: zjfun

1. Mybatis 简介

Mybatis 官网 @ mybatis – MyBatis 3 | 简介
M
ybatis下载 GitHub @ GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java
Maven 仓库 @ Maven Repository: org.mybatis » mybatis (mvnrepository.com) , 其中POM修改如下:

    <dependency>
      <!--  mysql驱动-->
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
    </dependency>

    <!--  mybatis-->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.13</version>
    </dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

 

 2. Mybatis 配置

涉及到的新文件:需要配置: POM.xml文件,resources/  mybatis-config.xml文件(定义MySQL数据库)/  UserMapper.xml文件(具体定义数据库访问接口规范)
如果遇到src/main/java/com/crevew/dao/*.xml 不打包的问题,有几种解决方案:

1. 把xml文件移到 resources目录下面,系统默认打包该文件夹下所有文件
2. 在POM.xml文件中增加以下配置,显示让maven打包;增加后,务必reload project,否则POM的修改不生效。(如果还不生效,就重启IDEA)
3. 可以在 target/classes/com/crevew/dao/ 下面核实该文件是否存在。

  <build>
  <!--配置打包时不过滤非java文件开始  -->
  <!--说明,在进行模块化开发打jar包时,maven会将非java文件过滤掉,
  xml,properties配置文件等,但是这些文件又是必需的,
  使用此配置可以在打包时将不会过滤这些必需的配置文件。
  -->
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
  </build>

 Mybatis Idea 编辑

Mybatis XML Idea编辑自动提示方法 (强烈推荐):@ (14条消息) IDEA Mybatis xml中配置sql代码自动提示【必看】_idea中xml如何设置自动提示_mingyuexinc的博客-CSDN博客 
Mybatis plugin @ IDEA 添加 mybatis mapper的xml文件的自动提示功能 - 简书 (jianshu.com)

3. Mybatis 语法

Mybatis查询就直接查询;增删改需要提交事务。

Mybatis Mapper.xml 参数有三种类型:
1. Object,直接在sql取对象的属性即可
2. Map传递参数,直接在sql中取出属性,用于输出多个参数  (多个参数输入 用Map或者注解)
3. 基本类型(基本类型也可以不写)

模糊查询,可以在xml sql 当中拼接(不安全),也可以在代码执行的时候传递%%

select * from mybatis.user where name like #{value}
或者
List<User> userList = mapper.getUserLike("%李%");

#{} 预编译, ${} 无预编译

 4. 配置解析

4.1 Mybatis 默认设置

默认的事务管理器是JDBC, 默认的连接池POOLED

4.2 Properties/typeAliases/Settings/Mappers

Properties: 可以通过properties属性来引用配置文件,如果配置db.properties之后,出现连接错误,原因是: @ 解决Mybatis报错:### Error querying database. Cause: java.sql.SQLException: No suitable driver found for_zhaiC_的博客-CSDN博客

typeAliases:

  • 为Java类型设置一个短的名字(DIY),减少冗余;
  • 也可以指定包名,Mybatis会自动搜索Java Bean,首字母小写;
  • 在实体类较少时,使用前者;实体类较多的时候,使用后者; 但是后者不可以DIY,如果非要改,就在POJO上面增加注解实现@Alias()

Settings: logImpl, cacheEnabled, lazyLoadingEnabled 等。 (Plugin: mybatis-generator-core, mybatis-plus, 通用mapper)

Mappers 映射器: 通过 resource,class,file(不用),package,四种方式加载mapper

4.3 作用域和生命周期

SqlSessionFactoryBuilder: 一旦创建SqlSessionFactory,就不再需要了
SqlSessionFactory: 可以想象为数据库连接池,运行期一直存在,应用作用域;单例模式,或者静态单例模式
SqlSession: 连接到连接池的一个请求,用完需要关闭

5. 映射文件

5.1 ResultMap 

解决属性名和字段名不一致的问题。问题是:数据库的字段名称,和pojo属性不一致。

方法一:别名

    <select id="getUserById" parameterType="int" resultType="UserAlias">
        select id,name,pwd as password from mybatis.user where id = #{id}
    </select>

方法二:ResultMap 结果集映射

6. 日志

logImpl: 重点是LOG4J, STDOUT_LOGGING

LOG4J 配置文件设置 @ (15条消息) LOG4J的配置文件_log4j配置文件_小逗比iswho的博客-CSDN博客 

7. 分页

1. 使用SQL语句的limit实现分页,比如:select * from mybatis.user limit 1,2
2. 使用RowBounds分页,比如 

        //通过RowBounds实现
        RowBounds rowBounds = new RowBounds(1, 2);
        //通过Java代码层面实现分页
        List<User> userList = sqlSession.selectList("com.crevew.dao.UserMapper.getUserByRowBounds",null, rowBounds);

3. 分页插件: MyBatis PageHelper

8. 注解开发

关于接口的理解:

  • 接口从更深层次的理解,应是定义(规范、约束)与实现(名实分离的原则)的分离。
  • 接口的本身反映了系统设计人员对系统的抽象理解。
  • 接口应有两类:第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface)。
  • 一个个体可能有多个抽象面。抽象体与抽象面是有区别的。

三个面向区别

  • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法。
  • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。
  • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题。更多的体现就是对系统整体架构。

注解和XML配置,可以同时使用。 注解的使用方法就是:在接口上实现。

  • 本质:反射机制实现。
  • 底层:动态代理。

9. Lombok

Lombok安装方式有三部,IDEA安装,POM引用,接口使用。详见 @ (15条消息) idea中怎么使用lombok依赖_idea依赖树只有lombok_南商的博客-CSDN博客

10. 多对一处理

实验环境搭建: @ (15条消息) Mybatis一对多,多对一_mybatis一对多 多对一_羊村跳水冠军个人学习笔记的博客-CSDN博客