本文内容转自传智播客笔记

1. 问题总结 

1). 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。

设想:使用数据库连接池管理数据库连接。

2). 将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。

设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

3). 向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

设想:将sql语句及占位符号和参数全部配置在xml中。

4). 从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。

设想:将查询的结果集,自动映射成java对象。

2. mybatis主要流程:

1). SqlSessionFactory(会话工厂),根据配置文件创建工厂       作用:创建SqlSession

2). SqlSession(会话),是一个接口,面向用户(程序员)的接口     作用:操作数据库(发出sql增、删、改、查)

3). Executor(执行器),是一个接口(基本执行器、缓存执行器)     作用:SqlSession内部通过执行器操作数据库

4). mapped statement(底层封装对象)      作用:对操作数据库存储封装,包括 sql语句,输入参数、输出结果类型

输入参数类型: java简单类型,hashmap,pojo自定义

输出结果类型:java简单类型,hashmap,pojo自定义

3. 映射文件:

映射文件命名:User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

映射文件中配置sql语句:

4. 加载配置文件(一般项目中使用包扫描的方式)

5. 模糊查询:传入参数中加上%(例如传入参数为:"%"+name+"%"),在代码中加入%的,而不是在mybatis配置文件中增加。配置文件中使用#{}。

6. 插入:

    

7. 自增主键返回(mysql):

8. 删除:

    

9. 更新:

    

9. 小结:

    parameterType:在映射文件中通过parameterType指定输入参数的类型。

    resultType:在映射文件中通过resultType指定输出结果的类型。

 #{}和${}:

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。#{}接收pojo对象值,通过OGNL读取对象中的属性值,

通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。${}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。${}接收pojo对象值,通过

OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

10. selectOne和selectList:

selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList

查询多条记录,不能使用selectOne,否则会报错。

11. mybatis和hibernate本质区别和应用场景:

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。

应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:适用与需求变化较多的项目,比如:互联网项目。

企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

12. mybatis开发dao的方法:

SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理

SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

SqlSessionFactory:通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,

                                       使用单例模式管理sqlSessionFactory。

SqlSession:一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。 SqlSession是线程不安全的,

在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。SqlSession最佳应用场合在方法体内,定义成局部变量使用。

13. 原始dao开发方法:

思路:程序员需要写dao接口和dao实现类。需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

问题:

a). dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

b). 调用sqlsession方法时将statement的id硬编码了

c). 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

14. mapper代理方法:

思路: 程序员还需要编写mapper.xml映射文件。编写mapper接口时需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。程序员只需要mapper接口(相当 于dao接口)

开发规范:

a). 在mapper.xml中namespace等于mapper接口地址

      b). mapper.java接口中的方法名和mapper.xml中statement的id一致

      c). mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

      d). mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

一些问题总结:

代理对象内部调用selectOne或selectList:如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

mapper接口方法参数只能有一个是否影响系统开发,系统是否不利于扩展维护?

       系统框架中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

15. mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:

 1). properties属性:将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。

不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX

                                    MyBatis 将按照下面的顺序来加载属性:在 properties 元素体内定义的属性首先被读取。然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

                                                                                  最后读取parameterType传递的属性,它会覆盖已读取的同名属性。

2). settings全局参数配置:mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。。全局参数将会影响mybatis的运行行为。

 3). typeAliases(别名)重点:mybatis有一些默认支持的别名。如:int ,byte,short ,long 等。

单个别名的定义:

批量别名的定义:

      4). typeHandlers(类型处理器):mybatis中通过typeHandlers完成jdbc类型和java类型的转换。通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.

      5). mappers(映射配置):

           a). 通过resource加载单个映射文件

b). 通过mapper接口加载单个mapper

按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。

 c). 批量加载mapper(推荐使用)

16. 输入映射:通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型

17. 输出映射:

resultType:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。

只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

 resultMap:mybatis中使用resultMap完成高级输出结果映射。

1). resultMap使用方法:

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

a.定义resultMap

