Mybatis介绍

1、Mybatis是什么?

mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。

Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。

Mybatis会将输入参数、输出结果进行映射。

 

Mybatis的框架原理

 

 

Mybatis介绍

Mybatis介绍

2、为什么要用Mybatis?

mybatis与hibernate的区别及各自应用场景

(1)Mybatis技术特点:

通过直接编写SQL语句,可以直接对SQL进行性能的优化。

学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手。

由于直接编写SQL语句,所以灵活多变,代码维护性更好。

不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。

(2)Hibernate技术特点:

标准的orm框架,程序员不需要编写SQL语句。

具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。

学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。

程序员不能自主的去进行SQL性能优化。

(3)Mybatis应用场景:

需求多变的互联网项目,例如电商项目。

(4)Hibernate应用场景:

需求明确、业务固定的项目,例如OA项目、ERP项目等。

 

3、Mybatis怎么用??

笔记03_P188

例题:mybatis_day01

 

入门程序:

3.1、需求

对订单商品案例中的用户表进行增删改查操作

根据用户ID查询用户信息

根据用户名称模糊查询用户列表

添加用户

删除用户

修改用户

 

3.2、环境准备

Jdk:1.7

Ide:idea xxxx

Mybatis:3.2.7

数据库:MySQL 5X

 

mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases

mybatis-3.2.7

 

Mybatis介绍

数据库和用户表:

 

Mybatis介绍

Mybatis介绍

 

3.3、工程搭建

第一步:创建java工程

Mybatis介绍

 

第二步:加入jar包

加入以下四部分jar包,其中junit的jar包,是非必须的。

Mybatis核心包

Mybatis介绍

 

Mybatis依赖包

Mybatis介绍

 

MySQL驱动包

Mybatis介绍

 

Junit单元测试包(单元测试需要的包)

 

 

Mybatis介绍

Mybatis介绍

第三步:添加log4j.properties文件

Mybatis使用的日志包是log4j的,所以需要添加log4j.properties。

日志级别在开发阶段设置成DEBUG在生产阶段设置成INFO或者ERROR

 

Mybatis介绍

3.4、编程步骤

(1)创建PO类,根据需求创建;

(2)创建全局配置文件SqlMapConfig.xml;

(3)编写映射文件;

(4)加载映射文件,在SqlMapConfig.xml中进行加载;

(5)编写测试程序,即编写Java代码,连接并操作数据库。

思路:

①读取配置文件;

②通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

③通过SqlSessionFactory创建SqlSession。l

④调用SqlSession的操作数据库方法。

⑤关闭SqlSession。

 

3.5、代码实现

(1)创建po类

Mybatis介绍

 

(2)创建全局配置文件

在config目录下,创建SqlMapConfig.xml文件,该名称不是固定不变的。

Mybatis介绍

 

(3)需求开发

需求一、根据用户ID查询用户信息

映射文件

在config目录下,创建User.xml(这种命名规范是由ibatis遗留下来)

Mybatis介绍

 

在全局配置文件中加载映射文件

Mybatis介绍

 

测试代码

MybatisFirst.class类中:

 

Mybatis介绍

需求二、根据用户名称模糊查询用户列表

需求三、添加用户

需求四、删除用户

需求五、修改用户

 

3.6、小结

(1)#{}和${}

#{}表示占位符?,#{}接收简单类型的参数时,里面的名称可以任意

${}表示拼接符,${}接收简单类型的参数时,里面的名称必须是value

${}里面的值会原样输出,不加解析(如果该参数值是字符串,有不会添加引号)

${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名

(2)parameterType和resultType

parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。

resultType指定输出结果的java类型(是单条记录的java类型)

(3)selectOne和selectList

selectOne查询单个对象

selectList查询集合对象