本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看

JDBC写法

//sql:
String sql = "select * from user";
//加载驱动:
Class.forName("com.mysql.jdbc.Driver");
//根据参数创建连接
Connection conn = DriverManager.getConnection(url,username,password);
//创建PreparedStatement
PreparedStatement statement = conn.prepareStatement(sql);
//执行sql,并使用resultSet接收结果
ResultSet rs = statement.executeQuery();
//将rs里的所有值取出来
try{
while(rs.next()){
String ... = rs.getString(1)/rs.getString("userName"); //从结果中根据列名或者列的序号取值.
}
}catch(SqlException ex){ }finally{
//必须要手动释放连接
conn.close();
}
//

以上即是一个简单的jdbc查询数据库的写法.

有什么问题呢?

第一是sql的写法,如果sql过长,参数过多,拼接起来很麻烦,不直观,并且sql很难查看;

第二是Connectione的创建和销毁需要手动控制,而这些应该是业务无关代码.

Mybatis主要概念

ORM框架是一种数据操作的框架,常见的比如JDBC,Hibernate,当然,Mybatis也是其中的一种.

相比于JDBC,Mybatis的优势在于能将Sql集中配置;并且能和Spring集成;将connection交给Spring托管,不需要开发者自己操作;同时也能方便进行AOP的开发.

而和hibernate对比,Mybatis则比较容易学,没有hibernate那么高的门槛.

如何配置Mybatis

1.配置Mybatis的配置文件Configuration.xml

2. 读取xml,创建sqlsession
        //通过配置文件获取数据库连接信息
Reader reader = Resources.getResourceAsReader("com/chentao/MicroMessage/config/mybatis-config.xml"); //通过配置信息构建一个SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //通过sqlsessionfactory打开session
SqlSession sqlSession = sessionFactory.openSession(); return sqlSession;
3.配置与Sql相关的XML文件
3.1 定义namespace       --namespace定义了xml文件的域,和mybatis接口相匹配,也是为了标志在xml文件中定义的属性等
3.2 定义resultMap,用来简单接受返回对象(当然也可以不用定义,返回时)mybatis使用约定来返回对象)
3.3 在xml中定义sql,通过id对应方法名称,在java中调用
4.在Configuration.xml中将第三步配置的文件通过mapper属性引入文内存中读取
5.在Java中使用接口来调用sql写就的业务
4.关于代码中参数的使用,可以传入一个map,可以传入对象,也可以传入多个对象,在(需要接口中通过注解定义在sql中使用的参数名)
5.关于一对多配置的使用:
5.1 在resultMap中引入其他的resultMap
5.2 在sql中使用join这样的方式可以查出一对多的对象,
5.3 如果在返回结果中字段名称相同,则需要使用As指定别名,并在resultMap的属性中体现出来.

概念深入了解(加强版)

接口式编程

通过namespace的包名和相应接口的包名与类名进行匹配,可以通过调用接口的方法直接使用sql的逻辑.

mybatis实现这一特性的方法是动态代理.

分页:

根据每页的条数,和需要查询的页数可以加载整个页面的数据;

简单逻辑是从数据库拿到总条数,然后计算出总页数,然后通过数据查询出第n到m条数据,使用limit关键字(mysql中)即可以拿到需要查询的数据.

Mybatis拦截器

实现:

1:实现mybatis的Inteceptor接口

在实现类上使用注解:Intercepts来定义需要拦截哪种类型的方法.

实现plugin方法和intercept方法;

2:在plugin中根据注解和传进来的对象确定是否拦截该对象.

3:在intercept方法中确定是否拦截对应方法,并拿到其中参数,包括sql,增加自己的逻辑.

4:在intercept方法中,使用invocaiton.proceed来调用原来的逻辑.

通过拦截器实现分页是比较常见的场景.

