mybatis的学习

2023-03-14 15:42:55 浏览数 (2)

1 主键返回

1.1 自增主键返回
代码语言:javascript复制
 mysql自增主键,执行insert提交之前自动生成一个自增主键。
 通过mysql函数获取到刚插入记录的自增主键:
 LAST_INSERT_ID()   
 是insert之后调用此函数。
 修改insertUser定义: 

1.2 非自增主键返回

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中。 执行uuid()语句顺序相对于insert语句之前执行。

2 #{}、${}
2.1 #{}

{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,#{}中可以写成value或其它名称。 {}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。

2.2 ${}

{}表示一个拼接符号,会引用sql注入,所以不建议使用{}。 {}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,{}中只能写成value。

3 mybatis和hibernate本质区别和应用场景

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。 对sql语句进行优化、修改比较困难的。 应用场景:适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。 应用场景:适用与需求变化较多的项目,比如:互联网项目。 企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

4 mybatis开发dao的方法
4.1 原始dao开发方法(程序员需要写dao接口和dao实现类)
4.11 思路

程序员需要写dao接口和dao实现类。 需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

4.12 dao接口

4.13 dao接口实现类

4.1.4 测试代码

4.2.5 总结问题
  1. dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
  2. 调用sqlsession方法时将statement的id硬编码了
  3. 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发
4.2 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
4.2.1 mapper代理开发规范

程序员还需要编写mapper.xml映射文件 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象

  1. 在mapper.xml中namespace等于mapper接口地址
  2. mapper.java接口中的方法名和mapper.xml中statement的id一致
  3. mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
  4. mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

总结: 以上开发规范主要是对下边的代码进行统一生成: User user = sqlSession.selectOne(“test.findUserById”, id); sqlSession.insert(“test.insertUser”, user); ………

4.2.2 在SqlMapConfig.xml中加载mapper.xml

4.2.3 测试

5 SqlMapConfig.xml

mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:

  • properties(属性)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境集合属性对象)
  • transactionManager(事务管理)
  • dataSource(数据源)
  • mappers(映射器)

注意:这里的配置有些用到的配,用不到的可以不写,但是顺序一定要一样

不然会报如下错误:

6 自定义别名
6.1 单个自定义别名

引用

6.2 批量定义别名

7 mapper映射
7.1 通过resource加载单个映射文件
代码语言:javascript复制
<mapper resource="mapper/UserMapper.xml"/>
7.2 通过mapper接口加载单个mapper

7.3 批量加载mapper(推荐使用)

8 输出映射
8.1 resultType

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。 如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

8.2 resultMap
8.2.1 resultMap使用方法

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。 1、定义resultMap 2、使用resultMap作为statement的输出映射类型

8.2.2 将下面的sql使用user完成映射

SELECT id id_,username username_ FROM USER WHERE id=#{value} User类中属性名和上边查询列名不一致。

定义:

使用:

9 动态sql

mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

9.1 需求

用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。 对查询条件进行判断,如果输入参数不为空才进行查询条件拼接

9.2 mapper.xml

9.3 sql片段
9.3.1 定义

9.3.2 引用sql片段

9.4 foreach

向sql传递数组或List,mybatis使用foreach解析

9.4.1 需求

在用户查询列表和查询总数的statement中增加多个id输入查询。 sql语句如下,两种方法: SELECT * FROM USER WHERE id=1 OR id=10 OR id=16 SELECT * FROM USER WHERE id IN(1,10,16)

9.4.2 mapper.xml

0 人点赞