1Mybatis学习笔记1.mybatis是什么?mybatis是一个持久层的框架,是apache下的顶级项目。mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)2.mybatis框架SqlMapConfig.xml(是mybatis的全局配置文件,名称不固定的)配置了数据源、事务等mybatis运行环境配置映射文件(配置sql语句)mapper.xml(映射文件)、mapper.xml、mapper.xml.....SqlSessionFactory(会话工厂),根据配置文件创建工厂作用:创建SqlSessionmsyqlSqlSession(会话),是一个接口,面向用户(程序员)的接口作用:操作数据库(发出sql增、删、改、查)Executor(执行器),是一个接口(基本执行器、缓存执行器)作用:SqlSession内部通过执行器操作数据库mappedstatement(底层封装对象)作用:对操作数据库存储封装,包括sql语句,输入参数、输出结果类型输入参数类型java简单类型hashmappojo自定义输出结果类型java简单类型hashmappojo自定义23.一个原始查询代码4.“主键”生成及返回mysql自增主键a)执行insert提交之前自动生成一个自增主键。通过mysql函数LAST_INSERT_ID()获取到刚插入记录的自增主键。是insert之后调用此函数。3mysqlUUID主键使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。Oracle序列主键selectKeykeyProperty=idorder=BEFOREresultType=java.lang.StringSELECT序列名.nextval()/selectKeyinsertintouser(id,username,birthday,sex,address)value(#{id},#{username},#{birthday},#{sex},#{address})5.一个删除用户的代码主要注意:sqlSession.commit()提交事务操作。46.XML配置文件参数说明parameterType在映射文件中通过parameterType指定输入参数的类型。类型可以是简单类型、hashmap、pojo的包装类型。mapper接口方法参数只能有一个,即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。resultType在映射文件中通过resultType指定输出结果的类型。使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象,不一致的属性的值为null。5查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。在mapper.java指定的方法返回值类型不一样:(1)输出单个pojo对象,方法返回值是单个对象类型(2)输出pojo对象list,方法返回值是ListPojo生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList(返回集合对象调用).#{}和${}#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。${}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。selectOne和selectListselectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。如果使用selectOne报错:org.apache.ibatis.exceptions.TooManyResultsException:Expectedoneresult(ornull)tobereturnedbyselectOne(),butfound:4如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。67.几个对象的说明SqlSessionFactoryBuilder通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。SqlSessionFactory通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。SqlSessionSqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。SqlSession最佳应用场合在方法体内,定义成局部变量使用。8.原始DAO的开发程序员需要写dao接口和dao实现类。需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession测试代码:79.mapper代理开发开发规范:1、在mapper.xml中namespace等于mapper接口地址2、mapper.java接口中的方法名和mapper.xml中statement的id一致3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。8测试代码10.全局配置文件SqlMapConfig.xmlproperties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境集合属性对象)environment(环境子属性对象)transactionManager(事务管理)dataSource(数据源)mappers(映射器)properties特性:注意:MyBatis将按照下面的顺序来加载属性:在properties元素体内定义的属性首先被读取。然后会读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性。最后读取parameterType传递的属性,它会覆盖已读取的同名属性。建议:不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX9settings全局参数配置mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。10typeAliases定义别名在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。mybatis默认支持别名:别名映射的类型_bytebyte_longlong_shortshort_intint_integerint_doubledouble_floatfloat_booleanbooleanstringString11byteBytelongLongshortShortintIntegerintegerIntegerdoubleDoublefloatFloatbooleanBooleandateDatedecimalBigDecimalbigdecimalBigDecimal单个别名定义引用别名:批量定义别名(常用)typeHandlers(类型处理器)mybatis中通过typeHandlers完成jdbc类型和java类型的转换。通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.mybatis支持类型处理器:类型处理器Java类型JDBC类型BooleanTypeHandlerBoolean,boolean任何兼容的布尔值ByteTypeHandlerByte,byte任何兼容的数字或字节类型ShortTypeHandlerShort,short任何兼容的数字或短整型IntegerTypeHandlerInteger,int任何兼容的数字和整型LongTypeHandlerLong,long任何兼容的数字或长整型FloatTypeHandlerFloat,float任何兼容的数字或单精度浮点型DoubleTypeHandlerDouble,double任何兼容的数字或双精度浮点型12BigDecimalTypeHandlerBigDecimal任何兼容的数字或十进制小数类型StringTypeHandlerStringCHAR和VARCHAR类型ClobTypeHandlerStringCLOB和LONGVARCHAR类型NStringTypeHandlerStringNVARCHAR和NCHAR类型NClobTypeHandlerStringNCLOB类型ByteArrayTypeHandlerbyte[]任何兼容的字节流类型BlobTypeHandlerbyte[]BLOB和LONGVARBINARY类型DateTypeHandlerDate(java.util)TIMESTAMP类型DateOnlyTypeHandlerDate(java.util)DATE类型TimeOnlyTypeHandlerDate(java.util)TIME类型SqlTimestam