ibatis3学习笔记

上传人:无*** 文档编号:69159691 上传时间:2022-04-05 格式:DOC 页数:87 大小:520KB
返回 下载 相关 举报
ibatis3学习笔记_第1页
第1页 / 共87页
ibatis3学习笔记_第2页
第2页 / 共87页
ibatis3学习笔记_第3页
第3页 / 共87页
点击查看更多>>
资源描述
ibatis 3学习笔记1询段时间看了 oracle内容,T脆把ibatis结合oracle 块搞了。准备ibatis环境oracle 10g expressibatis beta 5新建工程 在WEB INF 1让下 导入以下包: oraclexeapporacleproduct10 2. 0serve:rjdbclibojdbcl4ibatis一3一core一3 0. 0. 208 jar总配置文件 SqlMapConf ig. xml-/ibatis. apache, org/DTD Config 3. 0/ENhttp:/ibatis. apache org/dtd/ibatis一3一config dtdtransactionManager t ype二JDBC/ /dataSource 关于每个实体的映射文件(map) Student, xml mapper namespace二cn pf. ibatis. domain. StudentMapperselect id=selectS tudent paramet er Type=/ int :result Type 二cn pf ibotis domain .Student select 学生姓名*/private String name: from Student where id = #id创建 Student POJOpackage cn. pf. ibatis. domain;import java. util. Date;*学生PO* authoT pf* version 2010-3-16 卜午 03:00:00*/public class Student 源学生编号*/private int id;源学生专业*/private String major;*学生生日private Date birth;*学生分数private double score;源构造函数*/public Student() super ();* .构造函数* param id* param name* param major* param birth* param scorepublic Student (int id, String name,String major, Date birth, double score)super ();this, id = id; this .name = name;this .major = major; this, birth = birth; this, score = score;* id getter 方法* return the id*/public int getld() return id;A* id set ter 方法* param id the id to set */public void set Id(int id) this, id = id;/% name getter 方法* return the name*/public String getNameO return name;/bir th get ter 方法 * return the birth* name setter 方法* param name the name to set*/public void setName(String name) this, name = name;/* major get ter 方法* return the major*/public String getMajor() return major;/* major set ter 方法* param major the major to set*/public void setMajor(String major)this, major = major;*/public Date getBirthO return birth;* birth setter 方法* param birth the birth to set*/public void setBirth(Date birth) this birth = birth;* score get ter 方法* return the score*/public double getScoreO return score;/* score set ter 方法* param score the score to set*/public void setScore(double score)this .score = score;源转换对象为字符串水return对象转换后的字符串* see java long0bject#toString()*/Override public String toString() return Student birth 二+ birth + ”, id 二+ + , name二+ name + score test, javaString resource = SqlMapConfig.xml;Reader reader = null;try 使用让at is提供的Resources类读取资源文件reader = ResourcesgetResourceAsResder(resource); catch (IOException e) / TODO Auto-generated catch blocke. printStockTroceO ;根据资源文件内容建立session Uid + major二 + major + score + ;SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder()build(reader); /session J J 扌J 开一个 sessionSqlSession session = sqlMapper openSession(true);Student student;trystudent = (Studentsession. selectOne(cn pf. ibatis domain. StudentMapper. selectStudent, 1);finallysession close();System out.println(student. toString ();让atis 3果然改动很大,调试花了不少时间,很多细小的错误耽误了很久。那个让at is 3 user guide缺少完整的实例真是不爽,自 己一点点试探过来,继续研究各种配置,下一步完成一个基本的crud操作。上篇简单调试了一个实例,现在仔细看看ibat is 3 user guide 的内容,接下来的儿篇准备整理user guide 的内容,最后通过一 个综合的例子来实践。关于实体映射文件中namespace,以前的版本是可选的内容,现在被用来与接口绑定,也就是说把接口的实现转移到xml文件中来了, 以后的维护会相十的方便。第一篇的根据id查询学生的例子中,稍做修改: 建立 StudentDAO 接口package cn. pf ibatis. dao: import java. util. List;import cn. pf. ibatis. domain. Student;* StudentDAO 接口* author pf* version 2010-3-16 卜 T 03:05:36*/public interface StudentDAO public Student queryStudentById(int id);更改 student, xml 中的 mapper 元素 namespace 属性test, java中调用改为Student student;StudentDAO studentDAO = session, getMapper(StudentDAOclass) try/s tuden t 二 (Studen t) session selectOne Ccn pf. ibat is domain. St udent Mapper, select Student1);student = studentDAO. queryStudentByld(l);finallysession close();System. out. println(student. toString ();生命周期SqlSessionFactoryBuilder:用于建立SqlSessionFactory的匚具类,在创建SqlSessionFactory以后无需再止它存在于应用程序中,文档上说它的生命周期最好 在局部方法内,所以在代码中看到根据资源文件内容建立session工厂SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder()btdld(reader);没用引用指向SqlSessionFactoryBu订der,会被gc回收。SqlSessionFactory:旦建立,SqlSessionFactory就应该存在于整个应用程序生命周期,因为根据 资源文件建立SqlSessionFactory对象需要很大的开 销,所以保留在整个应用的生命周期中,最佳实践中推荐使用spring等依赖注入的框架 从而管理SqlSessionFactory的单例生命周 期。SqlSession:每一个线程都应该有自己的SqlSession对象,SqlSession对象不是线程安全的所以不应该被共亨,如果使用web框架,应该将 SqlSession的生命周期看作HTTP Request的生命周期,在返回HTTP Response的时候关闭SqlSessionSqlSession session = SqlSessionFactory.openSession();try/do work finally session close ();Mapper Instances:Mapper Instances是绑定ibatis映射文件实现的接口, Mapper Instances的生命周期应该与SqlSession 样,但是Mapper Instances 最好在一个方法中被创建,在方法结束时被销毁。SqlSession session = sqlSessionFactory. openSession();try BlogMapper mapper = sessiongetMapper(BlogMapper .class);/do work finally session close();配置文件配置文件的层次结构如下: configurationo propertieso settingso typeAliaseso typeHandlerso objectFactory o pluginso environments environments transactionManager dataSourceo mappers 1 properties:用来定义外部properties配置文件信息。比如 properties dataSource type二POOLEDproperty name二driver value二$driver/ 那么username和password被替换成dev_user和F2Fa3!33TYyg,而drive和url属性将读取config, properties中的内容从而取得 具体值properties还可以通过SqlSessionFactoryBuilder的build方法作为参数传入:SqlSessionFactory factory = sqlSessionFactoryBui IderbuiId(reader, props);/orSqlSessionFactory factory = sqlSessionFactoryBui Iderbuild(redder,environment, props);propert y加载顺序:1、properties元素内部2、外部propert ies文件3、SqlSessionFactoryBui 1 der 的 build 方法参数也就是说,build方法参数中的properties优先级高于前两个,因为它是最后被加载,所以会覆盖询两种加载方法加载的properties 值。2 settingsSetting描述合法值默认值cacheEnabled是否使用全局缓存true|falsetruelazyLoadingEnabled是否使用全局懒加载true|falsetruemultipleResuItSetsEnabled是否允许返回多个结果集合(需婆兼容的驱动)true|falsetrueuseColumnLabel使用列标签取代列名(不同驱动表现不同)true|falsetrueuseGenerat edKeys允许jdbc自动生成主键true|falsefalseenhanc ement Enab 1 e d(该属性 在测试的时候报错,提示不存 在,查阅资料好像文档里写错全局性地启用或禁用运行时字节码增强,以优化 enhanc ement Enab led 访问 Jovo Beon 属性的性能, 同时优化延迟加载的性能。true|falsefalse了,这个属性已经取消)defauItExecutorType配置默认执行方式SIMPLE: nothing specialREUSE: reuses prepared statemetsBATCH: reuses statements and batches iodatesSIMPLEREUSEBATCHSIMPLEdefault Stat ement Timeout数据库超时时间Any positive integerNot Set (null)例子:cacheEnabled value二true/1azyLoadingEnab1ed value二true/multipieResultSetsEnab1ed value=t:rue/useColumnLabe 1value二true/ useGeneratedKeys value二false/ enhancementEnab1ed value二false/ defsuitExecutorType value二SIMPLE/ default St at ement Timeout value二25000/3 typeAliasesjava类别名typeAlias alias二Author type二domain.blogAuthor/typeAlias alias二Section type二domainbiogSection/ typeAliases4 typeHandlersType HandlerJava TypesJDBC TypesBooleanTypeHandlerBoolean, booleanAny compat让le BOOLEANByteTypeHandlerByte,byteAny compatible NUMERIC or BYTEShort TypeHandlerShor t, shor tAny compati.ble NUMERIC or SHORT INTEGERInt egerTypeHandlerInt eger, irrtAny compat让le NUMERIC or INTEGERLongTypeHandlerLong, longAny compatible NUMERIC or LONG INTEGERFloat TypeHandlerFloat, floatAny compatible NUMERIC or FLOATDoubleTypeHand1erDouble, doubleAny compatible NUMERIC or DOUBLEBigDecima1TypeHandlerBigDecimalAny compatible NUMERIC or DECIMALStr ingTypeHandlerStringCHAR, VARCHARC1obTypeHandlerStringCLOB, LONGVARCHARNStr ingTypeHandlerStringNVARCHAR, NCHARNC1obTypeHandlerStringNCLOBByt eArra y T yp eHand1erbyteAny compatible byte stream typeB1obTypeHandlerbyteBLOB, LONGVARBINARYDat eTypeHandlerDate(java util)TIMESTAMPDat eOnlyTypeHandlerDate(java util)DATETimeOnlyTypeHandlerDate(java util)TIMESqlTimestampTypeHandlerTimestamp(java sql)TIMESTAMPSqlDateTypeHadlerDate(java sql)DATESqlTimeTypeHandlerTime(java sql)TIMEOb j ect TypeHandlerAnyOTHER, or unspecifiedEnumTypeHandlerEnumeration TypeVARCHAR - any string compatible type, as the code is stored(not the index)也可以通过实现TypeHandler接口来实现自定义的类型转换器/ ExampleTypeHandler. javapublic class Examp1eTypeHandler implemerrts TypeHandler public void setParameter(PreparedStatemerrt ps,int i, Object parameJdbcType jdbcType) throws SQLException ps. setString (i, (String) parameter);public Object getResult(ResuItSet rs, String columnName)throws SQLException return rs. getString(columnName);public Object getResult(CallableStatemerrt cs, int columnlndex)throws SQLException :return cs. getString(columnlndex);/ MapperConfig xmlString jdbcType二VARCHARhandler=org apache ibatis example ExampleTypeHandlerzV这样会覆盖原来ibatis默认的string varchar转换器5 objectFactory让at is使用objectFactory去创建result object的实例对象,这里可以自己继承DefaultOb jectFactory类实现自己的Ob jectFactory/ ExampleObjectFactory. javapublic class ExampleObjectFactory extends DefauItObjectFactory public Object create(Class type) :return supercreate(type);public Object create(Class type,List constructorArgTypes,List construetorArgs) return super create(type, construetorArgTypes, construetorArgs);public void setProperties(Properties properties) super setProperties(properties);/ MapperConfig xmlorg. apache ibatis. example ExampleObjectFactorysomeProperty value=100/6 plugins让atis允许插件截断以下方法调用Execu to r (up da te,query, f lushS tat emen ts,comm it,rollback, get Transaction, close, isClosed) ParameterHandler (getFarameterObject, setParameters)Result SetHandler (handleResu It Sets, hand 1 eOu tput Parameters)Sta tement Handl er (prepare, parame terize, batch, up da te, query)必须在理解这些方法的基础上很小心的使用插件,不然很容易破坏ibatis的核心/ ExamplePlugin. javaIntercepts(Signoture(type= Execu tor. class.method 二updote,args = MappedStatement class, Object class)public class ExamplePlugin implements Interceptor public Object intercept(Invocation invocation) throws Throwable return invocation. proceed();public Object plugin(Object target) return Plugin, wrap(targethis);public void setProperties (Properties properties) / MapperConfig xmlorg. apache ibatis. example ExamplePluginsomeProperty value=zz100V7 environments这个是ibatis 3非常好的一个配置,允许配置多个不懂运行环境参数,不过每个SqlSessionFactory只可以在一种环境下被创建。 利用 SqlSessionFactory 的 build 函数SqlSessionFactory factory = sqlSessionFactoryBui Iderbuild(reader, environment);SqlSessionFactory factory = sqlSessionFactoryBuilder. build(reader, environment, properties);如果不知名environment参数,则应用默认的环境参数SqlSessionFactory factory = sqlSessionFactoryBuilderbuild(reader); SqlSessionFactory factory = sqlSessionFactoryBuilderbuild(reader,properties);xml中如下配置:defau 11 二deve 1 opment deve lopmen t JDBC” value二/POOLEDdriver value二$driver/url value=$url/username va lue 二$ us er name /password value二$password/儿个注意点:默 认 environment id: de fau11 二deve1opment environment id: development事务控制类型:JDBCJDBC:根据jdbc控制事务的提交和回滚MANAGED:将事务控制转交给容器数据源类型:POOLEDUNPOOLED:不使用池技术,在请求到来时直接打开或者关闭数据库连接必须配置的参数:driver、url、us er name password可选参数:使用 driver, xxx 来配置,如:driver, encoding二UTF8POOLED:使用数据库连接池poolMaximumActiveConnections:同一时间内最大连接数 默认10poolMaximumldleConnect ions:连接最大空闲数 LIpooIMaximumCheckoutTime:连接被每个任务占用的最大时间 默认20000mspoolTimeToWait:连接池中无可用连接时,线程的等待时间默认20000mspoolPingQuery:数据库连接状态检测语句,类似于ping的功能 默认NO PING QUERY SETpoolPingEnabled:是否允许 ping 检测 默认 falsepoolPingConnect ionsNotUsedFor:对超过指定空闲时间的数据库连接进行状态监测 默认0 (必须在poolPingEnabled设置 true情况下)JNDI:initial_context: 可选,没看明 白,原文:This property is used for the Context lookup from the InitialContext data_source: JNDI 数据库名称使用env. xxx配置可选参数,如:env. encoding二UTF88 mappers配置实体映射文件的路径/ Using classpath relative resources mappers/ Using url fully qualified paths mappersSQL Map XML Files让atis最大的优点就是可以把sql语句移到xml文件中,SQL Map XML F订es包含如下儿个元素: cache:配置命名空间内的缓存机制cache-ref:引用两一个命名空间的缓存配置resultMap:获取数据库结果集时转化为对象的映射sql: sql 命令insert: insert 语句配置update: update 语句配置delete: delete 语句配置select: select 语句配置selectSELECT * FROM PERSON WHERE ID 二#idselect定义了一个名称为selectPerson的方法,包含一个int类型的形参,返回一个由列名和值生成的哈希表 注意这里的#id,实际上ibatis创建了一个PreparedStatement去处理这种参数,类似的jdbc代码如下: / Similar JDBC code, NOT iBATISString selectPerson = “SELECT * FROM PERSON WHERE ID二?” ;PreparedSt at ement ps = conn .preparestatement(selectFerson);ps. setlnt (1,id);select标签还有很多的可配置属性:selectid=n selectFerson”paramet erType=n int ”parameterMap=M deprecated”resultType=n hashmapvresultMap=M personResultMap MflushCache二” false”useCache=v truentimeout二” 10000”fetchSize二” 256”statementType二” PREPARED nresultSetType= FORWARD_ONLY”属性描述id命名空间中唯一标识sql语句的标识符parameterTypesql语句中的参数类型resuItTypesql语句返回类型(与resultMap只能使用一 个)resuItMap引用外部resultMap (与resultType只能使 用一个)flushCache设置立即输出缓存中数据默认falseuseCache设置是否使用缓存默认truet i me out设置数据库超时时间默认根据数据库驱 动而定fetchSize一次抓取数据量默认根据数据库驱动而定sta temerrt Type可以设置为 STATEMENT, PREPARED, CALLABLE, 默认为PREPARED,像在调用存储过程时就可 以使用CALLABLE类型resuItSetType结果集类型,主要是说游标,具有方向性, 可以去 FORWARD_ONLY、SCROLL_SENSITIVE、 SCROLL.INSENSI TIVE 默认根据数据库驱 动而定insert, update, delete属性描述id命名空间中唯一标识sql语句的标识符parameterTypesql语句中的参数类型flushCache设置立即输出缓存中数据默认falset imeo ut设置数据库超时时间默认根据数据库驱 动而定us eGener a t eK e y s(insert)是否使用数据库自动生成的键(如自增列) 默认falsest atementType可以设置为 STATEMENT,PREPARED,CALLABLE, 默认为PREPARED,像在调用存储过程时就可 以使用CALLABLE类型keyProperty(insert)将数据库自动生成的键值赋值给哪一个字段 值 insert into Author (id, username, password, email, bio) values (#id,#username, #password, #email, #bio)insertinsert into Author (username, password, email, bio)values (#username, #password, #email, #bio)insertdelete from Author where id = #iddelete让dtis还对不支持自动生成主键值的数据库提供了主键值生成方案,如下是一个随机数主键值:insert into Author(id, username, password, email, bio, favour it e_sec tion)values(# i d,# us er name, # password, # ema i 1 ,# bio,#favouriteSection, jdbcType=VARCHAR)insert关于selectKey详细属性说明如下: 属性描述keyProperty语句返回值的赋值对象resuItType返回类型order可以设置为BEFORE、AFTER o如果是BEFORE, 会先select键值,赋值键值然后执行insert 语句。如果是AFTER,那么会先执行insert 语句之后再select o默认AFTERstatementType可以设置为 STATEMENT, PREPARED, CALLABLE, 默认为PREPARED,像在调用存储过程时就可 以使用CALLABLE类型sql定义重用的sql代码 id, username, password sqlselect from some_table where id = #id selectParameters简单类型传参传递一个int值给sql语句selec t id, us er name, password from users where id = #idselect对象传参将user对象的id username password属性传递给sql语句insert into users (id, username, password) values (#id,#username, #password)insert定义特殊传参类型# property,javaType=int, jdbcType=NUMERIC注意,使用这种自定义类型转换时,jdbcType必须传递非空字段的値。(网 上查阅了一下,很多资料说ibatis对于null处理不好,发现select语句数据库中有null时某本没问题,而insert语句参数 不能为null,原因是让atis的赋值时有个javo类型到数据库类型的转换,根据参数调用不同的转换器类型,null的话ibatis就无 法识别参数类 型,需要在sqlMap配置文件中显式说明参数类型,如:#scoreINTEGER或者#score, jdbcType二INTEGER)对于NUMERIC类型,还有numericScale可以设iV#height, javaType二double, jdbcType=NUMERIC, numericScale=2可以设置IN、OUT、INOUT参数类型# department,mode 二 OUT,jdbcType=CURSOR,javaType=Depart ment、resultMap二departmentResultMapresuItMapselect id, username, hashedPasswordfrom some_tablewhere id = #idsql这种hashmap的返回类型将所有的字段以7段名为key的hashMap返回,但是这样子并不是很好的对域中的对彖进行映射,我们考虑 下面这个POJO: public class Student private int id;private String name; private String major: private Date birth;private double score: 我们之前使用的select语句配置是: select * from Student where id = #idselect 这里ibatis默认使用表列名和POJO属性名对应的规则给属性赋值,我们也可以指定这种映射关系 selecttable_id as id,table_name as name,table_major as major, table_birth as birth, table_score as score from Student wHiere id = #id select 这里我们引进resultmap,可以对这种映射关系进行复用 selec
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!