Mybatis篇总结的更多相关文章

  1. Spring Boot 2.x 多数据源配置之 MyBatis 篇

    场景假设:现有电商业务,商品和库存分别放在不同的库 配置数据库连接 app: datasource: first: driver-class-name: com.mysql.cj.jdbc.Drive ...

  2. JavaORM框架之Mybatis篇(Ibatis)

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  3. 【Java面试】Mybatis篇

    1.MyBatis编程步骤是什么样的? ① 创建SqlSessionFactory ② 通过SqlSessionFactory创建SqlSession ③ 通过sqlsession执行数据库操作 ④  ...

  4. Java面试题(Mybatis篇)

    Mybatis 125.mybatis 中 #{}和 ${}的区别是什么? #{}是预编译处理,${}是字符串替换: Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用Prepared ...

  5. java 面试题 mybatis 篇

    1. 一级缓存和二级缓存? 一级缓存策略: 二级缓存策略: 2. 缓存回收策略 LRU –  最近最少使用的:移除最长时间不被使用的对象. FIFO –  先进先出:按对象进入缓存的顺序来移除它们. ...

  6. JAVA常用知识点及面试题总结

    1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...

  7. JDK源码及其他框架源码解析随笔地址导航

    置顶一篇文章,主要是整理一下写过的JDK中各个类的源码及其他框架源码解析的文章,方便自己随时阅读也方便网友朋友们阅读与指正 基础篇 从为什么String=String谈到StringBuilder和S ...

  8. 成为一名Java架构师的必修课

    一.热门框架源码学习 设计模式篇 Spring5源码解读篇 Mybatis篇 SpringBoot2篇 二. 微服务架构 架构设计篇 BAT互联网架构这些年的演进分析 国内外常见分布式系统架构状况介绍 ...

  9. GitHub标星125k!阿里技术官用3个月总结出的24万字Java面试笔记

    最近收到一位粉丝的回馈! 这位粉丝已经成功入职阿里了小编很是羡慕啊! 今天就把这份30w字Java面试笔记给大家分享出来,说来也巧这份资料也是由一位阿里技术官整理出来的这算不算是"搬起石头砸 ...

随机推荐

  1. java中a=a+1和a+=1的区别

    我们先看一段代码: 1 byte b=2; b=b+1; System.out.println(b); 运行结果: 错误: 不兼容的类型: 从int转换到byte可能会有损失             ...

  2. Win32API起始处的mov edi, edi与用户空间InlineHook

    在x86平台上,无论是在调试器中跟到系统DLL中时,还是反汇编某个系统DLL时,经常会发现很多API的第一条汇编指令都是mov edi, edi.根据经验来讲,C函数的汇编形式,应该是首先push e ...

  3. 大神博客链接系列---C#SubSonic3.0搭建ORM

    一.C#框架 C#ORM框架: SubSonic3.0制作ORM--- http://www.cnblogs.com/EmptyFS/p/3659679.html

  4. A:点排序-poj

    A:点排序 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个点的坐标(x, y),在输入的n个点中,依次计算这些点到指定点的距离,并按照距离进行从小到大排序,并且输出点的坐标 ...

  5. 关于Unity里动态加载图片

    Resources.Load 使用该方法可以动态加载资源 过程: 1.首先需要在Project面板里创建一个名为Resources的文件夹(名字必须是这个 不能写错啊) 2.把要加载的游戏对象放到该目 ...

  6. iOS 图片本地存储、本地获取、本地删除

    在iOS开发中.经常用到图片的本地化. iOS 图片本地存储.本地获取.本地删除,可以通过以下类方法实现. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: ...

  7. dp资源分配问题

    noip考试中dp中的资源分配问题是一大重点(不定时更新) 以下是一些例题 1.乘积最大 //Gang #include<iostream> #include<cstring> ...

  8. O(N^2)最长上升子序列

    //最长上升子序列o(N^2)可以不连续的子序列, //状态为maxlen[i]表示以a[i]为终点最大上升子序列长度 #include<iostream> #include<cst ...

  9. POJ3211--分类01背包

    Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9700 Accepted: 3110 Desc ...

  10. redis秒杀

    用Redis轻松实现秒杀系统 秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招, ...