mybatis
2016-03-14 15:44
204 查看
一。传统数据库编程的缺点:
1.数据库连接,使用时就创建不使用时释放,对数据库频繁的连接开启和关闭,造成数据库资源的浪费,影响数据库性能
解决方案:使用数据库连接池来管理
2.将sql语句硬编码到Java程序,如果修改语句那么程序就必须重新编译,不利于系统维护
解决方案:将sql语句放到配置文件中
3.向preparedStatement中设置参数,占位符和参数出现了硬编码
解决方案:将sql语句、占位符、参数放到配置文件中
4.从resultSet中遍历结果数据集的时候,获取表的字段存在硬编码
解决方案:将结果集自动映射为Java对象
二。mybatis框架原理
mybatis是持久层框架,是Apache的项目。mybatis让程序将主要精力放在sql语句上,通过mybatis提供的映射方式,自由灵活生成(半自动化)满足需要的sql
mybatis可以将向preparedStatement的输入参数自动映射输入,将查询结果集灵活的映射为Java对像输出映射
mybatis{
sqlMapConfig.xml(是mybatis的全局配置文件,名称不固定的)配置了数据源、事务等mybatis运行环境配置映射文件(配置sql语句)mapper.xml(映射文
件)、mapper.xml、mapper.xml.....
SqlSessionFactory(会话工厂),根据配置文件创建工厂作用:创建SqlSession
SqlSession(会话),是一个接口,面向用户(程序员)的接口作用:操作数据库(发出sql增、删、改、查)
Executor(执行器),是一个接口(基本执行器、缓存执行器)作用:SqlSession内部通过执行器操作数据库mapped statement(底层封装对象)作用:对操
作数据库存储封装,包括 sql语句,输入参数、输出结果类型
mysql
三。一对一查询
由订单查询用户信息:sql为SELECT orders.*,USER.username,USER.sex,USER.address
FROM
orders,USER WHERE orders.user_id = us
er.id
resultType:使用较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射
resultMap:需要单独定义resultmap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultmap可以完成将关联查询映射pojo属性中
resultMap是能实现延迟加载的,而resultType是无法实现的
四。一对多查询
比如查询订单和订单明细:SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.ite
ms_id,orderdetail.items_num,orderdetail.orders_id
FROM
orders,USER,orderdetail
WHERE orders.user_id = user.id AN
D orderdetail.orders_id=orders.id
mybatis使用resultMap的collection对关联查询的多条数据映射到一个list集合属性中
五。多对多查询
比如查询用户和用户购买的商品信息:SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdet
ail.items_id,orderdetail.items_num,orderdetail.orders_id,items.name items_name,items.detail items_detail,items.pri
ce items_price FROM orders,USER,orderdetail,items WHERE orders.user_id = user.id AND orderdetail.orders_id=orde
rs.id AND orderdetail.items_id = items.id
1.数据库连接,使用时就创建不使用时释放,对数据库频繁的连接开启和关闭,造成数据库资源的浪费,影响数据库性能
解决方案:使用数据库连接池来管理
2.将sql语句硬编码到Java程序,如果修改语句那么程序就必须重新编译,不利于系统维护
解决方案:将sql语句放到配置文件中
3.向preparedStatement中设置参数,占位符和参数出现了硬编码
解决方案:将sql语句、占位符、参数放到配置文件中
4.从resultSet中遍历结果数据集的时候,获取表的字段存在硬编码
解决方案:将结果集自动映射为Java对象
二。mybatis框架原理
mybatis是持久层框架,是Apache的项目。mybatis让程序将主要精力放在sql语句上,通过mybatis提供的映射方式,自由灵活生成(半自动化)满足需要的sql
mybatis可以将向preparedStatement的输入参数自动映射输入,将查询结果集灵活的映射为Java对像输出映射
mybatis{
sqlMapConfig.xml(是mybatis的全局配置文件,名称不固定的)配置了数据源、事务等mybatis运行环境配置映射文件(配置sql语句)mapper.xml(映射文
件)、mapper.xml、mapper.xml.....
SqlSessionFactory(会话工厂),根据配置文件创建工厂作用:创建SqlSession
SqlSession(会话),是一个接口,面向用户(程序员)的接口作用:操作数据库(发出sql增、删、改、查)
Executor(执行器),是一个接口(基本执行器、缓存执行器)作用:SqlSession内部通过执行器操作数据库mapped statement(底层封装对象)作用:对操
作数据库存储封装,包括 sql语句,输入参数、输出结果类型
mysql
三。一对一查询
由订单查询用户信息:sql为SELECT orders.*,USER.username,USER.sex,USER.address
FROM
orders,USER WHERE orders.user_id = us
er.id
resultType:使用较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射
resultMap:需要单独定义resultmap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultmap可以完成将关联查询映射pojo属性中
resultMap是能实现延迟加载的,而resultType是无法实现的
四。一对多查询
比如查询订单和订单明细:SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.ite
ms_id,orderdetail.items_num,orderdetail.orders_id
FROM
orders,USER,orderdetail
WHERE orders.user_id = user.id AN
D orderdetail.orders_id=orders.id
mybatis使用resultMap的collection对关联查询的多条数据映射到一个list集合属性中
五。多对多查询
比如查询用户和用户购买的商品信息:SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdet
ail.items_id,orderdetail.items_num,orderdetail.orders_id,items.name items_name,items.detail items_detail,items.pri
ce items_price FROM orders,USER,orderdetail,items WHERE orders.user_id = user.id AND orderdetail.orders_id=orde
rs.id AND orderdetail.items_id = items.id
相关文章推荐
- HTML5开发移动web应用—JQuery Mobile(4)-事件
- 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)
- 给包文件增加注释
- [数据结构-查询区间最小值小结(RMQ问题(Range Minimum Query))]
- 查找
- 树、图与二分图的转换
- Android Studio 导入jar包和第三方开源库方法
- 7种php基本排序实现方法
- leetcode 263. Ugly Number
- Android开发之播放视频
- FTxxxx系列------变量初始化buf失败
- Perl正则表达式总结_3
- Android开发&HTML5+App
- css3中-moz、-ms、-webkit分别代表的意思
- 关于 overridePendingTransition()使用
- Java编程思想(一):大杂烩
- 配置ssh的双机信任
- 侯捷《深入浅出MFC》中“Hello, MFC”如何改写到VS2012中
- 线程的睡眠与唤醒
- Exchange 2016 混合部署后的测试工作