mybatis超详细学习文档快速入门

本文深入介绍了MyBatis框架,包括其基本概念、特点、与JDBC及Hibernate的区别,以及如何在实际项目中进行配置和使用。并通过实例展示了参数传递、结果映射、动态SQL等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是mybatis,为什么要使用它?

2、特点

Mybatis:

a、支持自定义SQL、存储过程、及高级映射

b、实现自动对SQL的参数设置

c、实现自动对结果集进行解析和封装

d、通过XML或者注解进行配置和映射,大大减少代码量

e、数据源的连接信息通过配置文件进行配置

3、和jdbc及hibernate进行对比

可以发现,MyBatis是对JDBC进行了简单的封装,帮助用户进行SQL参数的自动设置,以及结果集与Java对象的自动映射。与Hibernate相比,配置更加简单、灵活、执行效率高。但是正因为此,所以没有实现完全自动化,需要手写SQL,这是优点也是缺点。

4、如果你是公司研发人员你会如何做选择?

对性能要求较高的电商类项目,一般会使用MyBatis,而对与业务逻辑复杂,不太在乎执行效率的传统行业,一般会使用Hibernate

5、整体架构

6、mybatis-config.xml配置

mybatis-config.xml讲究严格的顺序,具体顺序遵循文档的顺序

7、properties属性读取外部资源

添加jdbc.properties资源文件:

在Mybatis-config.xml中引入jdbc.properties资源文件:

8、typeAliases

之前咱们在映射文件中用到java类型时,都是使用类的全路径,书写起来非常麻烦

解决方案:

类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

9、Mappers

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。

10、resource

在mybatis-config.xml引入项目目录下的映射文件:

缺点很大:

a、硬盘位置可能随着项目的部署或迁移,路径发生变化,不方便维护

b、每新增一个映射文件,就要在全局配置文件中引入

解决方法:

在mybatis-config.xml配置mapper接口的全路径

这种配置方式,在全局配置文件中配置了mapper接口的全路径,并没有配置mapper接口的映射文件的位置。如果要让mybatis找到对应的映射文件,则必须满足一定的条件或规则:

a、映射文件和mapper接口在同一个目录下

b、文件名必须一致

c、映射文件的namespace必须和mapper接口的全路径保持一致

目录结构如下:

11、mybatis-config.xml开启包扫描

我们发现,我们每添加一个mapper.java就要在配置中添加一条信息,不利于维护。

解决方案:

有利必有弊,如果包的路径有很多,显得很杂;mapper.xml和mapper.java没有分离

12、CRUD标签

a、select

b、insert

c、update

d、delete

13、parameterType传入参数(常用)

CRUD标签都有一个属性parameterType,statement通过它指定接收的参数类型。

接收参数的方式有两种:

a、#{}预编译

b、${}非预编译(直接的sql拼接,不能防止sql注入)

参数类型有三种:

a、基本数据类型

b、HashMap(使用方式和pojo类似)

c、Pojo自定义包装类型

a、#{}预编译

b、${}非预编译(直接的sql拼接,不能防止sql注入)

应用场景:

在UserMapper接口中,添加根据表名查询用户信息的方法:

在UserMapper映射文件中,添加方法对应的statement:

输出(报错):

如果你要动态传入的字段名是表名并且sql执行是预编译的(预编译:就是?,看不到的数据),这显然是不行的,所以你必须改成非预编译的,也就是这样:


使用${} 去接收参数信息,在一个参数时,默认情况下必须使用${value}获取参数值,

而#{} 只是表示占位,与参数的名字无关,如果只有一个参数,可以使用任意参数名接收参数值,会自动对应。

但是这并不是一种稳妥的解决方案,推荐使用@Param注解指定参数名,所以以上接口及映射文件可以改成如下:

一个参数时,在使用#{}传参时,可以通过任意参数名接收参数;而${},默认必须通过value来接收参数

详细可以参考:https://jingyan.baidu.com/article/0320e2c110ded71b87507b35.html
 

14、实现一个简单的用户登录,根据username和password验证用户信息(这里是多个参数)

在UserMapper接口中,添加登陆方法:

在接口方法中的参数前,添加@Param注解指定参数名:

通常在方法的参数列表上加上一个注解@Param(“xxxx”) 表示参数的名字,然后通过${“xxxx”}或#{“xxxx”}获取参数。

总结

单个参数时,#{}与参数名无关的。

多个参数时,#{} ${}与参数名(@Param)有关。

什么时候需要加@Param注解?什么时候不加?

单个参数不加,多个参数加

终极解决方案:都加。

15、面试题(#、$区别)

16、resultMap

在UserMapper.xml中配置resultMap:

在UserMapper.xml中使用resultMap:

在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap。

<select>标签中resultMap根据<resultMap>标签中的id找到对应的type类型,相当于resultType直接写类的类型,resultMap会自动

映射单表查询的结果集。

17、HashMap

parameterType有三种类型的输入参数:

  1. 基本数据类型
  2. hashMap
  3. pojo包装类

前面已经使用了基本数据类型和pojo类型的参数,那么hashMap这种类型的参数怎么传递参数呢?

其实,它的使用方式和pojo有点类似,简单类型通过#{key}或者${key},复杂类型通过${key.属性名}或者#{key.属性名}

UserMapper接口方法:

UserMapper配置文件:

测试用例:

18、动态sql

a、if

案例:查询男性用户,如果输入了用户名,按用户名模糊查询

在UserMapper接口中定义方法:

在UserMapper映射文件中,定义接口方法对应的Statement

在UserMapperTest测试类中,添加测试用例

b、choose when otherwise

案例:查询男性用户,如果输入了用户名则按照用户名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找用户名为“zhangsan”的用户。

在UserMapper接口中,定义接口方法:

在UserMapper.xml中,定义接口方法对应的Statement

在UserMapperTest测试类中,添加测试用例

c、where

案例:查询所有用户,如果输入了用户名按照用户名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立

在UserMapper接口中,定义接口方法:

在UserMapper.xml中,定义接口方法对应的Statement

在UserMapperTest测试类中,添加测试用例

d、foreach

案例:按照多个id查询用户信息

在UserMapper.xml中,定义接口方法对应的Statement

在UserMapperTest测试类中,添加测试用例

总结:

If 判断 test-判断条件,OGNL表达式

Choose when(判断,test,一旦有一个when成立,后续不再执行) otherwise(所有的when都不成立,才会执行)

Where:添加where关键字,去掉动态sql之前多余的一个and|or

Set:添加set关键字,去掉动态sql之后多余的一个逗号

Foreach:collection-接收集合 item-遍历其中一个元素 separator-分割符 open-以什么开始 close-以什么结束。

19、mybatis中的resultType和resultMap我该如何做选择,这里一幅图来告诉大家如何选择

a、resultType是自动映射,通过给到的类(这里我举例是User),自动将查询出来的数据(键值对),映射到对应的类的属性名及属性值上

b、resultMap自定义映射,属性通过column标签来指定表与实体类之间的对应关系,通过<resultMap>标签中的id找到对应的类

下面更详细的解释

 

 

入门 安装 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。 如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>从 XML 中构建 SqlSessionFactory 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。 String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息)。 不使用 XML 构建 SqlSessionFactory 如果你更愿意直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建你自己的 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。 .....................................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值