Mybatis简介

Mybatis通过xml或注解的方式将要执行的statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

Mybatis框架执行原理

执行原理图分析

1.       mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2.       通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3.       由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4.       mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5.       Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mappedstatement的id。

6.       Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7.       Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

使用Mybatis框架开发

1.   配置全局配置文件

全局配置文件:

SqlMapConfig.xml(名称不是固定的)

配置的内容包括:

数据库运行环境(与spring整合后在spring的配置文件中进行配置)

Mapper映射文件

2.   创建po类(即持久层)

3.   配置mapper映射文件

1.     设定命名空间

<mapper namespace="test">

namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址

2.     编写sql语句

1.      根据用户id查询一条记录(返回单条记录)

<select id="findUserById"parameterType="int" resultType="cn.itcast.mybatis.po.User">

SELECT * FROM USER WHERE id = #{id}

</select>

select标签表示sql查询,内容会封装到Mapped Statement中。

可以将这个select标签称为一个Statement

id:Statement的id,用于标识select中定义的 sql,id是在同一个命名空间中不允许重复

#{}:表示一个占位符,避免sql注入

parameterType:表示输入参数的类型

resultType:表示输出 结果集单条记录映射的java对象类型,select查询的字段名和resultType中属性名一致,才能映射成功。

#{value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用#{}占位符,变量名可以使用value或其它的名称

2.      查询用户列表(返回list集合)

<select id="findUserList"parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User" >

SELECT * FROM USER WHERE username LIKE '%${value}%'

</select>

不管结果集查询一条还是多条,resultType指定结果集单条记录映射的java对象类型

${}:表示sql拼接,相当于sql字符串拼接,无法避免sql注入

