mybatis笔记整理。
框架
框架是一系列jar包,本质是对JDK功能的扩展。
框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某一个领域的问题。
最佳实践:实际上是无数程序员经历过无数次尝试之后,总结出来的处理特定问题的特定方法,如果把程序员的自由发挥看作是一条通往成功的途径,最佳实践就是其中的最短路径,能极大的解放生产力。
最佳实践三要素:可读性,可维护性,可拓展性。
Web开发中的最佳实践(分层开发模式)
JavaEE开发根据职责的纵向划分为:表现层,业务层,持久层。
表现层(Predentation Layer):web/mvc:负责处理与界面交互的相关操作,控制界面跳转(Struts2)
业务层(Business Layer):service:负责复杂的业务逻辑计算和判断(Spring)
持久层(Persistent Layer):dao:负责将业务逻辑数据进行持久化存储(Hibernate/MyBatis)
ORM
对象关系映射(Object Relational Mapping,简称ORM/OR Mapping)。
是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。
避免直接使用SQL语句对关系型数据库中的数据进行操作。
减少代码编写量,提高产品质量。
ORM主要解决对象–关系的映射。
面向对象概念 面向关系概念
类 表
对象 表的行(记录)
属性 表的列(字段)
ORM的实现思想
将关系数据库中表中的记录映射成为对象,以对象的形式展现。程序员可以把对数据库的操作转化为对对象的操作,因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
ORM采用元数据来描述对象–关系映射细节。
元数据通常采用XML格式,并且存放在专门的对象–关系映射文件中。
目前流行的ORM框架:
1.JPA:本身是一种ORM规范,不是ORM框架,由各大ORM框架提供实现。
2.Hibernate:目前最流行的ORM框架,设计灵巧,性能优秀,文档丰富。
3.Mybatis:提供的持久层框架包括SQL Maps和Data Access Objects(DAO),允许开发人员直接编写SQL等。
mybatis优势
mybatis支持普通的SQL查询,存储过程和高级映射的优秀持久层框架。
mybatis清除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
mybatis使用简单的XML或注解用于配置和映射,将接口和java的POJOs(Plain Old Java Objects,普通的java对象)映射成数据库中的记录。
使用mybatis
1.提供Product对象,IProductDAO,ProductDAOImpl(未实现),ProductDAOTest。
2.使用框架第一步:拷贝jar包。
①:mysql驱动
②:mybatis核心包:mybatis-3.2.6.jar
③:mybatis依赖jar:mybatis目录\lib中所有jar(使用了log4j.properties就可以不用commons-logging-1.1.1.jar)。
3.建立mybatis主配置文件。
4.建立对象映射配置文件。
5.在主配置文件中关联映射文件。
6.在对象映射配置文件中写sql。
7.加载mybatis主配置文件。
sqlSessionFactory使用步骤(Hibernate/Mybatis):
1.从配置文件(通常是XML配置文件中)得到SessionFactory(相当于DataSource)。
2.由SessionFactory产生session(相当于connection,和web中的HttpSession无关)。
3.在session中完成对数据的增删改查和事务提交等。
4.在用完后关闭session。
sqlSessionFactory一旦被创建,应该在你的应用程序执行期间都存在,没有理由来处理或重新创建它。因此SqlSessionFactory的最佳范围是应用范围,有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。可以考虑依赖注入容器,比如Spring或Google Guice,这样的框架允许你创建支持程序来管理单例sqlSessionFactory的生命周期。
SqlSession:
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet架构中的HttpSession。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和Http请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。
log4j简介
Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)。可简单理解为日志类别,日志要输出的地方和日志以何种形式输出,综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。
配置优化
1.抽取MybatisUtil。
2.添加db.properties属性文件。
3.在mybatis主配置文件(MyBatis-config.xml)配置类型别名typeAliases。
4.列名和属性名不同resultMap。
多条件查询
1.建立高级查询表单对象:XxxQuery/XxxQueryObject(Xxx表示对象名称)。ProductQueryObject(商品的高级查询对象),封装了商品高级查询表单的数据。该类存放于query包中,query包和dao包同级。
2.在IProductDAO中,定义高级查询方法:
|
|
3.在ProductDAOImpl中提供高级查询方法的实现。
上述查询方法的缺点
1.从责任分离上考虑,DAO是不应该做SQL拼接的(DAO是负责做CRUD的,因为查询对象(ProductQueryObject)拥有查询信息,应该把拼接sql责任交给它)。
2.使用了where 1=1,降低性能。
3.拼sql依旧麻烦。
分页
逻辑分页(假分页):一次性把内存中符合条件的数据全部查询出来,存放在内存,在翻页的时候,直接从内存中去截取。
优点:翻页很快
缺点:若数据量大,可能造成内存溢出。
物理分页(真分页):
每次翻页都从数据库中去截取数据。
优点:不会造成内存溢出
缺点:翻页较慢
通过SQL查询出来的数据:
1.查询当前的结果集
2.查询结果总数