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的运行环境,数据源,事务等。代码如下所示:

<span style="font-family:Comic Sans MS;font-size:18px;"><?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>
<!-- 将spring整合后environments配置将废除 -->
<environments default="developent">
<!-- 使用jdbc事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POLLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environments>
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
</span>

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

<span style="font-family:Comic Sans MS;font-size:18px;">package cn.itcast.mybatis.po;
import java.util.Date;
/**
*
* <p>Title: User</p>
* <p>Description:用户po </p>
* @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 + "]";
}
}
</span>

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

<span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用-->
<mapper namespace="test">
<!-- 在 映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过 select执行数据库查询
id:标识 映射文件中的 sql
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入 参数的类型,这里指定int型
#{}表示一个占位符号
#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定就是单挑记录所映射的java对象类型
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接到sql中。
使用${}拼接sql,引起sql注入
${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<!-- 将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询得到主键值设置到parameterType指定的对象的那个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说她的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSER_ID()
</selectKey>
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
<!-- 使用mysql的uuid()函数生成主键
执行过程,首先通过uuid得到主键,将主键设置到user对象的id属性中
其次,在insert执行的时候,从user对象中,取出id属性值 -->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});
</insert>
<!-- 删除用户
根据id删除用户,需要输入id值 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!-- 根据id更新用户
分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括 id和更新信息,注意:id必须存在
#{id}:从输入 user对象中获取id属性值
-->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
</mapper></span>

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

<span style="font-family:Comic Sans MS;font-size:18px;">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<User> list = sqlSession.selectList("test.findUserByName","小明");
System.out.println(list);
sqlSession.close();
}
public void insertUserTest() throws IOException{
//mybatis配置文件
String resource ="SqlMapConfig";
//得到配置文件流
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的配置文件信息
SqlSessionFactory 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();
}
}
</span>

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原理概述入门教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Mybatis入门教程(四)之mybatis动态sql

    推荐阅读: MyBatis入门学习教程(一)-MyBatis快速入门  什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下面就去感受Mybatis动态SQL

  • Java Mybatis框架入门基础教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

  • Mybatis入门教程之新增、更新、删除功能

    上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在mapper中: <insert id="insertitem" parameterType="cn.qkp.po.user"> INSERT INTO user(username,birthday,sex,address) VALUES(#{username},

  • Mybatis的入门示例代码

    首先新建一个JavaWeb项目并导入mybatis依赖的jar包,同时Mybatis是对数据库的操作所以我们需要在数据库中新建一个表user用来演示. 新建完表之后我们还需要建立相对应的实体类User.java并添加set和get方法: public class User { private String username; private String password; private int age; public String getUsername() { return usernam

  • Mybatis 开发注解快速入门

    快速普及 1.mybatis是什么 mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis实现了接口绑定,使用更加方便. 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来

  • MyBatis入门之增删改查+数据库字段和实体字段不一致问题处理方法

    当数据库字段和实体bean中属性不一致时 之前数据库Person名字字段是name,PersonBean中属性也是name,但是之后数据库中修改为了user_name, 方法1:通过sql语句的字段起别名,别名和实体中的对象属性一致 SELECT id,user_name as name,sex,age from person <select id="find" resultType="com.luogg.domain.Person"> SELECT i

  • MyBatis入门初体验之使用大全(2)

    MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 1.所需jar包

  • Mybatis实战教程之入门到精通(经典)

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 ses

  • mybatis入门_动力节点Java学院整理

    本文为大家分享了mybatis入门学习资料,供大家参考,具体内容如下 所需要用到的其他工具或技术: 项目管理工具 : Maven 测试运行工具 : Junit 数据库 : Derby 废话不多说,直接代码 Maven Dependencies: <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <

  • MyBatis入门学习教程(一)-MyBatis快速入门

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 首先给大家介绍MyBatis的含义

随机推荐