文档章节

数据库开发 - MyBatis入门

抢小孩糖吃
 抢小孩糖吃
发布于 2016/10/09 00:27
字数 3517
阅读 52
收藏 1

##面向对象的世界与关系数据库的鸿沟 Java语言是一门面向对象的程序设计语言,面向对象是从软件工程的基本原则高内聚低耦合等理论基础上发展起来的。

  • 面向对象的世界中数据都是以对象的形式存在的。
  • 关系型数据库基于数学理论发展起来的,在关系型数据库中数据是以行、列二元表。

正式编程语言与数据库的不匹配,我们没有办法在Java程序中像操作对象一样的方式去操作关系型数据库当中的数据。才需要一个中间的映射技术,帮助我们自动的实现对象与二元表之间的转换。这种对象关系数据库映射技术应运而生。

输入图片说明

##ORM

  • ORM(Object / Relation Mapping)
    能够帮助我们建立对象到数据库表之间的映射关系,让我们对对象的操作自动转换成关系数据库的操作,对于开发用户来说,在Java程序中就可以像直接操作修改
  • 持久化类与数据库表之间的映射关系
  • 对持久化对象的操作自动转换成对关系数据库操作

输入图片说明

  • 关系数据库的每一行映射数据库记录,通过中间映射技术,自动的为Java对象
  • 关系数据库的每一列映射为Java对象的每个属性

#MyBatis MyBatis官方网址

在2010年这个项目由Apache基金会迁移到了Google Code并改名为MyBatis。目前MyBatis在企业开发中应用非常广泛。本质上是ORM框架,但是与传统ORM框架显著不同的是,并非建立Java对象到关系型数据库表数据之间的映射关系。而是建立,对对象的操作方法到SQL语句之间的映射关系。由于SQL语句本身是需要由SQL语句来编写的。所以MyBatis的优势是可以让开发者使用关系型数据库的所有的特性。比如存储过程、视图、复杂查询等等。同时由于MyBatis也让开发者对执行的SQL获得了更多的控制,所以开发者可以编写更加高效率的SQL语句,来提高应用程序对数据库的访问效率。MyBatis是通过XML文件定义后端数据库的,配置Java方法与后端映射关系的。

  • 项目前身是Apache基金会下的一个开源项目iBatis
  • 支持自定义SQL、存储过程和高级映射的持久化框架
  • 使用XML或者注解配置
  • 能够映射基本数据元素、接口、Java对象到数据库

##MyBatis功能架构 MyBatis功能架构有三层, ###接口层 第一层是接口层,提供给外部使用的API接口。提供给我们程序开发人员,开发人员使用本地API来操作数据库,接口层接到调用请求后,将会把请求转发给数据处理层进行执行。 ###数据库处理层 第二层是数据处理层,主要负责具体SQL的查找、SQL解析、SQL执行和执行结果结果的映射处理。主要目的是根据调用请求来完成一次数据库操作 ###基础支持层 最后一层是基础支撑层,主要负责最基础的数据支持,数据库的连接管理、事务管理、配置加载、缓存处理。都是共用的功能,把这些功能抽象出来作为最基础的组件。给上层的数据库处理层提供最基础的支撑。 输入图片说明

##MyBatis工作流机制 首先我们需要在应用程序启动的时候,加载XML文件。该XML文件定义了后端数据库的地址,同时也定义了SQL与Java方法之间的映射关系

  • 根据XML或者注解加载SQL语句、参数映射、结果映射到内存
  • 应用程序调用API传入参数和SQL ID
  • MyBatis自动生成SQL语句完成数据库访问,转换执行结果为Java对象,返回应用程序

输入图片说明

##MyBatis环境搭建 MyBatis下载最终版本

输入图片说明
首先我们需要下载MyBatis,解压缩后查看目录树如下

