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 总结问题
- dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
- 调用sqlsession方法时将statement的id硬编码了
- 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发
4.2 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
4.2.1 mapper代理开发规范
程序员还需要编写mapper.xml映射文件 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象
- 在mapper.xml中namespace等于mapper接口地址
- mapper.java接口中的方法名和mapper.xml中statement的id一致
- mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
- 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)