Mybatis 01 入门

Mybatis入门

1、Mybatis简介

1.1、mybatis常用地址

​ mybatis参考网址:http://www.mybatis.org/mybatis-3/zh/index.html

​ Github源码地址:https://github.com/mybatis/mybatis-3

1.2、认识mybatis

​ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.3、与ORM差异比对

ORM一般指对象关系映射。对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。以Hibernate为例 其把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

对比项MybatisHibernate
市场占有率
适合的行业互联网 电商 项目传统的(ERP CRM OA)
性能 高 低
Sql灵活性 高 低
学习门槛 低 高
Sql配置文件全局配置文件、映射文件全局配置文件、映射文件
ORM半自动化完全的自动化
数据库无关性

2、实现一个Mybatis

2.1、编码流程

  1. 编写全局配置文件:SqlMapConfig.xml

  2. 映射文件:xxxMapper.xml

  3. 编写dao代码:xxxDao接口、xxxDaoImpl实现类

  4. POJO类

  5. 单元测试类

2.2、搭建maven工程

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>01-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2.3、编写SqlMapConfig.xml

properties

mysql.driver = com.mysql.jdbc.Driver
mysql.localhost.url = jdbc:mysql://127.0.0.1:3306/learning?setUnicode=true&characterEncoding=utf8
mysql.localhost.username = root
mysql.localhost.password = !QAZ1qaz

xml

<?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>
    <properties resource="db.properties"></properties>
    <environments default="major"><!-- default 表示默认的数据库连接 -->
        <environment id="major">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.localhost.url}"/>
                <property name="username" value="${mysql.localhost.username}"/>
                <property name="password" value="${mysql.localhost.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/SysUserMapper.xml"></mapper>
    </mappers>
</configuration>

相关属性简单的说明

属性描述说明
configuration配置标签大类,所有配置声明依赖DOCTYPE定义
properties变量配置或引入,实现动态配置可以使用 property进行 name和value进行声明。 也可以使用自带标签 resource和url进行外部引入
environments配置当前工作的多个数据库环境多个环境声明,default设置默认连接环境
environment配置单个数据库环境定义id标识唯一性
transactionManager基于数据库的事物管理配置type声明事物类型,包含枚举(type="[JDBC|MANAGED]")
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
dataSource数据源连接配置有三种内建的数据源类型,包含枚举(type="[UNPOOLED|POOLED|JNDI]") UNPOOLED >这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。
POOLED
>这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。可以通过pool相关属性设置性能。
JNDI==>这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
property数据源连接属性常规属性声明 name和value定义,主要包含:
driver – 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。 url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。 defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文档以获取更多信息 poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。 poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与poolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5) poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动出错时返回恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。 poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
mappers配置SQLMapper文件路径。
mappermapper子标签标记不同类型的资源映射三种方式声明资源指向:
1、 2、
3、
package包内的映射器接口实现全部注册为映射器

2.4、编写映射文件SysUserMapper.xml

Code

<?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="sys">
    <select id="getSysUserList" resultType="com.fewin.dto.SysUser">
        select user_name as username,log_id as logId ,password from sys_user
    </select>
</mapper>

属性说明

标签描述说明
select映射查询语句id 唯一标识 paramType/parameterMap入参声明 resultType/resultMap 出参声明
insert映射插入语句同上
update映射修改语句同上
delete映射删除语句同上
resultMap将查询结果与POJO进行映射Id 唯一标识 Type指向实体类 标签每个字段定义 property/javaType 类定义 column/jdbcType数据库字段定义
sql可被其它语句引用的可重用语句块Id 唯一标识
cache该命名空间的缓存配置默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
cache-ref引用其它命名空间的缓存配置。namespace 只会使用该命名空间的缓存进行缓存或刷新

2.5、编写接口Dao

Code

package dao;

import com.fewin.dto.SysUser;

import java.util.List;