mybatis/
└── mybatis-3.4.1
    ├── LICENSE
    ├── NOTICE
    ├── lib
    │   ├── ant-1.9.6.jar
    │   ├── ant-launcher-1.9.6.jar
    │   ├── asm-5.0.4.jar
    │   ├── cglib-3.2.2.jar
    │   ├── commons-logging-1.2.jar
    │   ├── javassist-3.20.0-GA.jar
    │   ├── log4j-1.2.17.jar
    │   ├── log4j-api-2.3.jar
    │   ├── log4j-core-2.3.jar
    │   ├── ognl-3.1.8.jar
    │   ├── slf4j-api-1.7.21.jar
    │   └── slf4j-log4j12-1.7.21.jar
    ├── mybatis-3.4.1.jar
    └── mybatis-3.4.1.pdf

2 directories, 16 files

应用程序使用MyBatis需要把解压缩当中的mybatis-3.x.x.jar放置到lib目录下,更加推荐Maven方式,由于MyBatis同样基础JDBC来访问后端数据库的,所以我们同样需要对应数据库的JDBC驱动。

###Maven

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.1</version>
    </dependency>

###Gradle

// https://mvnrepository.com/artifact/org.mybatis/mybatis
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.1'

##SqlSessionFactory 每个MyBatis应用都是基于SqlSessionFactory实例为中心的。通过SqlSessionFactory实例可以获取,将对象操作转换成数据库SQL的Session。我们通过XML配置文件,可以完成SqlSessionFactory的配置。首先我们要来完成配置文件,整个XML配置文件包含了对MyBatis系统的核心配置。包括后端的数据库连接实例数据源,和决定事务范围事务处理的事务管理器。

###transactionManager 在transactionManager有type属性,提供了两个选项,jdbc和managed。

  • jdbc
    jdbc表示MyBatis的事务控制,直接食用jdbc的提交和回滚。表示MyBatis依赖数据库源获取的数据库连接来管理事物的范围。实际上是依赖JDBC来实现事务控制的。
  • managed
    managed表示MyBatis的事务提交和回滚MyBatis是不做任何事情,不会去调用JDBC的事务提交和回滚。事务的控制是交给外部的容器,例如Spring。

输入图片说明 ###dataSource 之后我们要配置后端的数据库源,与JDBC一致,主要包括4个属性。分别是数据库驱动、URL、用户名、密码。 ###官方文档SqlSessionFactory的配置

<environments default="development">
  <environment id="development">
    <!-- 事务管理 -->
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <!-- 数据库连接数据源 -->
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

##Java对象 ###构造对象 在配置完毕MyBatis后,我们就需要对程序进行编写,由于MyBatis是Object Relation Mapping。我们要定义Java对象,然后建立对象和对象操作SQL语句之间的映射关系。我们定义的Java对象包括一些属性。我们这里以User对象作为示例。

package com.hava.mybatis.user.entity;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public class User {

    private Integer id;

    private String userName;

    private String corp; //公司

    public User(Integer id,String userName,String corp)
    {
        this.id = id;
        this.userName = userName;
        this.corp = corp;
    }

    //Getter and Setter
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCorp() {
        return corp;
    }

    public void setCorp(String corp) {
        this.corp = corp;
    }
}

###构建接口 有了Java对象以后,我们还需要定义对这个Java对象的操作。MyBatis与其他与其他传统ORM框架是不同的。不是直接建立对象和关系型数据库表数据的映射,而是采取更加灵活的方式,将对对象的操作与关系型数据库的SQL语句建立关系。所以我们需要定义一些对对象的操作。
我们使用Java里面的Interface接口的方式,来定义对对象的操作。

package com.hava.mybatis.user.entity;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public interface GetUserInfo {

    public User getUser(Integer id);

    public void addUser(User user);

    public void updateUser(User user);

    public void deleteUser(User user);
}

