Mybatis自学笔记
MyBatis 学习笔记第一天
MyBatis底层也是封装的JDBC
Apache出品
Mybatis和Hibernate应用场景不同,都需要学
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
1、Mybatis的介绍
2、Mybatis的入门
a)使用jdbc操作数据库存在的问题
b)Mybatis的架构
c)Mybatis的入门程序
3、Dao的开发方法
原始dao的开发方法
动态代理
4、Mybatis核心配置文件
补充
- pojo:不按MVC分层,只是Java Bean有一些属性,还有get set 方法
- domain :不按MVC分层,只是Java Bean有一些属性,还有get set 方法
- po:用在持久层,还可以再增加或者修改的时候,从页面直接传入action 中,他里面的Java bean类名等于表名,属性名等于表的字段名,还有对应的get set方法,
- vo:全称,表现层对象,主要用于从页面传过来的各种参数,好处是扩展性强
- bo:用在service层,现在企业基本不用
这些po vo bo pojo可以用在各种层面吗?
语法不报错,po用在表现层,vo用在持久层不报错,因为都是普通的Java bean
但是在企业最好不要混着用,因为这些都是设计的原则,混着用比较乱,不利于代码维护
vo一定要用在表现层
-
jdbc问题总结如下:
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
-
Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
-
使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
-
对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
Hibernate比较重,SQL都不用写了
Mybatis需要我们去写sql
mybatis核心配置文件SqlMapConfig.xml,作用是我们通过会话工厂SqlSessionFac tory加载核心配置文件里面的内容,通过核心配置内容来创建会话sqlSession,拿到会话可以用会话对象.会话里面的方法(增删改查),它去调用映射文件mapper.xml里面的sql语句来执行SQL。在mybatis内部有个执行器Executor这个对象,在mybatis内部还有内部封装对象Mapped Statement,作用是将映射里面的sql语句输入参数类型、返回结果集类型封装成Java对象,输入参数类型也叫输入映射可以有map、基本类型、pojo。返回结果集类型map、基本类型、pojo、list。
-
mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文 件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
-
通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
-
由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
-
mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
-
Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
-
Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
-
Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
步骤
第一步:导包
我们需要导入核心包和依赖包。。。。。。。所有的包都不许替换的
第二步:创建核心配置文件SqlMapConfig.xml
第三步:
#{}和${}区别
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
动态代理Dao实现方法——mybatis特有的写起来非常爽,只写接口,不写实现类,mybatis自动生成
主要就是写接口我们要注意四点要求
测试一下,我们的接口
到这开始运行的话
运行出错,是因为我们没有把映射文件写入核心类
Mybatis加载Mapper配置的四种方式,下面用了三种
使用包扫描的方式引入
核心配置文件
mybatis支持别名
别名 |
映射的类型 |
_byte |
byte |
_long |
long |
_short |
short |
_int |
int |
_integer |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
string |
String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
Date |
decimal |
BigDecimal |
bigdecimal |
BigDecimal |
map |
Map |
也可以自定义别名
总结
1、首先介绍mybatis是什么?
mybatis是持久层框架,跟数据库交互完成增删改查。
-
jdbc频繁创建释放资源 mybatis用连接池,
-
jdbc把传参、sql,解析结果集都写死了,在我们mybatis映射文件中很好的解决了,传参、sql、结果集都在里面,完美解决了jdbc缺陷
2、元素Dao实现(需要接口和实现类)
3、代理方式(只需要接口)
规则:
mapper接口代理实现的编写规则
1、映射文件中namespace要等于接口的全路径
2、映射文件中SQL语句id要等于接口方法名称
3、映射文件中传入参数类型要等于接口方法的传入参数类型
4、映射文件中返回结果集类型要等于接口方法的返回值类型
4、#{}占位符,占位
如果传入的是基本类型,那么#{}中变量名称可以随意些
如果传入的参数是pojo类型,那么#{}的名称必须是属性.属性.属性
5、${}拼接符、字符串原样输出
如果传入的是基本类型,变量名必须是value,
如果传入的参数是pojo类型,那么#{}的名称必须是属性.属性.属性
注意:使用拼接符,有可能造成sql注入,在页面输入的时候可以加入校验,不可输入SQL关键字,不许输入空格
6、映射文件中
传入参数,通过parameterType指定
输出结果集类型通过resoultType指定
7、Hibernate和mybatis区别
Hibernate是一个标准的orm框架,比较重量级,学习成本高
优点:高度封装,不用写sql,开发时时间短,会减少开发周期
缺点:sql语句自动生成无法优化
应用场景,OA(办公自动化系统)、 erp(企业流程系统) 、政府项目
用户量不大,并发量小的系统
mybatis 不是一个orm框架,是对jdbc一个轻量级封装,学习成本比较简单
优点:学习成本低,sql语句可以优化,执行效率高,速度快
缺点 :,编码量较大,会拖慢开发周期
应用场景:互联网开发项目,比如电商,p2p 总的来说用户量大,并发高的项目