MyBatis基本工作原理
Application是程序员开发的Java代码,蓝色为MyBatis框架.
API是MyBatis提供的增删改查等功能接口.
老式SQL写法我们在Dao中写SQL: SELECT * FROM user WHERE user_name = ?;
而在MyBatis中没有完全封装JDBC,还需要预先写一下SQL语句,不过不用像之前那样大篇幅以及多设置了:(进行了简化)
看一下老式的Dao层写法: 通过用户ID查询用户返回用户实例:
///// * 通过用户ID查询用户实例返回给showUser
public Customers queryCustomerByID(long cid) throws ClassNotFoundException, SQLException {
Customers customer = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from Customers where customer_id = ?";
try {
conn = JDBCUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.setLong(1, cid);
rs = ps.executeQuery();
while (rs.next()) { if (customer == null) {
customer = new Customers(
rs.getLong(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getLong(6),
rs.getDouble(7));
}
}
} finally {
JDBCUtil.close(rs, ps, null);
} return customer; }/////* End queryCustomerByID
是不是很繁琐,尽管使用了有些日子,有些怀念,但是这样的冗余代码既然可以使用框架封装简化,为什么不用呢?
下面是在MyBatis中同样根据用户ID查用户返回用户实例: (customers.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="CustomersDao">
<!-- CIns为CustomerInstance缩写,即用户实例 -->
<select id="queryCInsByCid" parameterType="long" resultType="com.ykmimi.mybatis.entity.Customers">
select * from Customers where customer_id = #{cid}
</select>
</mapper>
mapper为映射,namespace是命名空间,当我们调用时就像调用某个Dao一样.
而select的 id 为 queryCInsByCid ,接收类型为long, 返回类型为Customers实例 (resultType指向了实体包中的Customers实体类)
假如这个程序里还有其他Dao层(老式写法),如: FoodsDao, PriceDao,那么只是将这些Dao类给转换了模式,变为了 namespace .这样的话好理解!
而命名空间mapper中包含的select或其他标签的 id ,即像是这个"Dao类中存在的一个方法" ,只不过简化了.
看图片知道,MyBatis进行了老式Dao层写法返回Customers实例的封装.而我们需要设置:
namespace (相当于Dao层名),
及内里功能标签的 id (相当于方法名),
parameterType (相当于方法参数类型设置) ,
resultType (相当于方法返回类型,只不过是全类名写法).
那么这个SQL语句设置好后,程序运行,就会加载到JDBC,从而可以对数据库进行操作.
两个xml文件(看图),可以自定义名称,含有SQL语句的映射配置文件需在MyBatis配置文件中进行注册.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- <typeAliases> <package name="com.xm.bean"/> </typeAliases> <properties
resource=""></properties> -->
<!-- 配置mybatis运行环境 --> <environments default="cybatis">
<environment id="cybatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC" />
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/ordersystem" />
<property name="username" value="hr" />
<property name="password" value="system" />
</dataSource>
</environment> </environments> <!-- 配置 mapper文件 -->
<mappers>
<mapper resource="com/ykmimi/mybatis/mapper/customers.xml" />
</mappers> </configuration>
最后,ORM表示Object, Relationship, Mapping
如图所示,
Application是Java程序代码,其中数据是对象类型
Relationship是关系型数据库/表
Mapping是框架的功能表示映射
那么,空口无凭,写一个小程序出来,看看MyBatis的作用吧!见下篇.
MyBatis基本工作原理的更多相关文章
- Mybatis之工作原理
1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...
- 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...
- Hibernate和Mybatis的工作原理以及区别
一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...
- mybatis的工作原理
MyBatis的框架架构 看到Mybatis的框架图,可以清晰的看到Mybatis的整体核心对象,我更喜欢用自己的图来表达Mybatis的整个的执行流程.如下图所示: 原理详解: MyBatis应用程 ...
- MyBatis工作原理
Mybatis工作原理: 我们的应用程序通过mybatis提供的api,增删改查方法来访问数据库,api底层调用了jdbc ,只不过mybatis对jdbc的封装是不完全封装,里面的sql语句需要我们 ...
- 面试官:你分析过mybatis工作原理吗?
Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...
- mybatis——mybatis打印sql 接口工作原理
https://blog.csdn.net/Lxinccode/article/details/79218566 接口工作原理: Dao接口即Mapper接口.接口的全限名,就是映射文件中的names ...
- 从源码角度分析 MyBatis 工作原理
一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示例来进行讲解.完整示例源码地址 1.1. 数据库准备 ...
- 深入理解Mybatis技术与原理
目录 第1章 Mybatis简介 1.1 传统的JDBC编程 1.2 ORM模型 1.4 MyBatis 1.5 什么时候用MyBatis 第2章 MyBatis入门 2.2 MyBatis构成 2. ...
随机推荐
- sencha touch 入门系列 (一)sencha touch 简介
参考链接:http://mobile.51cto.com/others-278381.htm Sencha touch 是基于JavaScript编写的Ajax框架ExtJS,将现有的ExtJS整合J ...
- ntpdate自动对准时间的脚本
author:headsen chen date: 2018-10-09 19:50:15 #!/bin/bash yum -y install ntpdate /usr/sbin/ntpdate ...
- 【BZOJ3518】点组计数 欧拉函数
[BZOJ3518]点组计数 Description 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c ...
- Android中textView自动识别电话号码,电子邮件,网址(自动加连接)
extends:http://blog.csdn.net/wx_962464/article/details/8471195 其实这个是很简单的,在android中已经为我们实现了,但是我估计很多人都 ...
- Android - XML序列化
1.xml文件的序列化:采用XmlSerializer来实现XML文件的序列化.相比传统方式,更高效安全 MainActivity.java package com.example.test_buil ...
- Vue 学习顺序
起步: 1.扎实的 JavaScript / HTML / CSS 基本功,ES6 最好过一遍 2.通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script&g ...
- Linux设置程序开机启动-tomcat开机启动
假设我有一个tomcat应用需要开机启动. 前提你的JAVA环境变量已经配置好没有问题,检测方法如图 然后找到tomcat的目录,我的目录是 /home/yuqing_4.0/tomcat_share ...
- Python大数据:外部数据获取(网页抓取)
import urllib2 as url import cookielib,StringIO,gzip,json import pandas as pd import numpy as np #定义 ...
- es navi map+++++++nginx logs-parser
http://www.cnblogs.com/ahaii/p/7410421.html [2017-12-17T00:01:03+08:00] ["GET /user/comm/login? ...
- 关于Controller层返回JSON字符串
/** * 导入jackson包. * @param pn * @return */ @RequestMapping("/emps") @ResponseBody public M ...