##创建Java对象和SQL语句映射关系配置文件 Java对象接口与SQL语句的映射关系,映射关系也是通过配置文件来完成的。配置也是XML文件,配置文件中最重要的是包含Mapper的标签。 ###namespace 标签的namespace属性的值是指向Java对象接口操作类的位置。 ###定义SQL语句 获取数据库中的信息,检索数据库获取User信息,然后映射到Java的User对象中。所以我们这里的select id定义为getUser,对应接口的具体方法。然后parameterType定义int,由于我们的方法参数为int,resultType指向我们定义的Java的User类。希望MyBatis把返回的结果自动转化成定义为Java对象。注意加完整路径。

  • 映射文件
<?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">
<mapper namespace="com.hava.mybatis.user.entity. GetUserInfo">
<!-- 定义SQL语句 -->
  <select id="getUser" parameterType="int" resultType="com.hava.mybatis.user.entity.User">
    select id, userName,corp from user where id = #{id}
  </select>
</mapper>

##注册配置文件 我们还需要将这个映射文件,加载到注册到刚开始配置的SqlSessionFactory的配置文件中,我们要在之前的配置文件中增加mappers的标签。

输入图片说明

##完成数据库查询 MyBatis完成数据库查询需要完成三个步骤,首先需要加载配置文件,然后创建一个SqlSessionFactory的实例。第二步通过SqlSessionFactory获取sqlSession对象,sqlSession能够帮助我们执行具体的SQL操作。最后一步就是利用Session进行查询。 输入图片说明

##MyBatis查询实例 ###数据库初始化

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) NOT NULL,
  `corp` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

手动添加了数据 ###修改pom.xml以支持xml运行

  <!-- 由于该项目需要添加在src下的xml文件进行运行则增加以下配置 -->
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
  </build>

###mybatis-conf.xml 上面的例子并没有添加mybatis的DOCTYPE定义

<?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>
    <environments default="development">
        <environment id="development">
            <!-- 事务管理 -->
            <transactionManager type="jdbc">
                <!--<property name="..." value="..."/>-->
            </transactionManager>
            <!-- 数据库连接数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.200/test"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/hava/mybatis/user/entity/userMapper.xml" />
    </mappers>
</configuration>

###执行查询过程

package com.hava.mybatis.user.service;

import com.hava.mybatis.user.entity.GetUserInfo;
import com.hava.mybatis.user.entity.User;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public class HelloMyBatis {

    public static void main(String [] args)
    {
        //1.声明MyBatis的配置文件目录
        String resource = "mybatis-conf.xml";

        //2.加载应用程序配置文件
        InputStream inputStream = HelloMyBatis.class.getClassLoader().getResourceAsStream(resource);

        //3.创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        Configuration configuration = sqlSessionFactory.getConfiguration();

        //Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.hava.mybatis.user.entity.GetUserInfo is already known to the MapperRegistry.
//        configuration.addMapper(GetUserInfo.class);

        //4.获取Session
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            //5.获取操作类
            GetUserInfo getUserInfo = sqlSession.getMapper(GetUserInfo.class);
            //6.完成查询操作
            User user = getUserInfo.getUser(1);
            System.out.println("[user.getUserName]:" + user.getUserName());

        }
        finally {
            //7.关闭session
            sqlSession.close();
        }

    }
}

###注意 在执行演示语句发生异常

Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.hava.mybatis.user.entity.GetUserInfo is already known to the MapperRegistry.
//        configuration.addMapper(GetUserInfo.class);

说明如果在配置文件当中,已经mapper了接口文件,则不需要在代码中再次mapper。 ###执行结果

[user.getUserName]:ZhangSan

Process finished with exit code 0

#MyBatis优势与劣势

  • 优势
    • 入门门槛比较低
    • 更加灵活,SQL优化
      SQL语句自己编写,来提高工作效率
  • 劣势
    • 需要自己编写SQL,工作量大
    • 数据库移植性差

#通过注解的方式

  • 映射文件通过注解的方式声明
package com.hava.mybatis.user.repository;