${value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用${}拼接符,变量名必须使用value

${value}直接将value获取到拼接在sql中,value值不加任何修饰

Mybatis应用

1.   查询

1.      编写mapper.xml映射文件,和全局配置文件

2.      加载配置

//加载配置文件

Stringresource = "SqlMapConfig.xml";

InputStreaminputStream = Resources.getResourceAsStream(resource);

//根据mytais的配置创建SqlSessionFactory

SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//根据SqlSessionFactory创建SqlSession

SqlSessionsqlSession = sqlSessionFactory.openSession();

3.      调用sql语句查询数据库

1.      查询单条数据

Useruser = sqlSession.selectOne("test.findUserById", 10);

通过sqlSession查询用户信息(发起数据库操作)

第一个参数statement:指定mapper映射文件中statement的id,指定时需要前边加上statement所属的命名空间

第二个参数parameter,指定输入参数

selectOne返回的是单条记录,如果select返回多条记录(list集合),使用selectOne会报错

根据映射文件中的resultType指定输出类型

2.      查询数据集合

List<User>list = sqlSession.selectList("test.findUserList", "张");

selectList表示查询一个结果集(可以是一条或多条)

2.   添加

1.      编写mapper.xml映射文件,和全局配置文件

在mapper.xml加上用于添加数据的sql语句

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

insert into user(username,birthday,sex,address,detail,score)

values(#{username},#{birthday},#{sex},#{address},#{detail},#{score})

</insert>

2.      加载配置

3.      调用sql语句将数据添加到数据库

User user = new User();

user.setUsername("小赵");

user.setScore(98.9f);

user.setAddress("郑州");

user.setBirthday(new Date());

sqlSession.insert("test.insertUser", user);

3.   删除和更新

删除

<delete id="deleteUser"parameterType="int">

deletefrom user where id=#{id}

</delete>

sqlSession.delete("test.deleteUser", 91);

更新

<update id="updateUser"parameterType="cn.itcast.mybatis.po.User">

updateuser set username=#{username},birthday=#{birthday},sex=#{sex}  where id=#{id}

</update>

User user = new User();

user.setId(92);//更新的主键

user.setUsername("老张");

user.setBirthday(new Date());

sqlSession.update("test.updateUser", user);

添加数据时主键生成问题

对于新增的记录,需要将主键返回到pojo中,就可以从pojo中获取新添加的记录id。

实际应用中有两种常用的主键,自增主键和uuid主键

自增主键和uuid主键生成时机有区别

自增主键在insert语句执行后生成的

Uuid主键在insert语句执行前生成的

1.    Mysql自增主键获取

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User"

<selectKey keyProperty="id" order="AFTER"resultType="java.lang.Integer">

select LAST_INSERT_ID()

</selectKey>

insert into user(username,birthday,sex,address,detail,score)

values(#{username},#{birthday},#{sex},#{address},#{detail},#{score})

</insert>

keyProperty:将主键设置到pojo中哪个属性中

order:selectKey中sql执行的时机

resultType:selectKey中sql执行的结果类型

LAST_INSERT_ID:在添加数据后获取自增主键值

2.   Mysql uuid主键获取

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

<selectKey keyProperty="id"order="BEFORE" resultType="java.lang.String">

select uuid()

</selectKey>

insert into user(id,username,birthday,sex,address,detail,score)

values(#{id},#{username},#{birthday},#{sex},#{address},#{detail},#{score})

</insert>

keyProperty:将主键设置到pojo中哪个属性中

order:selectKey中sql执行的时机

resultType:selectKey中sql执行的结果类型

不用selectKey,也可以在调用SqlSession.insert()前,在输入参数设置id值 (生成uuid,设置到user的id属性中)

3.   oracle主键获取

<selectKey keyProperty="id"order="BEFORE" resultType="java.lang.String">

Select 序列名.next.val from dual

</selectKey>

Mybatis框架开发流程总结

1.     编写SqlMapConfig.xml全局配置文件(重点配置mapper)

2.     编写mapper.xml映射文件(重点)

定义statement(包括sql语句,输入和输出参数类型)

在SqlMapConfig.xml全局配置文件配置mapper.xml(此配置可以通过规则省略)

3.     编写程序(重点)

获取SqlSessionFactory

通过SqlSessionFactory获取SqlSession

通过SqlSession操作数据库(调用mapper.xml映射文件中定义的statement)

得到statement的输出映射java对象

Sqlsession

SqlSessionFactoryBuilder:用于创建SqlSessionFactory,将SqlSessionFactoryBuilder当成工具类使用。

SqlSessionFactory:会话工厂,用于创建SqlSession,SqlSessionFactory一旦创建成功,不用再次创建,建议单例模式使用工厂。和spring整合后,由spring来管理SqlSessionFactory,在spring容器中SqlSessionFactory是一个单例对象

SqlSession:(重点)是一个面向用户的接口,通过SqlSessionFactory获取SqlSession,每次数据操作都需要创建新的SqlSession,SqlSession 线程不安全,最佳应用场合是方法体内,在方法中定义一个SqlSession局部变量。

Mybatis的动态代理

Mapper动态代理:程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。代理对象方法是可以调用的。

 

Mybatis官方建议:将dao接口叫做mapper。

 

目标:通过一些规则让mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象

mybatis将以下代码自动在代理对象实现:

Useruser = sqlSession.selectOne("test.findUserById", id);

 

开发流程:

1.   编写mapper.xml映射文件

mapper.xml映射文件命名规则:XXXXMapper.xml

<select id="findUserById"parameterType="int"

resultType = "cn.itcast.mybatis.po.User">

SELECT * FROM USER WHERE id = #{id}

</select>

为了让mapper.xml和mapper.java对应起来,将mapper.xml中的namespace设置为mapper.java的全限定名。

<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

2.   开发mapper.java接口

mapper.java接口文件命名规则:XXXXMapper.java

publicinterface UserMapper {

public User findUserById(intid) throws Exception;

public List<User> findUserList(String username)throws Exception;

}

Mybatis生成代理对象时,根据statement的标签决定调用 SqlSession的方法(select、insert、update..)

根据上边接口方法返回值 类型来决定 是调用 selectOne还是selectList,如果返回的是单个对象,动态代理调用selectOne(),如果返回的是集合对象,动态代理调用selectList()。

使用动态代理必须实现的要点

在mapper.xml中将namespace设置为mapper.java的全限定名

将mapper.java接口的方法名和mapper.xml中statement的id保持一致。

将mapper.java接口的方法输入参数类型和mapper.xml中statement的parameterType保持一致

将mapper.java接口的方法输出 结果类型和mapper.xml中statement的resultType保持一致

SSM框架02--mybatis(1)相关推荐

  1. JavaWeb学习之路——SSM框架之Mybatis(三)

    数据库配置和相关类创建看上篇:JavaWeb学习之路--SSM框架之Mybatis(二) https://blog.csdn.net/kuishao1314aa/article/details/832 ...

  2. SSM框架——使用MyBatis Generator自动创建代码

    SSM框架--使用MyBatis Generator自动创建代码 这是通过命令行, 不用ide插件. 若在IDEA中通过插件generator, 还可以参考另一篇: IDEA搭建Spring+Spri ...

  3. SSM框架-使用MyBatis Generator自动创建代码

    参考:http://blog.csdn.net/zhshulin/article/details/23912615 SSM搭建的时候用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半 ...

  4. JavaWeb学习之路——SSM框架之Mybatis(二)

    1.简介: 框架: 是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义.它是一个半 ...

  5. SSM框架使用mybatis反向生成实体类、dao和映射文件

    2.1反向生成配置文件generatorConfig.xml 文件命名generatorConfig.xml为放在resources里 <generatorConfiguration> & ...

  6. SSM框架学习----Mybatis(2)

    Mybatis框架学习--中 Mybatis框架学习----(2) 1. Mybatis的自定义分析 1. 第一步 2. 第二步 3. 第三步 4. 第四步 5. 第五步 2. Mybatis实现CR ...

  7. SSM框架-实现Mybatis分页功能-foreknow_cms

    ##分页处理 分页 1.前台分页 2.数据库(后台)分页 3.存储过程 Orade (Rownum) Mysql(limit) sqlservier(Top N) 第一步 : 要在mybatis 核心 ...

  8. SSM框架专题-MyBatis框架老杜版从零入门笔记(下)

    七.MyBatis参数处理 7.1 单个简单参数 parameterType表示传入参数的类型,官方文档有很多别名可以参考 <insert id="insertStu" pa ...

  9. SSM框架之Mybatis同时传入多个对象及普通参数

    当传入多个文件时,mapper接口文件的方法参数要使用@param("xx")注释. 例子: mapper: //Student是对象,age是String类型. int getP ...

  10. mysql如何导入myeclisp中_MyEclipse搭建SSM框架(Spring+MyBatis+SpringMVC)

    如何使用CSS绘制一个响应式的矩形 背景: 最近因为需要用到绘制类似九宫格的需求,所以研究了一下响应式矩形的实现方案. 有如下几种方案: 使用js来设置元素的高度 使用vw单位  div {width ...

最新文章

  1. 分离硬件和代码、稳定 API,PyTorch Lightning 1.0.0 版本正式发布
  2. 虚拟化--YESLAB DC Vphere5 上课PDF
  3. python实现选择排序
  4. FPGA之道(39)HDL的命名规则
  5. python第三方库numpy-谁能介绍下Python生态中的第三方库NumPy
  6. SAP UI5 Tools 使用简介
  7. python可变序列_python序列中可变数据类型有什么
  8. java uuid_Java UUID
  9. 利用 Flask 动态展示 Pyecharts 图表数据的几种方法
  10. matlab机械臂工作空间代码_轻型协作机械臂运动学及工作空间分析
  11. 屏幕时代,开发者如何撬动亿级受众,获得用户增长
  12. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2)
  13. Java多线程总结之线程安全队列Queue
  14. html5 dom 结构,HTML5 DOM扩展
  15. python雨课堂课后答案_有没有免费查网课雨课堂答案的公众号或者软件啥的
  16. IDEA 自定义主题
  17. discord android .apk,Discord语音交流app
  18. UI 移动端设计尺寸
  19. 使用DBeaver连接mysql报Access denied for user ‘test‘@‘%‘ to database
  20. 采用FPGA开发高清相机sensorISP芯片要点分析

热门文章

  1. 实习日志_护理实习日志
  2. raid5用户mbr还是gpt_系统硬盘gpt转换的操作方法
  3. Node.js:简单的node服务器ajax请求
  4. 基本数据类型与字符串之间的转换
  5. cartographer探秘第四章之代码解析(五) --- 后端优化 --- 闭环约束1 --- PrecomputationGrid2D
  6. 统计学系方法4.1补充理解
  7. 火灾检测、人流量统计、安全帽检测,飞桨开源一键运行的产业案例教程
  8. 全面综述:基于3D骨架的深度学习行为识别方法
  9. Ubuntu18.04下安装配置darknet
  10. linux 查看内存条详情命令