[学习笔记] MyBatis之初识MyBits

# 学习 # · 2020-11-17

框架技术

1、框架(Framework):是一个提供了可重用的公共结构的半成品。

2、框架技术的优势:不用再考虑公共问题,专心在业务实现上,结构统一,易于学习、维护。

3、主流框架:

(1)Struct2:以WebWork优秀的设计思想为核心。

(2)Hibernate:优秀的持久化框架。

(3)Spring:简化Java EE应用,依赖注入容器/AOP实现、声明式事务。

(4)Spring MVC:结构最清晰的MVC Model2实现,高度可配置,支持多种视图技术。

(5)MyBatis:半自动化的ORM实现。


MyBatis介绍

1、什么是Mybatis?

(1)MyBatis是一款优秀的持久层框架。

(2)它支持定制化SQL、储存过程以及高级映射。

(3)MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

(4)MyBatis前身是iBatis,是Apache的一个开源项目。

(5)MyBatis通过简单的XML或注解进行配置和原始映射,将实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。

2、持久化和持久层:

(1)持久化:就是将程序的数据在持久状态和瞬时状态转化的过程。

(2)数据持久化:将内存中的数据模型(任何数据结构或对象模型)转换为储存模型(关系模型、XML、二进制流),以及将储存模型转换为内存中的数据模型的统称。

(3)持久层:Dao层、Service层、Controller层等用来完成持久化工作的代码块。

3、ORM(Object/Relational Mapping):即“对象-关系型数据映射组件”,是一中数据库持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象取操作数据库表中的数据。

4、MyBatis的特点:基于SQL语法,简单易学、能了解底层封装过程、SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度、方便程序代码调试。

5、MyBatis的优点:

(1)与JDBC相比,减少了50%以上的代码量。

(2)MyBatis是最简单的持久化框架,小巧简单易学。

(3)MyBatis相当灵活,不会对应用程序或数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

(4)提供XML标签,支持编写动态SQL语句。

(5)提供映射标签,支持对象与数据库的ORM字段关系映射。

9、MyBatis的缺点:SQL语句编写工作量大,SQL语句依赖于数据库,导致数据库移植性差。

7、MyBatis框架适用场合:性能要求高、需求变化较多的项目。


第一个Mybatis程序

1、搭建数据库环境,创建数据库表,并插入测试数据。

CREATE DATABASE IF NOT EXISTS `MyBatisDB`;
use MyBatisDB;

