Mybatis框架总结(一)
程序员文章站
2024-03-03 19:08:28
...
Mybatis框架总结(一)
一、什么是mybatis
- mybatis是一个持久层的框架,是apache下的*项目。mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
- mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,*灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
- mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
二、mybatis框架
三、入门程序
3.1、需求
- 根据用户id(主键)查询用户信息
- 根据用户名称模糊查询用户信息
- 添加用户
- 删除 用户
- 更新用户
3.2、环境
- java环境:jdk1.7.0_72
- eclipse:indigo
- mysql:5.1
- mybatis运行环境(jar包):
从https://github.com/mybatis/mybatis-3/releases下载,3.2.7版本- lib下:依赖包
- mybatis-3.2.7.jar:核心 包
- mybatis-3.2.7.pdf,操作指南
- 加入mysql的驱动包
3.3、log4j.properties
3.4、工程结构
3.5、SqlMapConfig.xml
- 配置mybatis的运行环境,数据源、事务等
3.6、根据用户id(主键)查询用户信息
- 3.6.1、创建PO类
- 3.6.2、映射文件
映射文件命名:User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml在映射文件中配置sql语句。
- 3.6.3、 在SqlMapConfig.xml加载映射文件
在sqlMapConfig.xml中加载User.xml
- 3.6.4、程序编写
3.7、根据用户名称模糊查询用户信息
- 3.7.1、映射文件
使用User.xml,添加根据用户名称模糊查询用户信息的sql语句。
- 3.7.2、编写代码
3.8、添加用户
- 3.8.1、映射文件
在 User.xml中配置添加用户的Statement
- 3.8.2、程序代码
- 3.8.3、自增主键返回
mysql自增主键,执行insert提交之前自动生成一个自增主键。通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID();是insert之后调用此函数。修改insertUser定义:
- 3.8.4、非自增主键返回
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
执行思路:先通过uuid()查询到主键,将主键输入 到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。
- 3.8.5、通过Oracle的序列生成主键
3.9、删除用户
- 3.9.1、映射文件
- 3.9.2、代码
3.10、更新用户
- 3.10.1、映射文件
- 3.10.2、代码
3.11、总结
- parameterType:在映射文件中通过parameterType指定输入 参数的类型。
- resultType在映射文件中通过resultType指定输出结果的类型。
- #{}:
- #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。 - #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
- #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
- ${}:
- {}。
- ${}接收输入参数,类型可以是简单类型,pojo、hashmap。
- 如果接收简单类型,${}中只能写成value。
- ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
- selectOne和selectList:
- selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
- selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
3.12、mybatis和hibernate本质区别和应用场景
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。
四、mybatis开发dao的方法
4.1、SqlSession使用范围
- 4.1.1 SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
- 4.1.2 SqlSessionFactory:通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
- 4.1.3 SqlSession:SqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。SqlSession最佳应用场合在方法体内,定义成局部变量使用。
4.2 原始dao开发方法(程序员需要写dao接口和dao实现类)
- 4.2.1 思路:程序员需要写dao接口和dao实现类。需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
- 4.2.2 dao接口
- 4.2.3 dao接口实现类
public class UserDaoImpl implements UserDao {
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
// 释放资源
sqlSession.close();
return user;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.insert("test.insertUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.delete("test.deleteUser", id);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
}
4.2.4 测试代码:
4.2.5 总结原始 dao开发问题
- dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
- 调用sqlsession方法时将statement的id硬编码了
- 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
4.3 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
- 4.3.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指定的类型一致。
- 在mapper.xml中namespace等于mapper接口地址
- 4.3.2 mapper.java
- 4.3.3 mapper.xml
- 4.3.4 在SqlMapConfig.xml中加载mapper.xml
- 4.3.5 测试
- 4.3.6 一些问题总结
- 4.3.6.1 代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。 - 4.3.6.2 mapper接口方法参数只能有一个是否影响系统 开发
mapper接口方法参数只能有一个,系统是否不利于扩展维护。系统 框架中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
- 4.3.6.1 代理对象内部调用selectOne或selectList
五、SqlMapConfig.xml
mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
- 5.1 properties属性
需求:将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。
在sqlMapConfig.xml加载属性文件:
properties特性:
MyBatis 将按照下面的顺序来加载属性:
在 properties 元素体内定义的属性首先被读取。 然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。 最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX - 5.2 settings全局参数配置
- mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。
全局参数将会影响mybatis的运行行为。
- mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。
-
5.3 typeAliases(别名)
- 5.3.1 需求
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。 如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。 -
5.3.2 mybatis默认支持别名
别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boolean boolean string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Date decimal BigDecimal bigdecimal BigDecimal
-
5.3.3 自定义别名
- 5.3.3.1 单个别名定义
引用别名:
- 5.3.3.2 批量定义别名(常用)
- 5.3.3.1 单个别名定义
- 5.3.1 需求
- 5.4 typeHandlers(类型处理器)
mybatis中通过typeHandlers完成jdbc类型和java类型的转换。通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.。 - 5.5 mappers(映射配置)
- 5.5.1 通过resource加载单个映射文件
- 5.5.2 通过mapper接口加载单个mapper
按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。
- 5.5.3 批量加载mapper(推荐使用)
- 5.5.1 通过resource加载单个映射文件
六、输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。
七、输出映射
- 7.1 resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。 - 7.2 resultMap
mybatis中使用resultMap完成高级输出结果映射。- 7.2.1 resultMap使用方法
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。1、定义resultMap 2、使用resultMap作为statement的输出映射类型
使用resultMap作为statement的输出映射类型
- 7.2.1 resultMap使用方法
- 7.3 小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
八、动态sql
- 8.1 什么是动态sql
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 - 8.2 需求
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
- 8.3sql片段
- 8.3.1 需求
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。 - 8.3.2 定义sql片段
- 8.3.3 引用sql片段
- 8.3.1 需求
-
8.6 foreach
向sql传递数组或List,mybatis使用foreach解析-
8.6.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)
-
上一篇: SpringBoot创建JSP登录页面功能实例代码
下一篇: java实现计算地理坐标之间的距离
推荐阅读