用mybatis框架原理怎么写一个简单的转账

mybaites(1)
在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,接下来小编一一进行讲解,希望对小伙伴们有帮助,不足之处,还请多多指教。
什么是mybatis?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。简单来说,mybatis就是一个持久层的框架,mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需要的sql语句,mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。
接着,我们通过一张图,来了解一下mybatis的框架原理:
框架架构讲解:
a、加载配置文件:配置来源于两个地方,一个是配置文件,一个是java代码的注解,将sql的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
b、SQL解析:当api接口层接收到调用请求时,会接收到传入slq的id和传入对象(可以是map或者基本数据类型),mybatis会根据sql的id找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的sql语句和参数。
c、&SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
d、结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
mybatis入门程序解析
接着,小编结合demo来具体介绍一下,需求如下:
根据用户id查询用户信息;
根据用户名称模糊查询用户信息;
添加、删除、更新用户。
第一步、建立各种包和类,工程目录如下所示:
第二步、编写SqlMapConfig.xml中的内容,配置mybatis的运行环境,数据源,事务等。代码如下所示:
第三步、编写User.java中的内容,如下所示:
第四步、实现增删改查的功能,首先编写User.xml中的内容,如下所示:
第五步、编写具体的方法,如下所示:
mybatis的优缺点
a、易于上手和掌握。
b、sql写在xml里,便于统一管理和优化。
c、 解除sql与程序代码的耦合。
d、提供映射标签,支持对象与数据库的orm字段关系映射
e、提供对象关系映射标签,支持对象关系组建维护
f、提供xml标签,支持编写动态sql。
a、 sql工作量很大,尤其是字段多、关联表多时,更是如此。
b、sql依赖于数据库,导致数据库移植性差。
c、 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
d、DAO层过于简单,对象组装的工作量较大。
e、 缓存使用不当,容易产生脏数据。
mybatis和hibernate的对比
相同点:Hibernate和mybatis都可以是通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由
SessionFactroy生成Session,最后由Session来开启执行事物和SQL语句,其中SessionFactoryBuider、
SessionFactory、Session的生命周期都是差不多的。
mybatis:小巧、方便、高效、简单、直接、半自动;
hibernate:强大、方便、高效、复杂、绕弯子、全自动;
a、入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很多的SQL使用经验,对于没有
那么高的对象模型要求的项目来说,堪称perfect。
b、 可以进行更为细致的SQL优化,可以减少查询字段。
c、 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是
要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
d、 二级缓存机制不佳。
& & & &hibernate:
& & & &a、功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的
封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
& & & &b、有更好的二级缓存机制,可以使用第三方缓存。
& & & &c、缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡
,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
& & & &举个形象的比喻:
& & & & mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
& & & & hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。
小编寄语:该博文,小编主要简单的介绍了mybatis的基本知识,包括一个简单的增删改查的demo,mybatis的
优缺点,以及hibernate和mybatis的对比,她们之间的相同点和不同点,mybatis简单来说,就是一个持久层的框架,
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需要的sql语句,mybatis可以
将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象
在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,接下来小编一一进行讲解,希望对小伙伴们有帮助,不足之处,还请多多指教。
什么是mybatis?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。简单来说,mybatis就是一个持久层的框架,mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需要的sql语句,mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。
接着,我们通过一张图,来了解一下mybatis的框架原理:
框架架构讲解:
a、加载配置文件:配置来源于两个地方,一个是配置文件,一个是java代码的注解,将sql的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
b、SQL解析:当api接口层接收到调用请求时,会接收到传入slq的id和传入对象(可以是map或者基本数据类型),mybatis会根据sql的id找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的sql语句和参数。
c、&SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
d、结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
mybatis入门程序解析
接着,小编结合demo来具体介绍一下,需求如下:
根据用户id查询用户信息;
根据用户名称模糊查询用户信息;
添加、删除、更新用户。
第一步、建立各种包和类,工程目录如下所示:
第二步、编写SqlMapConfig.xml中的内容,配置mybatis的运行环境,数据源,事务等。代码如下所示:
第三步、编写User.java中的内容,如下所示:
第四步、实现增删改查的功能,首先编写User.xml中的内容,如下所示:
第五步、编写具体的方法,如下所示:
mybatis的优缺点
a、易于上手和掌握。
b、sql写在xml里,便于统一管理和优化。
c、 解除sql与程序代码的耦合。
d、提供映射标签,支持对象与数据库的orm字段关系映射
e、提供对象关系映射标签,支持对象关系组建维护
f、提供xml标签,支持编写动态sql。
a、 sql工作量很大,尤其是字段多、关联表多时,更是如此。
b、sql依赖于数据库,导致数据库移植性差。
c、 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
d、DAO层过于简单,对象组装的工作量较大。
e、 缓存使用不当,容易产生脏数据。
mybatis和hibernate的对比
相同点:Hibernate和mybatis都可以是通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由
SessionFactroy生成Session,最后由Session来开启执行事物和SQL语句,其中SessionFactoryBuider、
SessionFactory、Session的生命周期都是差不多的。
mybatis:小巧、方便、高效、简单、直接、半自动;
hibernate:强大、方便、高效、复杂、绕弯子、全自动;
a、入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很多的SQL使用经验,对于没有
那么高的对象模型要求的项目来说,堪称perfect。
b、 可以进行更为细致的SQL优化,可以减少查询字段。
c、 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是
要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
d、 二级缓存机制不佳。
& & & &hibernate:
& & & &a、功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的
封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
& & & &b、有更好的二级缓存机制,可以使用第三方缓存。
& & & &c、缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡
,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
& & & &举个形象的比喻:
& & & & mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
& & & & hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。
小编寄语:该博文,小编主要简单的介绍了mybatis的基本知识,包括一个简单的增删改查的demo,mybatis的
优缺点,以及hibernate和mybatis的对比,她们之间的相同点和不同点,mybatis简单来说,就是一个持久层的框架,
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需要的sql语句,mybatis可以
将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:88693次
积分:1685
积分:1685
排名:千里之外
原创:69篇
转载:78篇
(2)(1)(5)(3)(2)(2)(4)(4)(12)(1)(2)(7)(1)(1)(5)(1)(3)(2)(3)(9)(16)(10)(5)(4)(9)(3)(30)拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38d280b072e6663a-ua98).
重新安装浏览器,或使用别的浏览器此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢?
这个问题在我的另一篇blogs中有专门的讲解,今天我主要是带着大家来探讨一下如何简单的使用Mybatis这个框架
可能有的朋友知道,Mybatis中是通过配置文件来实现这个的,这里面有很多的东西,我们就一点一点的讲吧
我们想要配置成功,首要的就是jar包,先从官网下载相应的jar包作为程序的支撑
有了jar包之后我么就来看看我们程序的主要的搭建
具体类的内容如下
Student & &Class
public class Student {
//学生编号
//学生名称
//学生性别
public Student() {
public Student(String sname, String sex) {
this.sname =
this.sex =
public Integer getSid() {
public void setSid(Integer sid) {
this.sid =
public String getSname() {
public void setSname(String sname) {
this.sname =
public String getSex() {
public void setSex(String sex) {
this.sex =
Grade &Class
public class Grade {
//班级编号
//班级名称
//班级描述
public Grade() {
public Grade(Integer gid, String gname, String gdesc) {
this.gid =
this.gname =
this.gdesc =
public Integer getGid() {
public void setGid(Integer gid) {
this.gid =
public String getGname() {
public void setGname(String gname) {
this.gname =
public String getGdesc() {
public void setGdesc(String gdesc) {
this.gdesc =
接下来我么就要配置我们的主要配置文件了,主要是指定我们要连接的数据库和具体连接操作
Configuration.xml
&?xml version="1.0" encoding="UTF-8" ?&
Copyright 2009-2012 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
&!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"&
&configuration&
&settings&
&setting name="useGeneratedKeys" value="false"/&
&setting name="useColumnLabel" value="true"/&
&/settings&
&typeAliases&
&typeAlias alias="UserAlias" type="org.apache.plex_property.User"/&
&/typeAliases& --&
&environments default="development"&
&environment id="development"&
&transactionManager type="JDBC"&
&property name="" value=""/&
&/transactionManager&
&dataSource type="UNPOOLED"&
&property name="driver" value="oracle.jdbc.OracleDriver"/&
&property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/&
&property name="username" value="practice"/&
&property name="password" value="123"/&
&/dataSource&
&/environment&
&/environments&
&mapper resource="config/Student.xml"/&
&/mappers&
&/configuration&
其实最主要的是如下图所示
到这里为止,所有的准备工作基本上就已经是完成了
接下来,使用Mybatis框架来实现我们的具体操作&
1.查询所有学生信息
&因为Mybatis是属于一种半自动化的框架技术所以呢sql是我们手动书写的,这也是Mybatis的一大特点
我们可以写出具体的实体配置文件
Student.xml
&?xml version="1.0" encoding="UTF-8"?&
Copyright 2009-2012 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
&!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"&
&mapper namespace="Student"&
&resultMap type="entity.Student" id="StudentResult"&
&id column="sid" jdbcType="INTEGER" property="sid"/&
&result column="sname" jdbcType="VARCHAR" property="sname"/&
&result column="sex" jdbcType="VARCHAR" property="sex"/&
&/resultMap&
&select id="selectAllStu"
resultMap="StudentResult"&
select * from Student
既然我们写了sql也指定了相应的实体类,那么我们到现在为止还并没有用到它,所以我们还需要在主配置文件中添加实体配置文件的引用
经过以上的步骤, 我们查询全部学生的配置文件基本上就已经完成了,现在我们来进行一道测试
* 1.1 查询所有的学生信息
public void OneTest() throws Exception{
//通过配置文件获取到数据库连接信息
Reader reader = Resources.getResourceAsReader("config/Configuration.xml");
//通过配置信息构建一个SessionFactory工厂
SqlSessionFactory sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
//通过SessionFaction打开一个回话通道
SqlSession session = sqlsessionfactory.openSession();
//调用配置文件中的sql语句
List&Student& list = session.selectList("Student.selectAllStu");
//遍历查询出来的结果
for (Student stu : list) {
System.out.println(stu.getSname());
session.close();
执行之后的语句如下
&这样我们使用Mybatis查询所有学生信息就完成了
2.带条件查询动态Sql拼接
*1.2 带条件查询信息(动态Sql拼接)
public void selectAllStuByWhere() throws Exception{
//通过配置文件获取到数据库连接信息
Reader reader = Resources.getResourceAsReader("config/Configuration.xml");
//通过配置信息构建一个SessionFactory工厂
SqlSessionFactory sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
//通过SessionFaction打开一个回话通道
SqlSession session = sqlsessionfactory.openSession();
//准备一个学生对象作为参数
Student student=new Student();
student.setSname("3");
//调用配置文件中的sql语句
List&Student& list = session.selectList("Student.selectAllStuByWhere",student);
//遍历查询出来的结果
for (Student stu : list) {
System.out.println(stu.getSname());
session.close();
小配置配置文件信息
&?xml version="1.0" encoding="UTF-8"?&
Copyright 2009-2012 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
&!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"&
&mapper namespace="Student"&
&resultMap type="entity.Student" id="StudentResult"&
&id column="sid" jdbcType="INTEGER" property="sid"/&
&result column="sname" jdbcType="VARCHAR" property="sname"/&
&result column="sex" jdbcType="VARCHAR" property="sex"/&
&/resultMap&
&!-- 简单查询所有信息 --&
&select id="selectAllStu"
resultMap="StudentResult"&
select sid,sname,sex,gid from Student
&!--动态拼接Sql
&select id="selectAllStuByWhere" parameterType="entity.Student"
resultMap="StudentResult"&
select sid,sname,sex,gid from Student where 1=1
&if test="sname!=null and !&&.equals(sname.trim())"&
and sname like '%'|| #{sname}|| '%' &!-- 模糊查询 --&
&!-- and sname = #{sname} --&
执行之后的结果就是
3.新增学生信息
* 1.3 新增学生信息
public void InsertStuInfo() throws Exception{
//通过配置文件获取配置信息
Reader reader = Resources.getResourceAsReader("config/Configuration.xml");
//构建一个SessionFactory,传入配置文件
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
//获取session
SqlSession session = factory.openSession();
//准备参数对象
Student stu=new Student();
stu.setSname("巴黎的雨季");
stu.setSex("男");
//调用添加方法
int count = session.insert("Student.InsertStuInfo", stu);
if(count&0){
System.out.println("添加成功");
System.out.println("添加失败");
session.close();
在小配置中增加一个节点
&!-- 新增学生信息 --&
&insert id="InsertStuInfo" parameterType="entity.Student" &
insert into Student values(SEQ_NUM.Nextval,#{sname},#{sex},1)
执行之后结果为
后续的删除和修改代码基本上和新增是一致的,只是调用的sql语句不同,所以后续我就不做详细的解释了,只将代码摆出来,详细大家都能够看得明白!!
4.删除学生信息根据id
* 1.4根据SID删除学生信息
public void DeleteStuBySid()throws Exception{
//通过配置文件获取配置信息
Reader reader = Resources.getResourceAsReader("config/Configuration.xml");
//构建一个SessionFactory,传入配置文件
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
//获取session
SqlSession session = factory.openSession();
//准备参数
int sid=2;
//调用删除方法
int count = session.delete("Student.DeleteStuBySid", sid);
if(count&0){
System.out.println("删除成功");
System.out.println("删除失败");
session.close();
需要在配置文件中新增的是
&!-- 删除学生信息 --&
&insert id="DeleteStuBySid" parameterType="int"&
delete from Student where sid=#{sid}
&!--或者是
delete from Student where sid=#{_parameter} --&
5.根据SID修改学生信息
* 1.5根据SID修改学生信息
public void UpdateStuBySid()throws Exception{
//通过配置文件获取配置信息
Reader reader = Resources.getResourceAsReader("config/Configuration.xml");
//构建一个SessionFactory,传入配置文件
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
//获取session
SqlSession session = factory.openSession();
//准备参数对象
Student stu=new Student();
stu.setSid(1);
stu.setSname("绿茵");
stu.setSex("女");
//调用删除方法
int count = session.update("Student.UpdateStuBySid", stu);
if(count&0){
System.out.println("修改成功");
System.out.println("修改失败");
session.close();
需要在配置文件中添加的是
&!-- 根据SID修改学生信息 --&
&update id="UpdateStuBySid" parameterType="entity.Student" &
update Student set sname=#{sname},sex=#{sex} where sid=#{sid} --&
update Student
&if test="sname!=null"&
sname=#{sname},
&if test="sex!=null"&
sex=#{sex},
where sid=#{sid}
&以上我们就简单的完成了对Mybatis的增、删、改、查的基本操作了,关于Mybatis的一些高级内容的讲解我会继续在后中为大家持续讲解
阅读(...) 评论()

我要回帖

更多关于 mybatis框架面试题 的文章

 

随机推荐