mybatis的学习

琐碎 寻梦 6年前 (2019-03-04) 490次浏览 0个评论 扫描二维码

1 主键返回

1.1 自增主键返回
 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。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。

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加载单个映射文件
<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)
[支付宝扫码,感谢支持]
分享 (0)
关于作者:

您必须 登录 才能发表评论!