版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Mybatis 3.3金蝶中间件-叶超目录2314Mybatis简介xml配置MybatisMybatis两种方式注解配置MybatisMybatis简介MyBatis1.是apache的一个开源项目iBatis,2010年迁移到了google code并且改名为MyBatis.2.支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。3.每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。4.SqlSessionFactoryBuilder可以从一个xml配
2、置文件或者一个预定义的配置类的实例获得。Mybatis两种方式1.XML配置Mybatis2.注解配置Mybatisxml配置Mybatis主要的成员1.主配置文件-主要作用对数据库的链接访问引入资源文件对模型类更改别名加载map映射2.资源文件-主要作用为数据库的链接提供访问信息,并不是必须需求.但是在多数据库的链接选择时,资源文件可以更好的选择链接数据库.3.SessionFactory类-主要作用获取SessionFactory,以提供给数据库操作.4.模型类-主要作用承接数据库查询出的数据的载体.5.map映射接口-主要作用定义抽象的数据库操作方法.6.map映射xml配置文件-主要作
3、用实现map映射接口的数据库操作方法.xml配置Mybatis主要的成员目录结构一览表1.资源文件2.主配置文件3.数据库连接获取类4.模型类5.模型类的map映射接口6.模型类的map映射xml7.实现xml配置Mybatis简单关系示意1.资源文件2.主配置xml4.模型类5.map映射接口6.map映射配置文件3.SessionFactory类读取数据库信息写入map映射实现抽象方法jdbc连接模型类作为返回数据的承载对象7.获取session获取map映射中接口类中的方法实现操作8.实现操作方法xml配置Mybatis主配置XML配置说明主配置文件主要有:1.xml配置头信息;2.引入
4、资源文件3.给予模型类别名的别名标签4.数据库连接环境配置,可以根据需求自由更改选择5.map映射引入标签1.xml配置的头信息2.根标签资源文件配置说明资源文件名为perties(可以任意取名)/这里主要是写下连接数据库的信息,包括了驱动,数据库名 密码等等,资源文件是为了给主配置文件存储连接数据库信息而存在的jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:/localhost:3306/db_mybatisjdbc.username=rootjdbc.password=123456也可以直接定在主配
5、置文件中xml配置Mybatis主配置XML配置说明3.引入资源文件或者写入资源文件数据库的链接信息可以放入资源文件,当然也可以直接卸载主配置文件中.不过这里建议使用资源文件引入,在切换数据库的工作环境时相对更加方便.引入资源文件:直接写入:建议使用引入资源文件方法.这样在数据库环境选择操作更加灵活4.别名标签如果不适用别名来处理模型等文件,那么在引入的时候就需要写入模型的绝对路径.使用别名标签就可以在其他地方引入的时候直接使用别名.别名标签定义方式有两种,逐个定义和包扫描的方式.逐个定义: 每个模型类定义一次 非常的麻烦.包扫描:自动扫描com.java1234.model的包,下面的所有模
6、型类,以类名为别名,在其他地方直接用类名调用.xml配置Mybatis主配置XML配置说明5.数据库连接环境数据库连接标签,中最少定义一个数据库,要有默认的数据库连接.然后根据需求可以有多个数据库,如开发数据库,测试数据库,生产数据库等等.定义单个数据库连接:/定义数据库环境名称./连接方式注:连接方式有两种:JDBC和MANAGED;JDBC是应用程序管理数据库连接的生命周期,二MANAGED是托管给服务器管理(一般商业服务器才有);/配置数据源注:有3种模式,分别是POOLED,UNPOOLED,JNDI;POOLED是用上连接池,UNPOOLED是不用连接池,每次操作都会创建一个新的连接
7、,JNDI使用应用服务器配置JNDI数据源获取数据库连接xml配置Mybatis主配置XML配置说明/配置属性(连接数据库的驱动,地址,用户名,密码等等)注:这里的value所获取的值是资源文件中的值,或者是主配置文件中前面定义的值.6.引入map映射配置文件/与别名类似之处,可以逐个引入map映射的xml配置文件 /也可以使用package标签扫描指定的包,引入使用注:引入map映射建议用第二种在使用Mybatis时,配置xml主文件一般是最开始的步骤,那么这个时候还没有写map映射文件与模型类.最好的解决办法,想创建一个存放模型类的包与map映射文件的包,使用package方法自动扫描模型
8、包,与map映射文件包.在后续操作中,只需要在这两个包中写文件,就可以另外添加更改主配置文件xml配置Mybatis模型类说明模型类的构建作为配置了主配置文件之后的第二步工作,模型类有点相似于javabean模型类的构建需求适用于以下几点:1.一张表对应一个模型类2.表中的字段对应类的属性3.如果是1对1或者是1对多的关系,那么类的属性是另一个模型类的引用4.每个属性对应getSet方法5.默认构造以及全参数传参构造在使用的时候会更方便注:其实模型类很灵活,不一定每个字段都要有对应的属性.xml配置MybatisSqlSession获取SqlSession是操作数据库的链接会话,通过SqlSe
9、ssionFactoryFactoryBuilder来回去1.使用输入流读取主配置xml文件inputStream=Resources.getResourceAsStream(mybatis-config.xml);2.根据主配置获取sqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);(注意:最好以单例的方法获取SqlSessionFactory)3.通过SqlSessionFactory获取SqlSessionsqlSessionFactory.openSession();(
10、注意:获取的方式是这样,在处理的时候需要注意SqlSessionFactory是否是空值!)通过会话操作数据库实例:SqlSession sqlSession=SqlSessionFactoryUtil.openSession();StudentMapper studentMapper=sqlSession.getMapper();Student student=new Student(李四,11);int result=studentMapper.add(student);sqlSmit();加粗部分为操作方法的map映射接口xml配置MybatisSqlSession获取sqlSessio
11、n获取单例类例子:public class SqlSessionFactoryUtil private static SqlSessionFactory sqlSessionFactory;public static SqlSessionFactory getSqlSessionFactory()if(sqlSessionFactory=null)InputStream inputStream=null;tryinputStream=Resources.getResourceAsStream(mybatis-config.xml);sqlSessionFactory=new SqlSessio
12、nFactoryBuilder().build(inputStream);catch(Exception e)e.printStackTrace();return sqlSessionFactory;public static SqlSession openSession()return getSqlSessionFactory().openSession();xml配置Mybatismap映射接口在接口中定义抽象方法,抽象方法的返回类型决定了sql的返回类型,抽象方法的传参,决定了操作xml配置实现时候的传参.例如定义接口:public int (Student student);map映射
13、xml/namespace是命名空间对应绝对路径的mapper接口类/例子:实现了上面map映射接口中定义的add抽象方法insert into t_student values(null,#name,#age) 注:map映射xml实现了map映射接口中的所有抽象方法方法构建完模型类之后,就要针对模型类进行map映射的配置,每一个模型类一般对应了一个map映射接口与map映射xml的配置文件xml配置Mybatismap映射xml数据库操作标签下面先从简单的增删改查sql操作开始增删改查各自对应了一个标签增加操作/id对应map映射接口类中的抽象方法 parameterType 是传参限定,
14、可以是类,也可以是Map也可以是集合数组等等insert into t_student values(null,#name,#age)/sql语句,在需要写入值的时候,使用#键名,如果传入的是类,则对应对象的属性名,如果是map则是key,不同的传参,如果只定义了一个参数,那么就指带这个参数除了查找以为 ,其他的操作不用定义返回值类型.他们的返回值统一为Integer类型的.操作成功为1 失败为0删除操作delete from t_student where id=#idxml配置Mybatismap映射xml数据库操作标签修改操作update t_student set name=#name
15、,age=#age where id=#id查找操作select * from t_student where id=#id查找操作要定义返回值类型.是针对的查找出的每一条记录所需要承载的载体容器.并不是针对结果集./定义返回类型标签,type是返回的类型,这里使用模型类作为载体,id是这个返回类型的名称./下面是模型类属性对应数据库表的列名xml配置Mybatismap映射xml数据库操作标签查找操作如果查找到的是结果集,那么需要一个载体去承载多条记录.不过这里要注意的是,在map映射xml中的resultType是针对返回的每一条数据.无论这个查找返回了一条数据还是多条数据,而result
16、Type针对的每一条数据.所以如果返回的是结果集,就要在map映射的接口中的抽象方法上定义返回类型为List.这样就会得到结果集的查询集合.抽象方法:public List find();xml配置实现方法:select * from t_student where id=#idmap映射xml数据库操作一对一一对一关系配置假如有一张学生表,学生表的列名中有一个外键列address为地址表的id在查找一个学生信息与地址信息的时候,需要对resultMap重新定义有三种方法做1对1的处理第一种方法,定义在一个resultMap中-对象级联xml配置Mybatismap映射xml数据库操作一对一1
17、.对象级联两张表对应的模型类的关系定义在一个resultMap中 /下面的是学生表信息对应/下面是地址表信息对应上面的column对应的是student表外键的名字,而下面的column对应的是address表的列名 这样在查询的时候,使用这个resultMap作为resultType就可以获得一对一的查询数据出来,不过这样的方法,比较麻烦,每次要放在一起定义一个新的resultMap.xml配置Mybatismap映射xml数据库操作一对一2.嵌套(上面的address是Student模型类的引用属性,返回类型是根据Address模型对象定义的resultMap) 或者 这样的定义方法相对于
18、第一种灵活了很多,但是还不是最优方法.xml配置Mybatismap映射xml数据库操作一对一3.每张表对应一份xml的map映射文件和map映射接口在address的map映射xml中在map映射接口中定义一个抽象方法:根据id查找地址的抽象方法,传入参数是Inteage然会类型是Address模型类对象.(实现过程略)在map映射xml中实现上面接口中的抽象方法/定义对应的返回类型/定义跟住主键的查询方法select * from t_address where id=#id Student的map映射xml中association 标签通过select定义查询方法,并查出对应外键的数据,
19、存在模型类的引用属性中xml配置Mybatismap映射xml数据库操作一对多假如多了一个年级表,并且在student的表中多了一个列为年级的id首先完成年级表的模型,map映射接口与map映射xml在模型中添加新属性为Listselect * from t_grade where id=#id 这里需要在student的map映射中定义一个查询方法,通过传入年级id参数去查找学生的信息select * from t_student where gradeId=#gradeId说明:一个年级对应多个学生,在年级的map映射接口中定义一个查找方法,根据id查询年级的信息,然后再map映射的xml
20、文件中,定义resultMap返回类型,其中使用标签 通过学生模型类的映射map中定义的按照年级查找学生的方法找出学生结果集,存放在年级模型对象的List属性中xml配置Mybatis动态sql关于动态sql,主要是Mybatis中提供的条件标签并且配合模型类或者Map的使用,而产生的效果if标签select * from t_student where gradeId=#gradeIdif标签中test是条件,如name!=null , 就是指在传入的map中,参数中是否存在key是name的value或者传入对象的属性是否有name的属性并且不为空,如果满足了,就会执行if标签中的语句.c
21、hoose标签select * from t_student 类似switch语句,灵活性不高不建议使用xml配置Mybatis动态sqlwhere标签select * from t_student 如果where标签中的标签成立,则会自动在sql语句中添加where关键词, 如果在where中的第一个成立的条件前面有and,那么他会自动去除第一个成立的标签中的and , 但是他不会自动添加and!trim标签select * from t_student 自定义前缀,判断性的添加prefix中定义的值,如果trim标签中有成立的,那么就会剔除第一个成立的中prefixOverrides中定义
22、的参数,用法类似于where,不过更加的灵活多变.xml配置Mybatis动态sqlforeachselect * from t_student gradeId in 如果传参map中有key为gradeIds的集合,那么就可以遍历gradeIds集合进行SQL语句的in操作 ,open是为了拼sql语句in中的( , )等符号setupdate t_studentwhere id=#id根据传入的值去判断更改的选项xml配置-杂项多个参数传入如果在定义map映射接口的时候,需要传入多个参数传参.那么在xml的map映射中需要特别提取方法(形参的定义取决于map映射的接口中的方法)/map映射
23、接口public List searchStudents6(String name,int age);/map映射xmlselect * from t_student where name like #param1 and age=#param2mybatis分页-逻辑分页Mybatis自带的分页为逻辑分页,就是取出所有的数据放在内存中,然后再根据指令从内存中取出规定条数返回.首先在map映射接口中定义抽象方法public List findStudents(RowBounds rowBounds);注意RowBounds是Mybatis提供的类,为了存放分页信息;select * from
24、t_student/下面为实现过程int offset=0,limit=3;RowBounds rowBounds=new RowBounds(offset,limit);List studentList=studentMapper.findStudents(rowBounds);for(Student student:studentList)System.out.println(student);Mybatis分页-物理分页物理分页的主要实现方法是对sql语句的拼接map映射接口定义方法public List findStudents2(Map map);map映射xml实现接口方法sele
25、ct * from t_student传入参数map中定义key为start的起始位置与key为size的分页大小Mybatis的缓存默认情况下是一级缓存,即同一个SqlSession接口对象调用了相同的select语句,则直接从缓存中获取结果,而不是再查一次数据库,开发者可以自己配置二级缓存,二级缓存为全局缓存.缓存主要针对的是select.在map映射的xml中配置二级缓存1,size:表示缓存cache中能容纳的最大元素数。默认是1024;2,flushInterval:定义缓存刷新周期,以毫秒计;3,eviction:定义缓存的移除机制;默认是LRU(least recently us
26、erd,最近最少使用),还有FIFO(first in first out,先进先出)4,readOnly:默认值是false,假如是true的话,缓存只能读。在标签中可以添加是否使用缓存(默认true)与清空缓存(默认false,可以在insert与update和delete中使用)xml配置-杂项注解配置Mybatis基本映射语句注解方法是不需要map映射xml的,需要map映射接口Insert(insert into t_student values(null,#name,#age)public int insertStudent(Student student);Update(upda
27、te t_student set name=#name,age=#age where id=#id)public int updateStudent(Student student);Delete(delete from t_student where id=#id)public int deleteStudent(int id);Select(select * from t_student where id=#id)public Student getStudentById(Integer id);只需要在接口的抽象方法上定义相应的注解就可以自己查找注解返回结果集Select(select
28、* from t_student)Results(/这里要定义结果集返回的每一条结果的列名对应承载对象Student的属性名Result(id=true,column=id,property=id),Result(column=name,property=name),Result(column=age,property=age)public List findStudents();映射语句一对一注解方法一对一Select(select * from t_student where id=#id)Results(Result(id=true,column=id,property=id),Resu
29、lt(column=name,property=name),Result(column=age,property=age),/定义一个返回结果,对应的是学生表的外键列,对应学生address属性,通过地址id在地址映射接口查找地址信息Result(column=addressId,property=address,one=One(select=com.java1234.mappers.AddressMapper.findById)public Student selectStudentWithAddress(int id);/在地址的映射接口中定义方法public interface Addr
30、essMapper /定义一个查询方法,通过id查询地址Select(select * from t_address where id=#id)public Address findById(Integer id);注解配置Mybatis映射语句一对多/年级map映射接口public interface GradeMapper Select(select * from t_grade where id=#id)Results(Result(id=true,column=id,property=id),Result(column=gradeName,property=gradeName),)pu
31、blic Grade findById(Integer id);学生map映射接口Select(select * from t_student where gradeId=#gradeId)Results(Result(id=true,column=id,property=id),Result(column=name,property=name),Result(column=age,property=age),)public Student selectStudentByGradeId(int gradeId);注解配置Mybatis动态sql注解配置Mybatis实现动态sql必须要写实现类
32、map映射接口InsertProvider(type=StudentDynaSqlProvider.class,method=insertStudent)public int insertStudent(Student student);UpdateProvider(type=StudentDynaSqlProvider.class,method=updateStudent)public int updateStudent(Student student);DeleteProvider(type=StudentDynaSqlProvider.class,method=deleteStudent
33、)public int deleteStudent(int id);SelectProvider(type=StudentDynaSqlProvider.class,method=getStudentById)public Student getStudentById(Integer id);SelectProvider(type=StudentDynaSqlProvider.class,method=findStudents)public List findStudents(Map map);在上面的接口注释中,type=StudentDynaSqlprovider.class就是动态sql的实现类,后面的method是在实现类中对应的方法名称注解配置Mybatis动态sql注解配置Mybatis实现动态sql必须要写实现类/因为有匿名累不累,所以形参定义成finalpublic String insertStudent(final Student student)return new SQL()INSERT_INTO(t_student);if(student.getName()!=null)VA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内燃机车钳工风险评估与管理竞赛考核试卷含答案
- 草地监测员安全宣教能力考核试卷含答案
- 合成气装置操作工岗前安全生产知识考核试卷含答案
- 淀粉及淀粉糖制造工复测评优考核试卷含答案
- 氯氢处理工安全行为评优考核试卷含答案
- 医疗器械购销员岗中新技术考核试卷含答案
- 氯丁橡胶装置操作工达标知识考核试卷含答案
- 粉末冶金模具工岗前岗位实操考核试卷含答案
- 输蔗破碎工岗位安全宣贯考核试卷含答案
- 煤层气固井工岗中诚信道德考核试卷含答案
- 2026年企业文化企业建设知识竞赛-中国电信知识竞赛历年参考题库含答案解析
- 2026高考议论文范文19篇(完整版含真题立意+考场高分作文)
- ESG管理制度手册
- 2026苏教版二上数学第二单元第5课时《用1~6的乘法口诀求商》课件
- 2026-2027学年苏教版(新教材)小学科学五年级上册(全册)知识点清单
- 2026年湖南省中考历史试卷(含答案)
- 校园小导游、小讲堂(课件)-2025-2026学年人教版二年级上册数学
- 《演唱 郊游》课件2025-2026学年冀少版三年级下册音乐
- 矿山全员责任制考核制度
- 2026年乡村医生真题【历年真题】附答案详解
- 2026年C1驾照三力测试模拟题库
评论
0/150
提交评论