MiniDao使用指南作者:张代浩2013/08/16P-2目录培训对象使用MiniDao进行开发的开发人员培训目的使开发人员掌握通过MiniDao访问Mysql数据库的用法和技巧P-3目录培训内容MiniDao简介及特征MiniDao的安装及基本概念MiniDao的使用介绍参考资料Spring(IOC/AOP/JDBC)FreemarkerHibernateP-4MiniDao简介及特征MiniDao是Jeecg自己的持久化解决方案,集成Hibernate实体维护和MybaitsSQL分离的两大优点。具有以下特征O/Rmapping不用设置xml,零配置便于维护不需要了解JDBC的知识SQL语句和java代码的分离可以自动生成SQL语句接口和实现分离,不用写持久层代码,用户只需写接口,以及某些接口方法对应的SQL。它会通过AOP自动生成实现类支持自动事务处理和手动事务处理支持与hibernate轻量级无缝集成MiniDao整合了Hibernate+mybatis的两大优势,支持实体维护和SQL分离SQL支持脚本语言Sql性能优于Mybatis※向下兼容Hibernate实体维护方式,实体的增删改查SQL自动生成P-5&VsMybatis相同点:SQL语句和java代码的分离不同点:O/Rmapping不用设置xml,零配置,简单易用可以自动生成SQL语句接口和实现分离,不用写持久层代码,用户只需写接口,以及某些接口方法对应的SQL。它会通过AOP自动生成实现类支持与hibernate轻量级无缝集成SQL支持更强大的脚本语言,可以写逻辑处理Sql性能优于MybatisSql支持传递多个参数Map/Object/List/包装类型都可以Mybatis只支持一个参数Map/ObjectSQL性能对比(MiniDaoSQL内容采用文件存储)MiniDaoSql耗时:54毫秒(SQL模板第一从文件读取,第二次从缓存读取)方法第一次执行的时候加载sql到缓存里MiniDaoSql耗时:4毫秒MiniDaoSql耗时:4毫秒MiniDaoSql耗时:5毫秒(MiniDaoSQL内容采用@Sql标签)MiniDaoSql耗时:6毫秒MiniDaoSql耗时:1毫秒MiniDaoSql耗时:1毫秒MiniDaoSql耗时:2毫秒(Mybatis在Sesion初始化的时候,加载Xml到缓存里,所以第一执行比MiniDao快)MybatisSql耗时:18毫秒MybatisSession初始化的时候,加载Xml到缓存里MybatisSql耗时:6毫秒MybatisSql耗时:5毫秒MybatisSql耗时:9毫秒(Springjdbc)SpringjdbcSql耗时:10毫秒SpringjdbcSql耗时:1毫秒SpringjdbcSql耗时:1毫秒SpringjdbcSql耗时:1毫秒P-7MiniDao支持SQL分离写法第一步:EmployeeDao.java接口定义(不需要实现)@MiniDaopublicinterfaceEmployeeDao{@Arguments(employee)publicListMapgetAllEmployees(Employeeemployee);@Arguments(empno)EmployeegetEmployee(Stringempno);@Arguments({empno,name})MapgetMap(Stringempno,Stringname);@Sql(SELECTcount(*)FROMemployee)IntegergetCount();@Arguments(employee)intupdate(Employeeemployee);@Arguments(employee)voidinsert(Employeeemployee);}P-8MiniDao支持SQL分离写法第二步:接口方法对应SQL文件创建Sql文件定位到dao接口的方法,dao接口的每个方法对应一个sql文件SQL文件命名规则:{Dao接口名}_{方法名}.sql简单SQL,也可以采用方法注释标签@Sql(SELECTcount(*)FROMemployee)IntegergetCount();P-9MiniDao支持SQL分离写法第三步:SQL文件SQL文件采用模板语言Freemarker语法,可以灵活运用,甚至可以写脚本语言,宏处理等;示例:SELECT*FROMemployeewhere1=1#ifemployee.age?existsandage='${employee.age}'/#if#ifemployee.name?existsandname='${employee.name}'/#if#ifemployee.empno?existsandempno='${employee.empno}'/#ifP-10MiniDao支持实体方式维护第一步:自定义接口继承MiniDaoSupportHiber接口示例:publicinterfaceJeecgDemoDaoextendsMiniDaoSupportHiberJeecgDemo{说明:JeecgDemo:持久化对象JeecgDemoDao用户自定义接口P-11SQL参数传递两种方式方式一:支持采用占位符,格式字段前加冒号【:字段名】优点:防止sql注入;sql执行计划只解析一次;字段值根据类型自动转换不需要手工处理缺点:只能传参数原生态值;参数为List情况循环体不适用示例:•SELECT*FROMemployeewhere1=1•#ifemployee.age?exists•andage=:employee.age•/#if•#ifemployee.name?exists•andname=:employee.name•/#if•#ifemployee.empno?exists•andempno=:employee.empno•/#ifP-12SQL参数传递两种方式方式二:模板语言方式,格式【${字段名}】缺点:Sql直接拼装,有SQL注入风险;参数值需根据类型手工转换;优点:可以对参数值进行脚本处理;参数为List对象,循环体对象必须用该方式;(用户体验没有变化,直接将${}改为:即可)特点:支持多参数,支持参数多层,参数为list必须采用模板语言方式示例:SELECT*FROMemployeewhere1=1#ifemployee.age?existsandage='${employee.age}'/#if#ifemployee.name?existsandname='${employee.name}'/#if#ifemployee.empno?existsandempno='${employee.empno}'/#ifP-13MiniDao支持SQL分离写法第四步:@Arguments注释标签讲解/***(SQL模板参数名)*1.[注释标签参数]必须和[方法参数],保持顺序一致*2.[注释标签参数]的参数数目不能大于[方法参数]的参数数目*3.只有在[注释标签参数]标注的参数,才会传递到SQL模板里*4.如果[方法参数]只有一个,如果用户不设置[注释标签参数],则默认参数名为miniDto*@date20130817*@versionV1.0*/@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceArguments{String[]value()default{};}•示例:@Arguments({empno,name})MapgetMap(Stringempno,Stringname);P-14MiniDao支持实体方式维护第二步:JavaBean实体定义,采用JPA方式进行注解※同Hibernate实体配置一样,支持一对多,多对多等复杂配置关系示例:@Entity@Table(name=jeecg_demo)@Inheritance(strategy=InheritanceType.JOINED)publicclassJeecgDemoextendsIdEntityimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(generator=hibernate-uuid)@GenericGenerator(name=hibernate-uuid,strategy=uuid)privateStringid;/**手机号码*/@Column(name=mobilePhone,nullable=true)privatejava.lang.StringmobilePhone;/**办公电话*/@Column(name=officePhone,nullable=true)privatejava.lang.StringofficePhone;/**电子邮箱*/@Column(name=email,nullable=true)privatejava.lang.Stringemail;P-15MiniDao的安装及基本概念MiniDao的安装与Jeecg同样,MiniDao需要JDK1.5以上的系统环境需要引入必要的lib文件引入必要的配置文件Spring.xml,log4j.properties使用MiniDao时必须作成的文件:JavaBeans、Dao(.java)、SQL文件(.sql)P-16MiniDao的安装及基本概念(2)MiniDao的基本概念使用MiniDao功能时,作成的JavaBeans,Dao(.java),spring.xml文件,SQL文件(.sql)之间关系如下图:P-17MiniDao的安装及基本概念(2)MiniDao配置文件•!--MiniDao动态代理类--•beanid=miniDaoHandlerclass=org.jeecgframework.minidao.aop.MiniDaoHandler•propertyname=jdbcTemplateref=jdbcTemplate/property•/bean•!--注册MiniDao接口--•beanclass=org.jeecgframework.minidao.factory.MiniDaoBeanFactory•propertyname=packagesToScan•list•valueexamples.dao.*/value•/list•/property•/beanP-18MiniDao的安装及基本概念(3)MiniDao的基本概念JavaBeans,采用JPA注解注解方式:JavaBeans用来和表进行关联。为了将JavaBeans和表进行关联,必须进行以下的常量声明和方法的实装:–和表关联的常量声明(TABLE注释)–和列项关联的常量声明(COLUMN注释)–和其他的表结合时指定为键(key)的常量声明(N:1映射)–getter/setter方法的实装P-19MiniDao的安装及基本概念(4)MiniDao的基本概念Dao(DataAccessObject):Dao作为接口而作成。Dao本来的目的,就是通过把持久化的数据和处理逻辑相分离,来维持Bean的持久化。Dao和JavaBeans的关系是1:1的关系,也即,有一个JavaBeans,就要作成一个Dao。通过调用Dao的方法(method),来执行与方法(method)相对应的SQL文件中的SQL指