import com.hava.mybatis.user.entity.User;
import org.apache.ibatis.annotations.Select;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public interface GetUserInfoAnnotation {

    @Select("select * from user where id = #{id}")
    public User getUser(int id);
}

变更主程序

        //1.声明MyBatis的配置文件目录
        String resource = "mybatis-conf.xml";

        //2.加载应用程序配置文件
        InputStream inputStream = HelloMyBatis.class.getClassLoader().getResourceAsStream(resource);

        //3.创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        Configuration configuration = sqlSessionFactory.getConfiguration();

        //Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.hava.mybatis.user.entity.GetUserInfo is already known to the MapperRegistry.
        configuration.addMapper(GetUserInfoAnnotation.class);

        //4.获取Session
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            //5.获取操作类
//            GetUserInfo getUserInfo = sqlSession.getMapper(GetUserInfo.class);
            //使用注解的方式
            GetUserInfoAnnotation getUserInfo = sqlSession.getMapper(GetUserInfoAnnotation.class);
            //6.完成查询操作
            User user = getUserInfo.getUser(1);
            System.out.println("[user.getUserName]:" + user.getUserName());

        }
        finally {
            //7.关闭session
            sqlSession.close();
        }

##其他数据库操作

  • 增加
  • 修改
  • 删除

我们在openSession添加了true,是由于jdbc默认是以事务进行提交。但是在MyBatis是不一致的,默认会开启事务。如果不设置true,都是以事务的形式提交。

###定义正删改查接口

package com.hava.mybatis.user.repository;

import com.hava.mybatis.user.entity.User;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public interface UserOp {

    public void addUser(User user);
    
    public void updateUser(User user);

    public void deleteUser(int id);

    public User getUser(int id);
}

###添加定义文件 insert通过useGeneratedKeys获取自增id号

