2021乐字节java mybatis深入浅出MyBatis本是apache的一个开源项目iBatis_第1页
2021乐字节java mybatis深入浅出MyBatis本是apache的一个开源项目iBatis_第2页
2021乐字节java mybatis深入浅出MyBatis本是apache的一个开源项目iBatis_第3页
2021乐字节java mybatis深入浅出MyBatis本是apache的一个开源项目iBatis_第4页
2021乐字节java mybatis深入浅出MyBatis本是apache的一个开源项目iBatis_第5页
已阅读5页,还剩38页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mybatis框架MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundationcode,并且改名为MyBatis。2013年11月迁移到 AI一词来源于“nerne”和“aa”的组合,是一个基于Java的持久层框架。AISQLas和taAcessOjects(DA)Bts是一个支持普通QL查询,过程和高级映射的优秀持久层框架。Bts消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。Bts可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(nOldJavaOject,普通的Java对象)映射成数据库中的记录。Mybatis不是一个完全的orm框架,Mybtis需要程序员自己写sl,但是也存在映射(输入参数映射,输出结果映射),学习门槛ybts比irte低;同时灵活性高,特别适用于业务模型易变的项目,使用范围广。简单概括更加简化jdbc代码,简化持久层,sql语句从代码中分离,利用反射,将表中数据与javabean属性一一映射即ORM(ObjectRelationalMap对象关系映射)使用范围在日常的开发项目中,如中小型项目,例如,需求与关系模型相对固定建议使用irteybts,因为需要经常灵活去编写sl语句。总之,ybts成为当下必须学习掌握的一个持久层框架。MyBatis功能架构图AI接口层:提供给外部使用的接口AI,开发人员通过这些本地AI来数据库。接口层接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层:负责具体的SQ查找、Q解析、Q执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。Mybatis属于持久层ORM持久层:讲内存中对象数据,转移到数据库中的过程持久MybatisHibernateSpring-ORMObjectRelationalMap 属 字对 记半自化自动Mybatis半自依赖Hibernate自动化ORM不依赖与数据库缺点:学生成本高,优化难度大,适合与传统框(OA|管理系统...),不适合做大型互联网项官网 新建Java导入jarmybatisjarmybatis依赖jar数据库驱动jarBuild选中所有的jar包,右键buildpath->addtobuildpath管理外部的jarMybatis配置mybatis提供两种配置文件,配置文件mybatis-config.xml|mybatis.xml与SQL映射文件<!DOCTYPE<!DOCTYPEPUBLIC"-////DTDConfig3.0//EN" <?xml<?xmlversion="1.0"encoding="UTF-<!DOCTYPEPUBLIC"-////DTDConfig3.0//EN" <!--mybatis的全局配置文件<!-用于指明使用哪个开发环境default:用于指定使用的环境的id属性--<environments<!--用户配置开发环境id:环境的唯标识<environment<!-事务管理JBDC:表示采用JDBC样的事务管理方式--<transactionManager<!-用于配置数据库连接吃和数POOLED:表示mybatis采用连接池技--<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"<!--SQL映射文件配置<!--指明SQL映射文件路径resource:包路径com/.../xxxMapper.xml<mapperMybatisSQL在ybats中,推荐使用aprs作为包名,我们只需要写一个映射配置文件就可以,serr.l,定义要执行的sl语句,同时可以设置参数返回值结果类型<?xml<?xmlversion="1.0"encoding="UTF-<!DOCTYPEPUBLIC"-////DTDMapper3.0//EN" <!- namespace:命名空----<mapper<!- :select用于编写查询语句id:当前文件中保证唯resultType:结果的类型parameterType:入参类型--<selectid="queryAll"resultType="com.xxxx.pojo.User">select*fromt_user注意:记mybatisxml文件中的mapper配测publicpublicclassTestUserpublicstaticvoidmain(String[]args)throwsIOException//1.加载mybatis全 配置文InputStreamis=//2.构建SqlSessionFactorySqlSessionFactoryfactory=new//3.通过工厂获取会话SqlSessionsession=//4.通过session调用方法执行//selectList()查到的数据返 个list集合,没查到返回空的//selectList的第个参数为statement:命名空间+idList<User>list=//5.关闭会话}}配置文配置文件的根元素,所有其他的元素都要在这个下使用(dtd文件规定environments用于管理所有环境,并可以指定默认使用那个环境,通过defualttransactionManager用户配置事务管type属JDBC:表示采用与原生JDBC一致方式管理事MANAGED:表示讲事务管理交给其他容器进行,dataSource用于配置数据源,设置Myabtis是否使用连接池技术,并且配置数据库的四type属性POOLED:表示采用连接UNPOOLED:表示每次都会开启和关闭连接,不采用连接池技JNDI:使用其他容器提供数用于配置数据库连接参数SQL映射文件MyBatis的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序resultMap–是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对insert–映射插入语句update映射更新语句delete–映射删除语句select–映射查询语句查询语句是MyBatis中最常用的元一(映射文件配置见代码namespace属性namespace,通过被配置为权限定路径+xml文件名(不带后缀名用来定义查询语句updateinsertid属用阿里唯一表示当前sql语句,在当前名空间中唯一,不能重复,类型方法resultType属selectList("命名空间.id")用户查询多条数据情况,返回一个List集合,没有查到数据返回空集合,不selectOne("命名空间.id")用于查询单条数据,返回一个数据,如果没有查到返回selectMap("命名空间.id",key的字段名)用于查询多条记录情况,返回Map集合,需要指定那个属性作为key,sql查询结果作为value,指定的字段值作为key,如果查不到,返回一个空map集合,不是nullpackagepackageimportjava.io.IOException;importjava.io.InputStream;importjava.util.List;importjava.util.Map;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importpublicclassUserTestpublicstaticvoidmain(String[]args)throwsIOException//1.加 配置文InputStreamis=//2.获取SqlSessionFactorySqlSessionFactoryfactory=new//3.获取会SqlSessionsession=//4.操//1)selectList("namespace.id")用于查询多条数据,返回 个list集合,如果没有查询到List<User>list=Useruser=session.selectOne("com.xxxx.mappers.UserMapper.queryById");Map<Integer,User>map=session.selectMap("com.xxxx.mappers.UserMapper.queryAll","id");//5.关闭}}Log4J日Log4J日志是应用软件中不可缺少的部分,Aphe的开源项目lo4j是一个功能强大的日志组件,。在aae:/logj可以免费到ogj版本的软件包。日志级分为五个级别这五个级别是有顺序的,DBUG<NO<ARN<ERROR<FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Logj有一个规则:只输出级别不低于设定级别的日志信息,假设ors级别设定为NO,则NO、ARN、ERRO和FAA级别的日志信息都会输出,而级别比NO低的DBUG则不会输出。Log4J可以使用properties或者xml进行配置,使用一个叫perties的配置文件,会设定的设置信息,例如日志级别日志输出方式日志格式等等##SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE.log4j.rootCategory=INFO,CONSOLE#log4j.rootCategory=INFO,CONSOLE,#CONSOLEissettobeaConsoleAppenderusingaPatternLayout.#LOGFILEissettobeaFileappenderusingaPatternLayout.log4j.appender.LOGFILE.layout.ConversionPattern=-%m%l%n描实c输出ogr所在的类别(即ogr的名字)。允许使用{数字}输出部分的名字(从右边往左边数)。见实例 .log4j.Log4jTest%c{1}将输出Log4jTest%c{2}将输出log4j.Log4jTest%c{3}将输d输出日期。允许使用%d{yyyy-MM-ddHH:mm:ss格式化日期。%d不仅支持JDKSimpleDateFormat的日期格式,还支持log4j自己的日期格等%d将输出2013-06-0622:24:25,353%d{yyyy-MM-dd}将输出2013-06-06%d{ABSOLUTE}将输出22:24:25,353%d{DATE}将输出06六月2013F输出所在的类文件名%F将输出lL输出语句所在的行数,只输%L将输出m输出M输出方法%M将输出n含p输出日志级别DEBUG,INFO,ERROR,FITALr%r将输出t输出当前的线程%%%Mybatis对Log4J通过settings开启log4j的支settings用于设置MyBatis在运行时的行为方式,例如:缓存,延迟加载,日志等<!--设置MyBatis使用log4j日志支持<settingname="logImpl"局部调整日志级别##提高整体日志级log4j.rootCategory=ERRORCONSOLE#单独设置SQL语句的输出级别为DEBUG#方法级##类级##包级src下定义配置文件<!--<!--加载外部的properties文件<propertiesresource="perties"使用方<environments<environments<environment<transactionManager<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"使用方给User类定义别名为<typeAliastype="com.xxxx.pojo.User"省略alias属性,表示类别名为类名,<typeAliastype="com.xxxx.pojo.User" alias属性不写,默认类名,不区分大小可以通过package给整个包下的所有类定义别名,别名为类<package<packagename="com.xxxx.pojo"/><!--包下所有的类默认类名<selectid="queryAll"selectid,uname,upwd,birthdayfrom<selectid="queryById"selectid,uname,upwd,birthdayfromt_userwhereMybatis的内建别下面是一些为常见的Java类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的别映射的类 如果执行的是条件查询,DML,需要在调用方法的时候传递参数,此时,可以在sql中通parameterType属性指定参数的类型(别名|权限定名).而在sql语句,通过#{}的方式获取参一个参数的查例如:根据id查询用户信息,当参数只有一个,#{}可以任意填写匹配参<!--根<!--根据用户id查询用户信息<selectid="queryById"resultType="string"parameterType="int">selectunamefromt_userwhereid=#{id}<!--可以任意填写-->SqlSessionsession=null;try{//获取会话工SqlSessionFactoryfactory=new//通过工厂生产会话session对session=//根据id查询用户名第二个参数为sql传递的参name=session.selectOne("com.xxxx.mapper.UserMapper.queryById",126);}catch(IOExceptione)//TODOAuto-generatedcatchblock}}多个参数查多个参数传递时由于sqlSession中提供的查询方法,只允许传递一个sql参数因此可以对多个参数进行<!--<!--入参类型:Javabean--><selectid="queryUserByNamePwd"parameterType="user"<!--如果参数为对象,可以通过#{对象的属性名}匹配不同的属性值select<includerefid="user_all_field"/>fromt_userwhereuname{uname}andupwd=参数为JavabeanUser根据用户名 查询用户信Useruser=newListlist=session.selectList("com.xxxx.mapper.UserMapper.queryUserByNamePwd",入参类parameterType基本数据类型(四类八种包装类StringDateJavabeanMapList数组<!--入<!--入参类型:基本数据类型int|Integer--><!--根据用户id查询用户信息<selectid="queryById"resultType="string"/*参数基本数据类型int-*根据id查询用户名第二个参数为sql传递的参Stringname=session.selectOne("com.xxxx.mapper.UserMapper.queryById",126);<!--入<!--入参类型:String根据用户名查询用户信息<selectid="queryUserByName"parameterType="String"resultType="User">select<includerefid="user_all_field"/>fromt_userwhereuname=#{0}//测试参数类型:List<User>list=session.selectList("com.xxxx.mapper.UserMapper.queryUserByName",<!--<!--入参类型:Javabean--><selectid="queryUserByNamePwd"parameterType="user"<!--如果参数为对象,可以通过#{对象的属性名}匹配不同的属性值select<includerefid="user_all_field"/>fromt_userwhereuname=#{uname}andupwd=#{upwd}参数为JavabeanUser根据用户名 查询用户信Useruser=newListlist=session.selectList("com.xxxx.mapper.UserMapper.queryUserByNamePwd",<!--入<!--入参类型:Map根据多个id,查询用户信息<selectid="queryUserByIdMap"parameterType="map"select<includerefid="user_all_field"/>fromt_userwhereid=#{id1}or//入参类型:Map<String,Object>paras=newHashMap();paras.put("id1",131);paras.put("id2",132);list=session.selectList("com.xxxx.mapper.UserMapper.queryUserByIdMap",paras);数组<!--参<!--参数为数组根据多个用户名查询用户信息<selectid="queryByArray"select<includerefid="user_all_field"/>fromt_userwhereuname<!-foreach遍历参collection="array"array遍历数组参数 item:每次遍历获取的数据值separator:分隔符(每次遍历的数据使用分隔符进行连接--<foreachcollection="array"item="item"separator=",">)String[]List<User>list=session.selectList("com.xxxx.mapper.UserMapper.queryByArray",packagepackageimportimportorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;publicclassMybatisUtilsprivatestaticSqlSessionFactoryfactory=statictryfactory=new}catch(IOException{}}*返回个会publicstaticSqlSession{SqlSessionsession=null;if(factory!=null){//session=factory.openSession默认手动提交事session=factory.openSession(true);//自动提}return}}事务事务是数据库操作的最小单位,有着ACD的特性,应该保证一个事务下的多条SQ语句要么都成功,要么都失败.Mybatis中配置了事务管理器,ye属性设置JDBC,表示Mybatis采用和原生JDBC在yabats执行操作的开始,将自动提交功能关闭了,需要我们在执行DML操作时候,手动提交设置|设置自动提交手动提交mitmit();//事务提设置自动提交事务publicpublicstaticSqlSession{SqlSessionsession=null;if(factory!=null){//session=factory.openSession();//session=factory.openSession(true);//}return}<mapper<mapper<!--测试增删改:结果返回的都是影响函数int--><!--新增<insertid="insertUser"insertintotb_user<!--修改<updateid="updateUser"updatetb_usersetuserpwd=#{userpwd}whereid<!--删除<deleteid="deleteUser"parameterType="_int">deletefromtb_userwhereid=#{haha}*测试增删改功能publicclassUserTest02publicvoidtestDelete()SqlSessionsession=introws=if(rows>0)}else}//会话关}publicvoidtestUpdate()SqlSessionsession=Useruser=newUser();introws=if(rows>0)}else}}publicvoidtestInsert()SqlSessionsession=