/**
 * @Author : xuwl
 * @Date : Created on 上午11:16 2021/4/14
 * @Package Name : dao
 * @Des : 系统用户查询接口
 * @Version: v0.1
 */
public interface SysUserDAO {

    public List<SysUser> getSysUserList();

}

2.6、编写实现类

Code

package dao.impl;

import com.fewin.dto.SysUser;
import dao.SysUserDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

/**
 * @Author : xuwl
 * @Date : Created on 上午11:17 2021/4/14
 * @Package Name : dao.impl
 * @Des :
 * @Version: v0.1
 */
public class SysUserDAOImpl implements SysUserDAO {

    private SqlSessionFactory sqlSessionFactory;

    public SysUserDAOImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public List<SysUser> getSysUserList() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<SysUser> sysUsers =sqlSession.selectList("sys.getSysUserList");
        return sysUsers;
    }
}

2.7、编写POJO

Code

package com.fewin.dto;

/**
 * @Author : xuwl
 * @Date : Created on 上午11:06 2021/4/14
 * @Package Name : com.fewin
 * @Des : 用户信息相关
 * @Version: v0.1
 */
public class SysUser {

    private String logId;

    private String username;

    private String password;

    public String getLogId() {
        return logId;
    }

    public void setLogId(String logId) {
        this.logId = logId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "logId='" + logId + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

2.8、编写测试类

Code

package com.test.base;

import com.sun.javaws.security.Resource;
import dao.SysUserDAO;
import dao.impl.SysUserDAOImpl;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @Author : xuwl
 * @Date : Created on 上午11:21 2021/4/14
 * @Package Name : com.test.base
 * @Des : 简单的测试
 * @Version: v0.1
 */
public class A1Test {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        SqlSessionFactoryBuilder  builder = new SqlSessionFactoryBuilder();
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        sqlSessionFactory = builder.build(is);
    }

    @Test
    public void testSqlSession(){
        SysUserDAO sysUserDAO = new SysUserDAOImpl(sqlSessionFactory);
        System.out.println( sysUserDAO.getSysUserList());
    }
}

2.9、Java代码说明

使用 MyBatis 的主要 Java 接口就是 SqlSession。你可以通过这个接口来执行命令,获取映射器示例和管理事务。在介绍 SqlSession 接口之前,我们先来了解如何获取一个 SqlSession 实例。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的各种方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或 Java 配置代码来创建 SqlSessionFactory。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许你从不同的资源中创建一个 SqlSessionFactory 实例。

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

SqlSessionFactory

SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择其中一个方法时,你需要考虑以下几点:

  • 事务处理:你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?(对很多数据库和/或 JDBC 驱动来说,等同于关闭事务支持)
  • 数据库连接:你希望 MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?
  • 语句执行:你希望 MyBatis 复用 PreparedStatement 和/或批量更新语句(包括插入语句和删除语句)吗?

基于以上需求,有下列已重载的多个 openSession() 方法供使用。

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();

默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

  • 事务作用域将会开启(也就是不自动提交)。
  • 将由当前环境配置的 DataSource 实例中获取 Connection 对象。
  • 事务隔离级别将会使用驱动或数据源的默认设置。
  • 预处理语句不会被复用,也不会批量处理更新。

SqlSession

正如之前所提到的,SqlSession 在 MyBatis 中是非常强大的一个类。它包含了所有执行语句、提交或回滚事务以及获取映射器实例的方法。 SqlSession 类的方法超过了 20 个,为了方便理解,我们将它们分成几种组别。

语句执行方法

这些方法被用来执行定义在 SQL 映射 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 语句。你可以通过名字快速了解它们的作用,每一方法都接受语句的 ID 以及参数对象,参数可以是原始类型(支持自动装箱或包装类)、JavaBean、POJO 或 Map。

 		session.insert(...);
    session.update(...);
    session.delete(...);
    session.clearCache();
    session.close();
    session.commit();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值