mybatis原理概述入门教程

网友投稿 195 2023-07-07


mybatis原理概述入门教程

本文我将要介绍一下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的运行环境,数据源,事务等。代码如下所示:

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

第三步、编写User.java中的内容,如下所示:

package cn.itcast.mybatis.po;

import java.util.Date;

/**

*

*

Title: User

*

Description:用户po

* @author 丁国华

* @date 2016年7月31日 15:39:04

* @version 1.0

*/

public class User {

//属性名和数据库表的字段对应

private int id;

private String username;// 用户姓名

private String sex;// 性别

private Date birthday;// 生日

private String address;// 地址

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return "User [id=" + id + ", username=" + username + ", sex=" + sex

+ ", birthday=" + birthday + ", address=" + address + "]";

}

}

第四步、实现增删改查的功能,首先编写User.xml中的内容,如下所示:

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM USER WHERE id=#{value}

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

SELECT LAST_INSER_ID()

insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})

执行过程,首先通过uuid得到主键,将主键设置到user对象的id属性中

其次,在insert执行的时候,从user对象中,取出id属性值 -->

SELECT uuid()

insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});

delete from user where id=#{id}

update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

where id=#{id}

第五步、编写具体的方法,如下所示:

package cn.itcast.mybatis.first;

import java.io.IOException;

import java.io.InputStream;

import java.util.Date;

import java.util.List;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Test;

import cn.itcast.mybatis.po.User;

public class MybatisFirst {

// 根据id查询用户信息,得到一条记录结果

@Test

public void findUserByIdTest() throws IOException {

// mybatis配置文件

String resource = "SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 通过SqlSession操作数据库

// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id

// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数

// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象

// selectOne查询出一条记录

User user = sqlSession.selectOne("test.findUserById", 1);

System.out.println(user);

// 释放资源

sqlSession.close();

}

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

@Test

public void findUserByNameTest() throws IOException{

//mybatis配置文件

String resource ="SqlMapConfig.xml";

//得到配置文件

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

//List中的user和映射文件中德resultType所指定的类型一致

List list = sqlSession.selectList("test.findUserByName","小明");

System.out.println(list);

sqlSession.close();

}

public void insertUserTest() throws IOException{

//mybatis配置文件

String resource ="SqlcQiFORMapConfig";

//得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到sqlsession

SqlSession sqlSession = sqlSessionFactory.openSession();

//插入用户对象

User user = new User();

user.setUsername("丁国华");

user.setBirthday(new Date());

user.setSex("1");

user.setAddress("安徽合肥");

//list中的user和映射文件中的resultType所指定的类型一直

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

//提交事物

sqlSession.commit();

//关闭会话

sqlSession.close();

}

//根据id删除用户信息

@Test

public void deleteUserTest() throws IOException{

//mybatis配置文件

String resource = "SqlMapConfig.xml";

//得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

//传入id删除用户

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

//提交事物

sqlSession.commit();

//关闭会话

sqlSession.close();

}

// 更新用户信息

@Test

public void updateUserTest() throws IOException {

// mybatis配置文件

String resource = "SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFachttp://tory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 更新用户信息

User user = new User();

//必须设置id

user.setId(41);

user.setUsername("丁国华");

user.setBirthday(new Date());

user.setSex("2");

user.setAddress("安徽合肥");

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

// 提交事务

sqlSession.commit();

// 关闭会话

sqlSession.close();

}

}

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:强大、方便、高效、复杂、绕弯子、全自动;

mybatis:

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对象。

以上所述是给大家介绍的mybatis原理概述入门教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!

执行过程,首先通过uuid得到主键,将主键设置到user对象的id属性中

其次,在insert执行的时候,从user对象中,取出id属性值 -->

SELECT uuid()

insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});

delete from user where id=#{id}

update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

where id=#{id}

第五步、编写具体的方法,如下所示:

package cn.itcast.mybatis.first;

import java.io.IOException;

import java.io.InputStream;

import java.util.Date;

import java.util.List;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Test;

import cn.itcast.mybatis.po.User;

public class MybatisFirst {

// 根据id查询用户信息,得到一条记录结果

@Test

public void findUserByIdTest() throws IOException {

// mybatis配置文件

String resource = "SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 通过SqlSession操作数据库

// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id

// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数

// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象

// selectOne查询出一条记录

User user = sqlSession.selectOne("test.findUserById", 1);

System.out.println(user);

// 释放资源

sqlSession.close();

}

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

@Test

public void findUserByNameTest() throws IOException{

//mybatis配置文件

String resource ="SqlMapConfig.xml";

//得到配置文件

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

//List中的user和映射文件中德resultType所指定的类型一致

List list = sqlSession.selectList("test.findUserByName","小明");

System.out.println(list);

sqlSession.close();

}

public void insertUserTest() throws IOException{

//mybatis配置文件

String resource ="SqlcQiFORMapConfig";

//得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建会话工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到sqlsession

SqlSession sqlSession = sqlSessionFactory.openSession();

//插入用户对象

User user = new User();

user.setUsername("丁国华");

user.setBirthday(new Date());

user.setSex("1");

user.setAddress("安徽合肥");

//list中的user和映射文件中的resultType所指定的类型一直

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

//提交事物

sqlSession.commit();

//关闭会话

sqlSession.close();

}

//根据id删除用户信息

@Test

public void deleteUserTest() throws IOException{

//mybatis配置文件

String resource = "SqlMapConfig.xml";

//得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

//创建工厂,传入mybatis的配置文件信息

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

//传入id删除用户

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

//提交事物

sqlSession.commit();

//关闭会话

sqlSession.close();

}

// 更新用户信息

@Test

public void updateUserTest() throws IOException {

// mybatis配置文件

String resource = "SqlMapConfig.xml";

// 得到配置文件流

InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息

SqlSessionFachttp://tory sqlSessionFactory = new SqlSessionFactoryBuilder()

.build(inputStream);

// 通过工厂得到SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 更新用户信息

User user = new User();

//必须设置id

user.setId(41);

user.setUsername("丁国华");

user.setBirthday(new Date());

user.setSex("2");

user.setAddress("安徽合肥");

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

// 提交事务

sqlSession.commit();

// 关闭会话

sqlSession.close();

}

}

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:强大、方便、高效、复杂、绕弯子、全自动;

mybatis:

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对象。

以上所述是给大家介绍的mybatis原理概述入门教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 正则表达式详细介绍
下一篇:java 多线程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~