b.使用resultMap作为statement的输出映射类型

2).  resultMap使用步骤:

 a. 定义reusltMap

b. 使用resultMap作为statement的输出映射类型

     总结:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名

               和pojo属性名之间作一个映射关系。

18. 动态sql:mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

1). 对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。

2). sql片段:

引用sql片段:

3). foreach:向sql传递数组或List,mybatis使用foreach解析

例二:

mybatis 复习笔记01的更多相关文章

  1. mybatis 复习笔记03

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html 入门 1. 从 XML 中构建 SqlSessionFactory 每个基于 MyB ...

  2. mybatis 复习笔记02

    1. 一对一查询: 1). 实体类: 2). 定义resultMap <!-- 订单查询关联用户的resultMap 将整个查询的结果映射到cn.itcast.mybatis.po.Orders ...

  3. mybatis复习笔记(1):

    一.简介:什么是MyBatis 1.MyBatis是一款优秀的持久层框架,支持定制化SQL.存储过程以及高级映射.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis ...

  4. Spring 复习笔记01

    Spring 框架 1. core:整个Spring框架构建在Core核心模块上,它是整个框架的的基础. 2. AOP:AOP模块提供了一个轻便但功能强大强大的AOP框架,让我们可以以AOP的形式增强 ...

  5. Spring MVC 复习笔记01

    1. springmvc框架 1.1 什么是springmvc spring mvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合.spring mvc是一个 ...

  6. JAVA复习笔记01

    学了一学期的JAVA,临近期末,整理了一些JAVA考试中需要掌握的点,记录在这里. 1.编译多个JAVA文件,运行程序 (1) javac .java .java java Main (2) java ...

  7. Python复习笔记01

    (1)计算机常识 计算机:硬件(运算器,控制器,存储器,输入设备,输出设备)软件 (系统软件, 应用软件) 二进制 整数存储 文件单 位换算 1Byte = 8bit 1KB = 1024Byte 1 ...

  8. Servlet&JSP复习笔记 01

    1. Servlet 含义:服务器端的小程序,它只是服务器中的一部分. Servlet Little 标准:Sun公司制定的一种用来扩展Web服务器功能的组件规范. a. 扩展web服务器功能:扩展w ...

  9. mybatis学习笔记之基础复习(3)

    mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...

随机推荐

  1. Using Fast Weights to Attend to the Recent Past

    Ba, Jimmy, et al. "Using Fast Weights to Attend to the Recent Past." Advances In Neural In ...

  2. 第二百二十七节,jQuery EasyUI,ComboTree(树型下拉框)组件

    jQuery EasyUI,ComboTree(树型下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解EasyUI中ComboTree(树型下拉框)组件的使用方法,这个 ...

  3. http文件导出

    using (MemoryStream file = db.ExportExcel(model)) { context.Response.ContentType = "application ...

  4. vue生成图片验证码

    最近做项目接触Vue,前端生成验证码.原理其实很简单,首先是生成随机数,然后用canvas绘制. 网上有一些现成的资料,没必要重复造轮子,我是在他们基础上完善了父组件,简化了子组件的调用: ident ...

  5. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  6. webpack中引入的path[require('path')]是node.js内置的package,用来处理路径的。

    http://www.runoob.com/nodejs/nodejs-path-module.html

  7. ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...

  8. boost::archive::binary_iarchive

    #include <iostream> #include <string> #include <sstream> #include <vector> # ...

  9. 【BZOJ4624】农场种植 FFT

    [BZOJ4624]农场种植 Description 农夫约翰想要在一片巨大的土地上建造一个新的农场. 这块土地被抽象为个 R*C 的矩阵.土地中的每个方格都可以用来生产一种食物:谷物(G)或者是牲畜 ...

  10. XMLHttpRequest 对象 status 和statusText 属性对照表

    XMLHttpRequest 对象 status 和statusText 属性对照表 status statusText 说明 0** - 未被始化 1** - 请求收到,继续处理 100 Conti ...