CREATE TABLE IF NOT EXISTS `user`(
    `id` int(11) NOT NULL PRIMARY KEY,
    `name` varchar(50) NOT NULL,
    `pwd` varchar(50) NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=UTF8;

2、在IDEA中新建Maven项目。

3、配置pom.xml配置文件,导入相关的依赖jar包。

<!--导入相关的依赖包-->
<dependencies>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>mybatis</groupId>
        <artifactId>org.mybatis</artifactId>
        <version>3.3</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

4、创建一个模块(可选操作,new-Model)。

5、创建并编写mybatis-config.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>
    <environments default="development">
        <environment id="development">
            <!--配置事务管理,采用JDBC的事务管理。可以选择JDBC或MANAGED  -->
            <transactionManager type="JDBC"/>
            <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源,UNPOOLED:每次被请求时打开和关闭连接 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

6、创建并编写MyBatis测试类。

package com.mybatis.utils;

public class MyBatisUtil {
    public String configFile = "mybatis-config.xml";    //定义MyBatis配置文件名
    private static SqlSessionFactory factory;   //定义SqlSessionFactory对象

    static{
        try {
            //获取MyBatis配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建SqlSessionFactory对象,完成对配置文件的读取
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession createSqlSession(){
        return factory.openSession(false);
    }

    public static void closeSqlSession(SqlSession sqlSession){
        if(null != sqlSession) {
            sqlSession.close();
        }
    }
}

7、编写代码:实体类。

package com.mybatis.pojo;

public class User {
    //创建实体相关信息
}

8、编写代码:Dao接口。

public interface UserMapper {
    /**
     * 获取用户列表
     * @return
     */
    List<User> getUserList();
}

9、编写代码:Mapper映射文件。由原来的UserDaoImpl接口实现类转变为一个Mapper配置文件。

<?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:绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.mybatis.dao.UserMapper">
    <!--select查询语句-->
    <select id="getUserList" resultType="com.mybatis.pojo.User">
        select * from user;
    </select>
</mapper>

10、绑定Mapper:修改mybatis-config.xml。

<mappers>
    <mapper resource="com/mybatis/dao/UserMapper.xml"></mapper>
</mappers>

11、编写测试类:

@Test
public void run() {
    //第一步:获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.createSqlSession();
    //第二步:执行SQL语句
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = userMapper.getUserList();
    //第三步:输出结果
    for(User u : userList) {
        System.out.println(u);
    }
    //第四步:关闭资源
    MyBatisUtil.closeSqlSession(sqlSession);
}

MyBatis的基本要素——核心对象

1、MyBatis的核心接口和类:

(1)每个MyBatis应用程序都以一个SqlSessionFactory对象的实例为核心。

(2)首先获取SqlSessionFactoryBuilder对象,可以根据XML配置文件或Configuration类的实例构建该对象。

(3)然后获取SqlSessionFactoty对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoty启动时消耗大量资源。

(4)有了SqlSessionFactory对象之后,就可以进而获取SqlSession实例,SqlSession对象中完全包含以数据库为背景的所有执行SQL操作的方法,可以用该实例来直接执行已映射的SQL语句。

2、SqlSessionFactoryBuilder:负责构建SqlSessionFactory,并且提供多个build()方法的重载。

(1)配置信息以三种形式提供给SqlSessionFactory的build方法:

build(InputStream inputStream, String environment, Properties properties);    //字节流
build(Reader reader, String environment, Properties properties);    //字符流
build(Configuration config);    //类

(2)生命周期:用过即丢,其生命周期只存在于方法体内。

(3)作用域:存在于方法体内(一旦创建了SqlSessionFactory就不需要它了)。

(4)读取XML文件构造方式:

String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

3、SqlSessionFactory:每个MyBatis应用的核心,创建SqlSession实例的工厂。

(1)通过openSession()方法获取SqlSession实例:

SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);
//autoCommit = true:关闭事务控制(默认)
//autoCommit = false:开启事务控制

(2)生命周期:生命周期与应用的生命周期相同。存在于整个应用运行时,并且同时只存在一个对象实例(即单例)。

(3)作用域:Application。

4、SqlSession:用于执行持久化操作的对象。

(1)通过SqlSession实例直接运行已映射的SQL语句:

SqlSession session = sqlSessionFactory.openSession();
try {
    //用法一:通过SqlSession实例直接运行映射的SQL语句
    userList = sqlSession.selectList("com.mybatis.dao.UserMapper.getUserList");

    //用法二:创建绑定映射语句的接口UserMapper.java,并提供接口方法getUserList()
    //基于Mapper接口方式操作数据
    userList = sqlSession.getMapper(UserMapper.class).getUserList();

} finally {
    //必须确保SqlSession在finally语句块中正常关闭
    session.close();
}

(2)生命周期:创建到关闭。

(3)作用域:每个线程都有自己的SqlSession实例,SqlSession实例不能被共享,也不是线程安全的,因此最佳作用域范围是request作用域或者方法体作用域内。


MyBatis的基本要素——配置文件mybatis-config.xml

1、mybatis-config.xml的文件结构:

configuration:配置
    properties:可以配置在Java属性配置文件中
    settings:修改MyBatis在运行时的行为方式
    typeAliases:为Java类型命名一个别名(简称)
    typeHandlers:类型处理器
    objectFactory:对象工厂
    plugins:插件
    environments:环境
    environment:环境变量
        transactionManager:事务管理器
        dataSource:数据源
    mappers:映射器

2、properties:可以配置在Java 属性配置文件中。resource属性值(外部配置文件)的优先级高于property子节点配置的值。

<!--
    resource:引入类路径下的资源
    url:引入网络路径或者磁盘路径下的资源
-->
<properties resource="database.properties"/>

<!-- 使用${属性名}获取值 -->
<property name="driver" value="${driver}"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="${url}"/>

3、settings:修改 MyBatis 在运行时的行为方式。

<!-- 
    setting:用来设置每一个设置项
    name:设置项名
    value:设置项取值
-->
<settings>
    <setting name="属性名" value="值"/>
</settings>

<!-- 配置mybatis的log实现为LOG4J -->
<settings>
    <setting name="logImpl" value="LOG4J" />
</settings>

4、typeAliases 为 Java 类型命名一个别名(简称)。

<typeAliases>
    <!--
        typeAlias:为某个java类型起别名
        type:指定要起别名的类型全类名。
        alias:指定新的别名
     -->
    <typeAlias alias="User" type="cn.mybatis.pojo.User"/>

    <!--
        package:为某个包下的所有类批量起别名 
        name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名)
        扫描实体类,生成实体包下的别名(默认别名就是类名小写)
    -->
    <package name ="cn.mybatis.pojo" />
</typeAliases>

如果有注解,则其别名为其注解值。

@Alias("NewUser")
public class User{
    //省略代码
}

5、environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上。

<environments default="development">
    <!-- default:默认的运行环境 ID -->
    <!--
        environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
    -->
    <environment id="development"><!-- ID:运行环境 ID -->
        <transactionManager type="JDBC"/><!-- type:事务管理器配置,JDBC或MANAGED(托管) -->
        <dataSource type="POOLED"></dataSource><!-- type:数据源配置,UNPOOLED/POOLED/JNDI -->
    </environment>

    <environment id="test">
        <!-- ID:另一个运行环境 ID -->
    </environment>
</environments>

6、mappers:映射器,定义SQL映射语句,须在配置中引用mapper映射文件。

<!--
    方式一:使用类资源路径获取资源
-->
<mappers>
    <mapper resource="cn/mybatis/dao/user/UserMapper.xml"/>
</mappers>

<!--
    方式二:使用完全限定资源定位符URL获取资源
-->
<mappers>
    <mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
</mappers>

<!--
    方式三:使用映射器接口实现类的完全限定类名
    注意:接口及其Mapper文件同名且在同一目录下
-->
<mappers>
    <mapper class="cn.mybatis.dao.UserMapper"/>
</mappers>

<!--
    方式四:使用扫描包方式进行注入绑定
    注意:接口及其Mapper文件同名且在同一目录下
-->
<mappers>
    <package name="com.mybatis.dao"/>
</mappers>
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/186/

评论