mybatis
jdbc存在的问题:
1.简单的通过驱动来创建数据库会存在:数据库连接时就创建,不使用就立即释放,这样反复的创建与释放会导致资源浪费的问题。可以通过使用数据库连接池来管理数据库的连接。
2.将sql语句直接写入java代码中,耦合度极高。可以通过xml配置文件将需查询的sql语句分开存放便于维护。
3.从resultSet中获取结果时,结果集的结构与字段耦合度高。可以设想将结果集转化为java对象。
为什么要使用mybatis?
mybatis是一个持久层框架,是apache下的项目。mybatis让程序员将主要精力放在sql语句上,通过mybatis提供半自动化的映射方式生成sql。mybatis可以将jdbc的Statement输出参数自动输入映射,将查询结果集灵活的输出映射成java对象。下载地址:(https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.4.5)
mybatis框架
SqlMapConfig.xml是mybatis的全局配置文件,配置了数据源、事务等mybatis的运行环境。
配置映射关系(配置sql语句):mapper.xml…
SqlSessionFactory会话工厂用来创建SqlSession。
SqlSession用于操作数据库,发出CRUD的sql语句。
Executor(执行器(基本执行器、缓存执行器))SqlSession内部通过执行器操作数据库。
mapped statement是一个低层封装对象,对操作数据库存储封装,包括sql语句,输入参数,输出结果类型。
SqlSessionFactory用单例模式来实现
SqlSession是线程不安全的,所以在方法体内使用定义为局部变量使用。
原始Dao开发与映射开发优劣
1 原始dao模版开发方法有很多重复代码。效率低。
2 调用sqlSession方法时与映射文件耦合度高。
3 调用sqlSession时因为参数类型为Object,理论上可以穿入任何类型数据,安全性差。
mapper 映射:
1 编写mapper.xml映射文件
2 编写mapper.java(UserMapper)接口
3 mybatis自动生成mapper接口实现类代理对象
开发方法:
1 mapper.xml中namespace应该是mapper.java接口的全称
2 mapper.java接口的方法名应该和mapper.xml中statement的id一致
3 mapper.java接口的方法输入参数类型应该和statement中parameterType指定类型一致
4 mapper.java接口的方法中返回值类型和statement中resultType指定类型一致
以上4步开发规范可以使得接口的方法实现自动生成。
注意事项:
1 尽量使用selectList方法调用
2 方法参数只能有一个,有局限性,解决方法是用不同类型多种包装的bean来作为参数
UserQueryVo 用于多个bean对象包装映射
resultMap:
如果你查询出来的列名和bean的属性名不一致,通过定义一个resultMap对列名和bean属性名之间做一个映射关系。
1 定义一个resultMap
2 使用resultMap作为statement和bean之间的输出映射
resultMap 可以进行延迟加载 resultType无法进行延迟加载
动态SQL
1 对查询条件进行判断是否为空
2 抽取出代码块,以便于重用
3 foreach标签 向sql中传递list可以用foreach解析
延迟加载
resultMap可以通过使用association,collection实现高级映射。association,collection具备延迟加载的功能。延迟加载表示先从单张表中查询,如果不能满足需求再去关联查询,可以提高数据库性能,因为查询单表要比关联查询多张表速度快。
spring和mybatis的整合
1 需要spring通过单例的方式管理SqlSessionFactory
2 持久层的mapper都需要spring来管理
3 spring和mybatis整合自动通过SqlSessionFactory创建SqlSession