摘要:
1. SQL查询的统一抽象MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射的方法构造多查询参数.在遇到多属性参数(例如order by,其参数包括列名,升序降序类型,以及可以多个列及升降序类型凭借在order by之后)无法使用简单的key-value表示时,可以将参数单独抽象为一个类.将要用到的beanpackage com.xxx.mybatistask.bean;import com.xxx.mybatistask.support.jsonSerializer.Js 阅读全文
摘要:
MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回为了在数据库层面上实现物理分页,又不改变原来MyBatis的函数逻辑,可以编写plugin截获MyBatis Executor的statementhandler,重写SQL来执行查询参考资料:http://blog.csdn.net/hupanfeng/article/details/9265341下面的插件代码只针对MySQLplugin代码package plugin;import java.sql.Connection;import java.sql.P 阅读全文
摘要:
MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的属性有lazyLoadingEnabled: lazy loading开关,默认为trueaggressiveLazyLoading: 侵略性 lazy loading 开关, 默认为true, 这个属性比较搞笑,如果为true则当你访问任何一个属性都会加载所有的其他lazy load属性,即使你根本没有调用哪个lazy load属性,说白了就是aggressiveLazyLoading=true,则lazy load等于没用,所以要使用lazy load还是将其设为false一个使用 阅读全文
摘要:
DAO接口为每个DAO声明接口的好处在于1. 可以在尚未实现具体DAO的时候编写上层代码,如Service里对DAO的调用2. 可以为DAO进行多实现,例如有JDBCDAO实现,MyBatisDAO实现,而不需要更改上层代码,只需要简单的在Spring的IoC配置里修改一下注入的DAO实现Service接口1. 可以在尚未实现具体Service情况下编写上层改代码,如Controller对Service的调用2. Spring无论是AOP还是事务管理的实现都是基于动态代理的,而动态代理的实现依赖于接口,所以必须有接口的定义才能使用这些功能3. 可以对Service进行多实现总的来说,接口的优势 阅读全文
摘要:
MyBatis缓存分为一级缓存和二级缓存一级缓存MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)1)单独使用MyBatis而不继承Spring,使用原生的MyBatis的SqlSessionFactory来构造sqlSession查询,是可以使用以及缓存的,示例代码如下public class Test { public static void main(String[] args) throws IOException { String conf... 阅读全文
摘要:
环境搭建数据库schema1)datasource.xml配置 2.applicationContext.xml --> 3. log4j.propertie... 阅读全文
摘要:
1. 从SqlSessionDaoSupport开始通常我们使用MyBatis会让自己的DAO继承SqlSessionDaoSupport,那么SqlSessionDaoSupport是如何运作的呢,下面是SqlSessionDaoSupport的源代码/* * Copyright 2010 The myBatis Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the 阅读全文
摘要:
MySQL查询缓存可以跳过SQL解析优化查询等阶段,直接返回缓存结果给用户,查询缓存的工作流程如下:命中条件缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的工作流程1. 服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)2. 如果找到了缓存,则直接返回缓存(性能 阅读全文
摘要:
前面提到抽象工厂的实现,这里说说抽象工厂的原型实现,与工厂方法的实现不同,原型实现有他自己的优点和缺点原型的优点:1. 效率:clone是native方法,比new的效率高,当使用复杂循环嵌套对象是尤为明显2. 不需要为每一个新增的product创造一个具体factory缺点:1. 如果需要深复制,则需要手写所有包含循环引用对象的类的clone方法,因为需要手动在clone方法里对引用对象进行clone,否则是浅复制2. 当需要改变一个克隆实例内部的值时,由于clone方法是无参方法,只能在clone完以后手动调用改变值得方法,且如果这个值是一个类的引用,则克隆应该建立在深复制的前提下,否则会 阅读全文
摘要:
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实例化这个对象,好处就是客户端并不知道这个实例化的对象的实际实现,从而可以将这个对象随意替换成我们需要的不同实现工厂方法(Factory Method)概念:定义一个用于创建对象的接口,让子类决定实例化哪个类.它使一个类的实例化延迟到其子类结构图:抽象工厂(Abstract Factory)概念: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.结构图:单例模式(Singleto 阅读全文