Mybatis Java3y资源三歪教你学Mybatis_第1页
Mybatis Java3y资源三歪教你学Mybatis_第2页
Mybatis Java3y资源三歪教你学Mybatis_第3页
Mybatis Java3y资源三歪教你学Mybatis_第4页
Mybatis Java3y资源三歪教你学Mybatis_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

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

文档简介

前言Mybatis入门1. 什么是MyBatis2. 为什么我们要用Mybatis?3. Mybatis快速入门3.1 导入开发包3.2 准备测试工作3.3 创建mybatis配置文件3.4 编写工具类测试是否获取到连接3.5 创建实体与映射关系文件3.6 编写DAO4. Mybatis工作流程5. 完成CRUD操作5.1 增加学生5.2根据ID查询数据5.3 查询所有数据5.4 根据id删除5.5 修改5.6 小细节5.7Mybatis分页6. 动态SQL6.1 动态查询6.2 动态更新6.3 动态删除6.4 动态插入7. 入门总结Mybatis配置信息1. 映射文件1.1占位符1.2 主键生成策略1.2.1 UUID1.3 主键返回1.4 resultMap1.5 resultMap和resultType区别1.6 使用resultMap1.7 resultType和resultMap用法总结1.8Mybatis映射文件处理特殊字符2. 配置文件2.1别名2.2Mapper加载2.3延迟加载2.4 延迟加载测试3. 配置相关总结关联映射1. Mybatis【多表连接】1.1一对一1.1.1设计表:1.1.2实体1.1.3 映射文件1.1.4 DAO层1.2 一对多1.2.1设计数据库表1.2.2实体1.2.3映射文件SQL语句1.2.4DAO1.3多对多1.3.1 数据库表1.3.2实体1.3.3映射文件1.3.4DAO2. 关联映射总结缓存+Mapper代理+逆向工程1. 前言2. Mybatis缓存2.1 Mybatis一级缓存2.2 Mybatis二级缓存2.3Mybatis二级缓存配置2.4 查询结果映射的pojo序列化2.5 禁用二级缓存2.6 刷新缓存2.7 了解Mybatis缓存的一些参数3.mybatis和ehcache缓存框架整合3.1整合jar包3.2 ehcache.xml配置信息3.3应用场景与局限性3.3.1 应用场景3.3.2局限性4. Mapper代理方式4.1 Mapper开发规范4.2Mapper代理返回值问题5. Mybatis解决JDBC编程的问题6.Mybatis逆向工程6.1 修改pom.xml文件6.2generatorConfig.xml配置文件6.3 使用插件步骤6.4最后生成代码7.本章总结Mybatis整合Spring1. Mybatis与Spring整合1.1导入jar包1.2 创建表1.3 创建实体1.4 创建实体与表的映射文件1.5 创建Mybatis映射文件配置环境1.6 配置Spring核心过滤器【也是加载总配置文件】1.7 配置数据库信息、事务1.8 创建Dao、Service、Action1.9JSP页面测试2. 总结Mybatis常见面试题1. #和$的区别是什么?2.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?3. 如何获取自动生成的(主)键值?4. 在mapper中如何传递多个参数?5. Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?6. Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?7. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?8. 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?9. Mybatis比IBatis比较大的几个改进是什么10. 接口绑定有几种实现方式,分别是怎么实现的?11. Mybatis是如何进行分页的?分页插件的原理是什么?12. 简述Mybatis的插件运行原理,以及如何编写一个插件13. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?14. Mybatis都有哪些Executor执行器?它们之间的区别是什么?15. MyBatis与Hibernate有哪些不同?前言这个文档的内容纯手打,如果想要看更多的干货文章,关注我的公众号:Java3y。有更多的原创技术文章和干货!目前疯狂处于疯狂更新PDF中,只要是Java后端的知识,都会有!欢迎来我公众号催更!微信搜索:Java3y如果文档中有任何的不懂的问题,都可以直接来找我询问,我乐意帮助你们!公众号有我的联系方式 Java精美脑图 Java学习路线 开发常用工具 精美原创电子书在公众号下回复888即可获取!学习不能盲目,跟着我,会让你事半功倍文档允许随意传播,但不能修改任何内容。电子书的整理也是挺不容易,如果你觉得有帮助,想要打赏作者,那么可以通过这个收款码打赏我,金额不重要,心意最重要。主要是我可以通过这个打赏情况来预计大家对这本电子书的评价,嘻嘻Mybatis入门1. 什么是MyBatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。是一个基于Java的持久层框架2. 为什么我们要用Mybatis?无论是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!到目前为止,我们已经在持久层中学了几种技术了. Hibernate jdbc SpringDAO那我们为啥还要学Mybatis呢?现在Mybatis在业内大行其道,那为啥他能那么火呢?Hibernate是一个比较老旧的框架,用过他的同学都知道,只要你会用,用起来十分舒服.啥sql代码都不用写.但是呢,它也是有的缺点:处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句而JDBC很容易理解,就那么几个固定的步骤,就是开发起来太麻烦了,因为什么都要我们自己干.我们可以认为,Mybatis就是jdbc和Hibernate之间的一个平衡点.毕竟现在业界都是用这个框架,我们也不能不学呀!3. Mybatis快速入门其实我们已经学过了Hibernate了,对于Mybatis入门其实就非常类似的。因此就很简单就能掌握基本的开发了.3.1 导入开发包更新:如果用Maven的同学,这里引入maven依赖就好了导入Mybatis开发包 mybatis-3.1.1.jar commons-logging-1.1.1.jar log4j-1.2.16.jar cglib-2.2.2.jar asm-3.3.1.jar导入mysql/oracle开发包 mysql-connector-java-5.1.7-bin.jar Oracle 11g .0 JDBC_ojdbc6.jar3.2 准备测试工作创建一张表create table students( id int(5) primary key, name varchar(10), sal double(8,2);创建实体:/* * Created by ozc on 2017/7/21. */public class Student private Integer id; private String name; private Double sal; public Student() public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) = name; public Double getSal() return sal; public void setSal(Double sal) this.sal = sal; 3.3 创建mybatis配置文件创建mybatis的配置文件,配置数据库的信息.数据库我们可以配置多个,但是默认的只能用一个.3.4 编写工具类测试是否获取到连接使用Mybatis的API来创建一个工具类,通过mybatis配置文件与数据库的信息,得到Connection对象package cn.itcast.javaee.mybatis.util;import java.io.IOException;import java.io.Reader;import java.sql.Connection;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;/* * 工具类 * author AdminTC */public class MybatisUtil private static ThreadLocal threadLocal = new ThreadLocal();private static SqlSessionFactory sqlSessionFactory;/* * 加载位于src/mybatis.xml配置文件 */statictry Reader reader = Resources.getResourceAsReader(mybatis.xml);sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); catch (IOException e) e.printStackTrace();throw new RuntimeException(e);/* * 禁止外界通过new方法创建 */private MybatisUtil()/* * 获取SqlSession */public static SqlSession getSqlSession()/从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();/如果SqlSession对象为空if(sqlSession = null)/在SqlSessionFactory非空的情况下,获取SqlSession对象sqlSession = sqlSessionFactory.openSession();/将SqlSession对象与当前线程绑定在一起threadLocal.set(sqlSession);/返回SqlSession对象return sqlSession;/* * 关闭SqlSession与当前线程分开 */public static void closeSqlSession()/从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();/如果SqlSession对象非空if(sqlSession != null)/关闭SqlSession对象sqlSession.close();/分开当前线程与SqlSession对象的关系,目的是让GC尽早回收threadLocal.remove();/* * 测试 */public static void main(String args) Connection conn = MybatisUtil.getSqlSession().getConnection();System.out.println(conn!=null?连接成功:连接失败);3.5 创建实体与映射关系文件配置实体与表的映射关系现在我们已经有了Mybatis的配置文件和表与实体之前的映射文件了,因此我们要将配置文件和映射文件关联起来在测试类上,我们是可以获取得到连接的3.6 编写DAOpublic class StudentDao public void add(Student student) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); sqlSession.insert(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); Student student = new Student(1, zhongfucheng, 10000D); studentDao.add(student); 到现在为止,我们实体与表的映射文件仅仅映射了实体属性与表的字段的关系.我们在Hibernate中如果想要插入数据什么的,只要调用save()方法就行了。Hibernate是自动化屏蔽掉了数据库的差异,而我们Mybatis是需要自己手动编写SQL代码的.那么SQL代码是写在哪里的呢?明显地,我们作为一个框架,不可能在程序中写SQL,我们是在实体与表的映射文件中写的!Mybatis实体与表的映射文件中提供了insert标签【SQL代码片段】供我们使用/在JDBC中我们通常使用?号作为占位符,而在Mybatis中,我们是使用#作为占位符/parameterType我们指定了传入参数的类型/#实际上就是调用了Student属性的get方法INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#id,#name,#sal);在程序中调用映射文件的SQL代码片段 public void add(Student student) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL sqlSession.insert(StudentID.add, student); sqlSmit(); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); 值得注意的是:Mybatis中的事务是默认开启的,因此我们在完成操作以后,需要我们手动去提交事务!4. Mybatis工作流程 通过Reader对象读取Mybatis映射文件 通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象 获取当前线程的SQLSession 事务默认开启 通过SQLSession读取映射文件中的操作编号,从而读取SQL语句 提交事务 关闭资源如果档中有任何的不懂的问题,都可以直接来找我询问,我乐意帮助你们!微信搜Java3y公众号有我的联系式。更多原创技术章可关注我的GitHub:/ZhongFuCheng3y/3y5. 完成CRUD操作我们在上面中已经简单知道了Mybatis是怎么使用的以及工作流程了,这次我们使用Mybatis来完成CRUD的操作,再次巩固Mybatis的开发步骤以及一些细节包与类之间的结构5.1 增加学生配置文件映射文件INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#id,#name,#sal);插入数据public class StudentDao public void add(Student student) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL sqlSession.insert(StudentID.add, student); sqlSmit(); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); Student student = new Student(3, zhong3, 10000D); studentDao.add(student); 5.2根据ID查询数据增加select标签SELECT * FROM STUDENTS WHERE id = #id;查询出来的结果是一个Student对象,我们调用SelectOne方法 public Student findById(int id) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL return sqlSession.selectOne(StudentID.findById,id); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); Student student = studentDao.findById(1); System.out.println(student.getName(); 5.3 查询所有数据!-查询所有数据返回值类型讲道理是List的,但我们只要写集合中的类型就行了-SELECT * FROM STUDENTS;我们查询出来的结果不单单只有一个对象了,因此我们使用的是SelectList这个方法 public List findAll() throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL return sqlSession.selectList(StudentID.findAll); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); List students = studentDao.findAll(); System.out.println(students.size(); 5.4 根据id删除DELETE FROM STUDENTS WHERE id=#id;调用delete方法删除 public void delete(int id ) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL sqlSession.delete(StudentID.delete, id); sqlSmit(); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); studentDao.delete(1); 5.5 修改update students set name=#name,sal=#sal where id=#id;查询出对应的对象,对其进行修改 public void update(Student student ) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL sqlSession.update(StudentID.update, student); sqlSmit(); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); Student student = studentDao.findById(2); student.setName(fucheng); student.setSal(2000D); studentDao.update(student); 5.6 小细节5.7Mybatis分页分页是一个非常实用的技术点,我们也来学习一下使用Mybatis是怎么分页的.我们的分页是需要多个参数的,并不是像我们之前的例子中只有一个参数。当需要接收多个参数的时候,我们使用Map集合来装载! public List pagination(int start ,int end) throws Exception /得到连接对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try /映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL /* * 由于我们的参数超过了两个,而方法中只有一个Object参数收集 * 因此我们使用Map集合来装载我们的参数 */ Map map = new HashMap(); map.put(start, start); map.put(end, end); return sqlSession.selectList(StudentID.pagination, map); catch(Exception e) e.printStackTrace(); sqlSession.rollback(); throw e; finally MybatisUtil.closeSqlSession(); public static void main(String args) throws Exception StudentDao studentDao = new StudentDao(); List students = studentDao.pagination(0, 3); for (Student student : students) System.out.println(student.getId(); 那么在实体与表映射文件中,我们接收的参数就是map集合/*根据key自动找到对应Map集合的value*/select * from students limit #start,#end;6. 动态SQL何为动态SQL?回顾一下我们之前写的SSH项目中,有多条件查询的情况,如下图我们当时刚开始做的时候,是需要在Controller中判断SQL是否已经有条件了,因为SQL语句需要拼接起来.这样干的话,就非常容易出错的。如下的代码,如果有多个条件的话,那么拼接起来很容易出错! public String listUI() /查询语句 String hql = FROM Info i ; List objectList = new ArrayList(); /根据info是否为null来判断是否是条件查询。如果info

温馨提示

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

评论

0/150

提交评论