<?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">
<mapper namespace="com.hava.mybatis.user.repository.UserOp">
    <insert id="addUser" parameterType="com.hava.mybatis.user.entity.User"
            useGeneratedKeys="true" keyProperty="id">
        insert into user (userName,corp) value(#{userName},#{corp})
    </insert>
    <!-- 定义SQL语句 -->
    <select id="getUser" parameterType="int" resultType="com.hava.mybatis.user.entity.User">
        select id, userName,corp from user where id = #{id}
    </select>

    <update id="updateUser" parameterType="com.micro.profession.mybatis.User">
        update user set userName =
        #{userName} , corp = #{corp}
        where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="com.micro.profession.mybatis.User">
        delete from user
        where id =
        #{id}
    </delete>
</mapper>

###修改Entity定义

public User(Integer id,String userName,String corp)
public User(String userName,String corp)

必须均存在,用于MyBatis扫描和设置对象的属性,得知MyBatis并不是通过getter setter对对象的值进行设置。

package com.hava.mybatis.user.entity;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public class User {

    private Integer id;

    private String userName;

    private String corp;

    public User(Integer id,String userName,String corp)
    {
        this.id = id;
        this.userName = userName;
        this.corp = corp;
    }

    public User(String userName,String corp)
    {
        this.userName = userName;
        this.corp = corp;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCorp() {
        return corp;
    }

    public void setCorp(String corp) {
        this.corp = corp;
    }
}

###执行函数

package com.hava.mybatis.user.service;

import com.hava.mybatis.user.entity.User;
import com.hava.mybatis.user.repository.GetUserInfoAnnotation;
import com.hava.mybatis.user.repository.UserOp;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/**
 * Created by zhanpeng on 09/10/2016.
 */
public class HelloMyBatisMoreOp {

    public static void main(String[] args) {
        moreOp();
    }
    public static void moreOp() {
        // 1. 声明配置⽂件
        String resource = "mybatis-conf.xml";
        // 2. 加载应⽤配置⽂件
        InputStream is = HelloMyBatisMoreOp.class.getClassLoader()
                .getResourceAsStream(resource);
        // 3. 创建SqlSessonFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
                .build(is);

        SqlSession session = sessionFactory.openSession(true);
        try {
            // 5. 获取操作类
            UserOp userOp = session.getMapper(UserOp.class);
            User user = new User("XiaoMing", "Netease");
            // 插⼊⽤户
            userOp.addUser(user);
            System.out.println(user.getId());
            // 查询⽤户
            user = userOp.getUser(user.getId());
            System.out.println("userId:" + user.getId() + ", userName:"
                    + user.getUserName() + ", corp:" +
                    user.getCorp());
            user.setUserName("LiMing");
            // 更新⽤户
            userOp.updateUser(user);
            // 删除⽤户
            userOp.deleteUser(user.getId());
        } finally {
            // 7.关闭Session
            session.close();
        }
    }
}

###执行结果

4
userId:4, userName:XiaoMing, corp:Netease

Process finished with exit code 0

###MyBatis的事务 如果openSession(true)则会自动提交sql,不会发生事务处理。如果采用默认方式openSession(),则会开启事务,进行处理,如果开启事务,则需要手动进行提交工作。session.commit()

123

© 著作权归作者所有

共有 人打赏支持
抢小孩糖吃

抢小孩糖吃

粉丝 69
博文 236
码字总数 229004
作品 0
东城
程序员
老雷/spring-boot-starter-dao

spring-boot-starter-dao 该项目,集成spring-boot,mybatis,通用mapper,pagehelper,druid。致力于降低数据层的开发复杂度,让mybatis配置彻底告别xml,让基于mybatis的开发嵌入jpa的身影,极...

老雷
2017/09/28
0
0
浅析Mybatis与Hibernate的区别与用途

有很长一段时间对mybatis是比较陌生的,只知道与Hibernate一样是个orm数据库框架。随着使用熟练度的增加,发现它与Hibernate区别是非常大的,应当结合不同的情况分析选用。结合至今为止的经验...

小欣妹妹
2017/10/26
0
0
Mybatis与Hibernate区别

以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架。随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,...

开源oschina
2014/04/11
0
1
Mybatis 轻松入门教程

Mybatis框架 的快速入门 MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集...

yxhusmart
2016/11/04
11
0
mybatis入门&三种接口代理开发&别名、返回值、类型转换&比较

mybatis入门程序: 增删改查: 普通dao开发模式: 三种 接口代理开发模式: 使用接口代理注意事项: 只要使用接口,就必须满足四个条件: * 1、映射文件namespace必须是接口全类路径名 * 2、映射...

萧小蚁
2016/07/16
21
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链100讲:盘点那些常用的加密算法原理

在开发过程中,常常用到各种加密方法和算法,本文总结了几种常用加密方法的原理。 1 对称加密 原理:加密和解密数据使用同一个密钥,适合对大量数据进行加解密 安全性:关键是密钥的保存方式...

HiBlock
17分钟前
0
0
zookeeper基本常识

一、Zookeeper基础知识 1 zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致。2 zookeeper有watch事件,是一次性触发的,当watch监视的数...

啃不动地大坚果
22分钟前
0
0
Forrester企业级容器平台权威排行出炉,小初创Rancher缘何成为领导者?

全球著名的调研机构Forrester Research近日发布了《The Forrester New Wave: Enterprise Container Platform Software Suites, Q4 2018》报告,对企业级容器平台(ECP)市场进行全面评估,希...

RancherLabs
25分钟前
0
0
【三 异步HTTP编程】 2. 流式HTTP响应

标准响应及Content-Length头 自HTTP1.1以来,服务器为了在一个链接中处理多个HTTP请求及响应,必须随response一起返回合适的Content-Length值。 默认情况下,对于简单请求你无需返回 Conten...

Landas
今天
0
0
Java后端技术栈,到底如何深入学习?

Java,是现阶段中国互联网公司中,覆盖度最广的研发语言。有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的Java深入学习路线图,以及免费学习资料。 一 。性能...

别打我会飞
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部