J2EE持久层框架MybatisJ2EE简介什么是J2ee为什么要有J2EE课题收集系统代码分析代码行数分析模型层bean分析服务层分析控制层分析展示层分析服务层代码分析获取数据库连接执行sql语句结果与bean绑定返回执行结果理想的服务层代码只关注核心(即:sql指令)数据库连接、代码执行、结果绑定最好自动完成Java反射技术介绍JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射技术介绍反射技术演示获取对象的属性o.getClass().getDeclaredFields()获取对象的方法Method[]methods=o.getClass().getMethods();执行对象的方法综合演示,将map绑定到bean对象课堂练习使用反射技术实现Map和javaBean对象的动态绑定并使用jsp展示出来我们自己数据库持久层框架示意图常见数据库持久层框架介绍Mybatis学习曲线低运行性能好Hibernate学习曲线高使用简单activeRecord学习曲线低普及率低Mybatis初始化使用xml初始化编写mybatis.xml编写bean文件编写具体的mapper文件编写mapper对应的接口初始化mybatis获取SqlSessionFactory获取SqlSession执行对应方法获取数据第一个mybatis程序实现项目类别管理模块使用mybatis重构原有部分代码Mybatis中的关键对象SqlSessionFactoryBuilder该类用于创建sqlSessionFactorysqlSessionFactory该类用于创建sqlSessionsqlSession该类用于执行sql代码常用对象的生命周期SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是局部方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好还是不要让其一直存在以保证所有的XML解析资源开放给更重要的事情。sqlSessionFactorySqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory被视为一种代码“坏味道(badsmell)”。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。sqlSession每个线程都应该有它自己的SqlSession实例。所以它的最佳的范围是请求或方法范围。Mybatis配置文件详解configuration配置properties属性settings设置typeAliases类型命名typeHandlers类型处理器objectFactory对象工厂plugins插件configurationMybatis配置文件的根节点,其它节点均应包含在该节点内properties这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过properties元素的子元素来传递propertiespropertyname=drivervalue=com.mysql.jdbc.Driver/propertyname=urlvalue=jdbc:mysql://192.168.174.131:3306/sxccti?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull/propertyname=usernamevalue=root/propertyname=passwordvalue=“123456//propertiessettings用于设置mybatis的基本参数。不指定该参数时均使用默认值。建议:使用mybatis的默认值typeAliases类型别名,用于mapper文件中的输入输出typeAliasestypeAliasalias=Authortype=domain.blog.Author/typeAliasalias=Blogtype=domain.blog.Blog/typeAliasalias=Commenttype=domain.blog.Comment/typeAliasalias=Posttype=domain.blog.Post/typeAliasalias=Sectiontype=domain.blog.Section/typeAliasalias=Tagtype=domain.blog.Tag//typeAliasestypeHandlers类型处理。无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型类型处理器Java类型JDBC类型BooleanTypeHandlerjava.lang.Boolean,boolean数据库兼容的BOOLEANByteTypeHandlerjava.lang.Byte,byte数据库兼容的NUMERIC或BYTEShortTypeHandlerjava.lang.Short,short数据库兼容的NUMERIC或SHORTINTEGERIntegerTypeHandlerjava.lang.Integer,int数据库兼容的NUMERIC或INTEGER自定义typeHandlers对于一些特殊类型可实现自己的typeHandlers以取代mybatis默认的typeHandlers行为。(了解)pluginsMyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括(高级部分详细讲解):Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setParameters)ResultSetHandler(handleResultSets,handleOutputParameters)StatementHandler(prepare,parameterize,batch,update,query)配置环境(environments)MyBatis的数据库连接参数配置,mybatis可以连接多个不同的数据库(POOLED):environmentsdefault=developmentenvironmentid=developmenttransactionManagertype=JDBC/dataSourcetype=POOLEDpropertyname=drivervalue=${driver}/propertyname=urlvalue=${url}/propertyname=usernamevalue=${username}/propertyname=passwordvalue=${password}//dataSource/environment/environments配置环境(environments)MyBatis的数据库连接参数配置,mybatis可以连接多个不同的数据库(JNDI):environmentid=producttransactionManagertype=JDBC/transactionManagerdataSourcetype=JNDIpropertyname=initial_contextvalue=java:comp/env/propertyname=data_sourcevalue=jdbc/xiong//dataSource/environment映射器(mappers)告诉mybatis在哪里寻找sql映射语句:单个引入mappersmapperresource=com/test/UserMapper.xml//mappers批量引入mapperspackagename=org.mybatis.builder//mappersMapper映射文件详解查询(select)更新(insert,updateanddelete)参数(Parameters)结果集(ResultMaps)自动映射(Auto-mapping)cacheselectselectid=selectPersonparameterType=intparameterMap=deprecatedresultType=hashmapstatementType=PREPAREDSelect属性表属性描述id在命名空间中唯一的标识符,可以被用来引用这条语句。parameterType将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数,默认值为unset。parameterMap这是引用外部parameterMap的已经被废弃的方法。使用内联参数映射和parameterType属性。resultType从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用。resultMap外部resultMap的命名引用。结果集的映射是MyBatis最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用resultMap或resultType,但不能同时使用。flushCache将其设置为true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。Select属性表useCache将其设置为true,将会导致本条语句的结果被二级缓存,默认值:对select元素为true。statementTypeSTATEMENT,PREPARED或CALLABLE的一个。这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement,默认值:PREPARED。resultSets这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。insertinsertid=insertAuthorparameterType=domain.blog.AuthorflushCache=truestatementType=PREPAREDkeyProperty=keyColumn=useGeneratedKeys=updateupdateid=updateAuthorparameterType=domain.blog.AuthorflushCache=truestatementType=PREPAREDdeletedeleteid=dele