Useruser=newUser();//插入方introws=if(rows>0){mit();//事务提}else}}}基本数据类型(包装类)StringDateJavaBeanListMapList-Date<!--Date<!--Date:根据id获取生日<selectid="queryDateById"resultType="date"parameterType="int">selectbirthdayfromt_userwhereid=#{param1}*Date:根据id返回生publicvoidDatedate=System.out.println(newSimpleDateFormat().format(date));}List<!--List类型<!--List类型:查询指定名字类型的用户信息<selectid="queryUserByUsernameLike"resultType="user"parameterType="string">select*fromt_userwhereunamelike'%'||#{0}||'%'*List:查询指定名字类型的用户信息publicvoidList<User>list=}Map类<!--<!--Map:根据用户名 查询用户信息(只能匹配个用户信息)--<selectid="queryUserByNamePwdToMap"parameterType="User"resultType="map">select*fromt_userwhereuname=#{uname}andupwd=#{upwd}Map:根据用户名 查询用户信返回值:keyvaluepublicvoidMap<String,Object>map=}List-Map<!--<!--Map:根据用户名 查询用户信息(只能匹配个用户信息)--<selectid="queryUserByNamePwdToMap"parameterType="User"resultType="map">select*fromt_userwhereuname=#{uname}andupwd=#{upwd}List<Map>:根据用户名 查询用户信息,返回多个返回值:key属性value属性值publicvoidList<Map<String,Object>>map=}Myabats会自动讲接口与l文件进行绑定,实际上就是Mybatis互根据接口和对应的l,换言之,就是可以得到接口类型的一个对象,方便方法的调用实现方*接口定义了对用户的操作publicinterfaceUserMapper//查询所有用publicList<User>}注意namespace属性值必须与接<?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper3.0//EN" <!--namespace:对应的接口的权限定名相同<mappernamespace<!--id与方法名致<selectid="queryAll"resultType="User">select*fromt_user在配置文件中扫描接<!--<!--mapper配置扫描接口<mapperclass="com.xxxx.mapper.UserMapper"/><!--配置某个接口<!--<!--mapper配置扫描接口<package *测试接口绑定publicvoidSqlSessionsession=UserMappermapper=session.getMapper(UserMapper.class);//通过对象调用方List<User>list=mapper.queryAll();}通过接口绑定解决多参数传递问接口中定义方UserUserselByUP(Stringusername,String映射文件中提供对应的.此时,SQL语句中获取方式有两种,通过#{arg+数字}或#{param+数字}的<select<selectid="selByUP"select*fromt_userwhereusername=#{param1}and接口中定义方法,参数中使用@Param注解设定参数名用于在SQL语句中使用UserUserselByUP(@Param("username")Stringusername,@Param("password")Stringpassword);映射文件中提供对应的.此时,SQL语句中获取方式有两种,通过#{参数名称}或#{param+数字}的<select<selectid="selByUP"select*fromt_userwhereusername=#{username}and接口开发基本CRUD操//测试接口绑定方//测试接口绑定方案publicinterfaceUserMapper//查询所有用于信publicList<User>queryUserByNamePwd(@Param("name")Stringname,@Param("pwd")intpwd);//新增用publicintaddUser(Stringname,int//修改用户信publicintupdateUser(User//删除用publicintdeleteUser(int}<mapper<selectid="queryUserByNamePwd"select*fromt_userwhereusername=#{name}oruserpwd=<!--新增用户<insertINSERTINTOT_USER<!--修改用户<updateid="updateUser"updatet_usersetusername=#{username},userpwd=#{userpwd}where<!--删除用户<deleteid="deleteUser"parameterType="int">deletefromt_userwhereid=#{id}*接口实现publicclassUserTestpublicvoidtestDelete()SqlSessionsession=UserMapperuserMapper=introws=if(rows>0)System.out.println("成功}elseSystem.out.println("失败}}publicvoidtestUpdate()SqlSessionsession=UserMapperuserMapper=if(rows>0){System.out.println("成功}elseSystem.out.println("失败}}publicvoidtestInsert()SqlSessionsession=UserMapperuserMapper=introws=userMapper.addUser("林更新",45678);if(rows>0){System.out.println("成功}elseSystem.out.println("失败}}publicvoidtestSelect()SqlSessionsession=UserMapperuserMapper=}}批量操////publicinterfaceUserMapper2//publicintaddUserSome(List<User>//publicintdeleteSomeUser(List<Integer>//publicintupdateSomeUser(List<User>}<mapper<mapper<!--批量插入<insertid="addUserSome"parameterType="list">insertintotb_user(id,username,userpwd)selectseq_user_id.nextval,uname,upwdfrom(<foreachcollection="list"item="item"separator="union">select#{item.username}uname,#{item.userpwd}upwdfromdual)<!--批量删除<deleteid="deleteSomeUser"parameterType="list">deletefromtb_userwhereidin(<foreachcollection="list"item="item"separator=",">)<!--批量更新<updateid="updateSomeUser"updatetb_usersetuserpwd=#{item.userpwd}whereid=publicclassUserTest2publicvoidtestUpdateSome()SqlSessionsession=UserMapper2userMapper=List<User>list=newArrayList();list.add(newUser(218,"蓝精灵list.add(newUser(219,"粉精灵list.add(newUser(220,"紫精灵introws=}publicvoidtestDeleteSome()SqlSessionsession=UserMapper2userMapper=List<Integer>list=newArrayList();if(rows>0){System.out.println("成功}elseSystem.out.println("失败}}publicvoidtestInsertSome()SqlSessionsession=UserMapper2userMapper=List<User>list=newArrayList();list.add(newUser(1,"蓝精灵",5));list.add(newUser(2,"粉精灵list.add(newUser(1,"紫精灵introws=userMapper.addUserSome(list);if(rows>0){System.out.println("成功}elseSystem.out.println("失败}}}动态SQL是MyBatis的强大特性之一。如果你使用过JDBC或其它类似的框架,你应该能理解根据不同条件拼接SQL语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态SQL,可以彻底摆脱这种痛苦。使用动态SQL并非一件易事,但借助可用于任何SQL映射语句中的强大的动态SQL语言,MyBatis显用于进行条件判断test属性用于指定判断条件为了拼接条件SQL语句后强行添加1=1的恒成立条<select<selectid="sel"resultType="user">select*fromt_userwhere<iftest="username!=nullandusername!=''">and<iftest="password!=nullandpassword!=''">and用于管理where子句.有如下功能如果没有条件,不会生成where关键如果有条件,会自动添加where关键如果第一个条件中有and,<select<selectid="sel"resultType="user">select*fromt_user<iftest="username!=nullandusername!=''">and<iftest="password!=nullandpassword!=''">and这是一套,功能类似于<select<selectid="sel"resultType="user">select*fromt_user<whentest="username!=nullandusername!=''">andusername=#{username}<whentest="password!=nullandpassword!=''">andpassword=#{password}<otherwise>and1=1用于update语句中的set子句.功能如下满足条件时,会自动添加set会去除set子句中多余的逗不满足条件时,不会生成setintintupdUser(User<updateid="updUser"parameterType="user">updatet_userid=#{id},<!--防止所有条件不成立时的语法错误<iftest="username!=nullandusername!=''"><iftest="password!=nullandpassword!=''">where用于后添加或删除一些内prefix,面添加内prefixOverrides,从前面去除suffix,向后面添加内suffixOverrides,从后面去除内<update<updateid="updUser"parameterType="user">updatet_user<!--prefix:前缀,表示向前面添加内容prefixOverrides:从前面删除内容suffix:后缀表示向后面添加内容suffixOverrides:从后面删除内容<trimprefix="set"prefixOverrides="user"suffix="hahaha"suffixOverrides=",">username=#{username},where用于对数据进行再加工,用于模糊<select<selectid="sel"resultType="user">select*fromt_user<iftest="username!=nulland<bindname="username"value="'%'+username+'%'"/>andusernamelike#{username}用于在SQL语句中遍历集合参数,在in查询中collection:待遍历的集open:设置开始符item:迭代变separator:项目分隔close:设置结List<List<User>selIn(@Param("list")List<Integer><selectid="selIn"parameterType="list"resultType="user">select*fromt_userwhereidinitem="item">#{item}</foreach>sql用于提取SQL语句,include用于SQL语<sql<sqlid="mySql">id,username,password<selectid="selIn"parameterType="list"resultType="user"><includerefid="mySql"/>fromt_userwhereidinitem="item">#{item}Mybatis缓存缓存的重要性是不言而喻的。使用缓存,我们可以避免频繁的与数据库进行交互,尤其是在查询越多、缓存越高的情况下,使用缓存对性能的提高更明显。mybatis也提供了对缓存的支持,分为一级缓存和二级缓存。但是在默认的情况下,只开启一级缓一级缓默认开启.线程级别的缓存,SqlSession的缓存在一个SqlSession生命周期中有效.SqlSession关闭,缓存清在同一个SqlSession中,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个Map中,如果后续的键值一样,则直接从Map中获取数据;不同的SqlSession之间的缓存是相互的用一个SqlSession,可以通过配置使得在任何的UPDATE,INSERT,DELETE语句都会清空缓存二级缓进程级别的缓存,SqlSessionFactory在一个SqlSessionFactory生命周期中有效.可以在多个SqlSession生命中期中共享默认关闭,需要使用的时候,要为某个命名空间开启二级缓存(在mapper.xml中配置<!--<!--开启二级缓存,要求实体类进行序列化<cache由于在更新时会刷新缓存,因此需要注意使用场合:查询频率很高,更新频率很低时使用,即经常使用select,相对较少使用delete,insert,update。缓存是以namespace为单位的,不同namespace下的操作互不影响。但刷新缓存namespace的缓存,也就是你update了一个,则整个缓存最好在「只有单表操作」的表的namespace使用缓存,而且对该表的操作都在这个中。否则可能会出现数据不一致的情二级缓存应用场景对于多的查询请求并且用户对查询结果实时性要求不高的情况下,可采用mybts二缓存降低数据库量,提高速度,如 账单查询如果查询时使用resultType属性,表示采用MyBatis的Auto-Map(自动映射)机制,即相同的列名和属性名会自动匹配.因此,当数据库表的列名和类的属性名不一致时,会导致查不到数据.解决该问题可以列别查询时,可以通过列别名的方式将列名和属性名保持一致,继续使用自动映射,从而解决该问题.但是较为<select<selectid="selAll"selectidid1,usernameusername1,passwordpassword2from使用resultMap用于自定义映射关系,可以由程序员自主制定列名和属性名的映射关系.一旦使用<resultMap<resultMaptype="user"id="umap"><!--id用于映射主键<idcolumn="id"property="id1"/><!--非主键使用result映射<resultcolumn="username"property="username1"<resultcolumn="password"property="password1"<selectid="selAll"resultMap="umap">select*fromt_user一对一(人->)一对多(夏令营->学生)多对一(学生->班级)多对多(学生->课程)resultMap的关联方式实现多表查询(一对一|多对一在StudentMapper.xml中定义多表连接查询SQL语句,查到需要的所有数据,包括对应班级通过resultMap定义映射关系,并通过association指定对象属性的映射关系.可以把association看成一个resultMap使用.javaType属性表示当前对象,可以写全限定路径或学生类中添加一个班级类型的属性publicclasspublicclassStudentimplementsSerializable{privateintid;privateStringname;privateintage;privateStringgender;privateintcid;privateClazzcls;}<resultMap<resultMaptype="student"<idproperty="id"column="sid"<resultproperty="name"column="sname"<resultproperty="age"column="age"<resultproperty="gender"column="gender"<resultproperty="cid"column="cid"<associationproperty="cls"<idproperty="id"column="cid"<resultproperty="name"column="cname"<resultproperty="room"column="room"<selectid="selAll"resultMap="smap">selects.idsid,sname,s.age,s.gender,c.idcid,cname,c.roomfromt_studentsleftjoint_classcons.cid=c.idresultMap的关联方式实现多表查询(一对多在ClazzMapper.xml中定义多表连接查询SQL语句,查到需要的所有数据,包括对应学生的通过resultMap定义映射关系,并通过collection指定集合属性泛型的映射关系.可以collection看成一个resultMap使用.ofType属性表示集合的泛型,可以写全限定路径或别名.班级类中添加一个List容器学生类型的数据publicclasspublicclassClazzimplementsSerializable{privateintid;privateStringname;privateintroomNum;privateList<Student>stus;}<mapper<mapper<resultMaptype="clazz"<idproperty="id"column="cid"<resultproperty="name"column="cname"<resultproperty="room"column="room"<collectionproperty="stus"javaType="list"<idproperty="id"column="sid"<resultproperty="name"column="sname"<resultproperty="age"column="age"<resultproperty="gender"column="gender"<resultproperty="cid"column="cid"<selectid="selAll"resultMap="cmap">selectc.idcid,cname,c.room,c.room,s.idsid,sname,s.age,s.genderfromt_studentsrightjoint_classcons.cid=c.id</select>Mybatis中注解的作使用注解一般用于简化配置文件但是注解有时候也不是很友好(有时候反而更麻烦例如SQL等,所MyBatis中常用的注CRUD@Select:类似于select@Insert:类似于insert@Update:类似于update@Delete:类似于deleteimportjava.util.List;importorg.apache.ibatis.annotations.Delete;importorg.apache.ibatis.annotations.Inse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论