天天看点

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

文章目录

  • 1、MyBatis框架的概述
    • 1.1、什么是框架,框架要解决那些问题?
    • 1.2、持久层技术解决方案有哪些?
    • 1.3、什么是ORM?
  • 2、JDBC操作数据库的问题分析
    • 2.1、JDBC源码回顾
    • 2.2、JDBC问题分析
  • 3、MyBatis的环境搭建
    • 3.1、下载MyBatis框架
    • 3.2、Mybatis环境搭建
    • 3.3、Mybatis环境搭建的注意事项
  • 4、MyBatis入门案例
    • 4.1、创建数据库
    • 4.2、引入log4j配置文件,可省略
    • 4.3、Mybatis简单的测试案例
    • 4.4、Mybatis注解开发案例
    • 4.5、小结

1、MyBatis框架的概述

  MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。

  MyBatis 通过 XML 或注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。

  采用 ORM 思想解决了实体和数据库映射的问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久化操作。

  Mybatis框架的执行流程:

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

1.1、什么是框架,框架要解决那些问题?

  框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

  简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

  框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。

  而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。

  框架一般处在低层应用平台(如 J2EE )和高层业务逻辑之间的中间层。

1.2、持久层技术解决方案有哪些?

  (1)JDBC(Java DataBase Connectivity,Java 数据库连接):JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。主要操作的三个对象:Connection、PreparedStatement 和 ResultSet。

  (2)Spring 的 JdbcTemplate:对数据库的操作在 JDBC 上面做了深层次的封装,主要封装了PreparedStatement和ResultSet。

  (3)Apache 的 DBUtils:对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。

  需要知道的是,以上这些其实都不算做框架。JDBC是一种规范,而Spring 的 JdbcTemplate和Apache 的 DBUtils都只是一个工具类。

1.3、什么是ORM?

  ORM(Object Relational Mappging),对象关系映射。

  简单来说,就是把数据库表和实体类、数据库表中的列和实体类的属性对应起来,仅仅操作实体类就可以实现操作数据库表。

实体类的属性 数据库表的列
User实体类 – 对应 – user表
userId – 对应 – id
userName – 对应 – user_name

  一般来说,常常将实体类中的属性和数据库表的字段名称保持一致。

实体类的属性 数据库表的列
User实体类 – 保持一致 – user表
id – 保持一致 – id
user_name – 保持一致 – user_name

2、JDBC操作数据库的问题分析

2.1、JDBC源码回顾

import java.sql.*;

public class JdbcTest {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过驱动管理类获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8", "root", "root");
            // 定义Sql语句,?表示占位符
            String sql = "select * from user where name = ?";
            // 获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            // 设置参数,第一个参数为 sql 语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "Atlantis");
            // 向数据库发出sql执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            // 遍历查询结果集
            while (resultSet.next()) {
                String id = resultSet.getString("id");
                String name = resultSet.getString("name");
                System.out.println("id:" + id + "  name:" + name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
           

2.2、JDBC问题分析

  (1)数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

  (2)SQL 语句在代码中硬编码,造成代码不易维护,实际应用 SQL 变化的可能较大,SQL 变动需要改变 Java

代码。

  (3)使用 PreparedStatement 向占有位符号传参数存在硬编码,因为 SQL 语句的 where 条件不一定,可能多也可能少,修改 SQL 还要修改代码,系统不易维护。

  (4)对结果集解析存在硬编码(查询列名),SQL 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

3、MyBatis的环境搭建

3.1、下载MyBatis框架

  Maven中央仓库下载:https://mvnrepository.com/artifact/org.mybatis/mybatis。

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

3.2、Mybatis环境搭建

  (1)创建Maven工程并在 pom.xml 导入需要的 jar 包坐标。

  注意,除了 Mybatis 的 jar 包外,我们还需要 Mysql 数据库连接的 jar 包。 log4j 日志和 junt 单元测试的 jar 包可以根据实际情况是否导入。

  若不使用Maven构建工程,可直接将

mybatis-x.x.x.jar

以及其他相应的 jar 包导入项目即可。

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例
<?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>com.atlantis</groupId>
    <artifactId>Mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 设置编码 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

    <dependencies>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- Mysql数据库连接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- junit单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
           

  (2)创建实体类和Dao层接口

package com.atlantis.domain;

import java.util.Date;

public class User {
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

	// 省略构造方法
	// 省略get和set方法
	// 省略toString方法 
}
           
package com.atlantis.dao;

import com.atlantis.domain.User;
import java.util.List;

public interface UserDao {
    /**
     * 查询所有用户
     * @return List<User>
     */
    List<User> findAll();
}
           

  (3)创建Mybatis的主配置文件SQLMapConfig.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">
<!-- Mybatis的主配置文件 -->
<configuration>
    <!-- 配置数据库环境 -->
    <environments default="mysql">
        <!-- Mysql的配置环境 -->
        <environment id="mysql">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,即每个Dao接口独立的配置文件 -->
    <mappers>
        <mapper resource="com/atlantis/dao/UserDao.xml"/>
    </mappers>
</configuration>
           

  (4)创建Dao接口的映射配置文件xxxDao.xml

<?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.atlantis.dao.UserDao">
    <select id="findAll" resultType="com.atlantis.domain.User">
        select * from user
    </select>
</mapper>
           

3.3、Mybatis环境搭建的注意事项

  ①在 Mybatis 中,把持久层的操作接口名称和映射文件也叫做 Mapper,因此 UserDao 和 UserMapper 是一样的。

  ②在 IDEA 中创建目录(Directory)和包(Package)是不一样的,在创建包时

com.atlantis.dao

是三级目录,在创建目录时

com.atlantis.dao

是一级目录。

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

  ③ Mybatis 的映射配置文件位置必须和 Dao 接口的包结构相同。

  ④映射配置文件的 mapper 标签 namespace 属性的取值必须是 Dao 接口的全路径类名。

  ⑤映射配置文件的操作配置,id属性的取值必须是 Dao 接口的方法名。

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

  当我们遵从了③④⑤点之后,在开发过程中无需再写Dao接口的实现类,因为剩下的工作都交给Mybatis完成了。

4、MyBatis入门案例

4.1、创建数据库

CREATE DATABASE mybatis CHARACTER SET utf8 COLLATE utf8_general_ci;
USE mybatis;
CREATE TABLE user (
  id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  username varchar(32) NOT NULL COMMENT '用户名称',
	sex char(1) default NULL COMMENT '性别',
  birthday datetime default NULL COMMENT '生日',  
  address varchar(256) default NULL COMMENT '地址'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 插入数据
insert  into user values (1,'测试名称','男','2019-10-22 17:47:08','北京');
insert  into user values (2,'Atlantis','男','2018-10-22 17:47:08','武汉');
insert  into user values (3,'长安','女','2017-10-22 17:47:08','杭州');
insert  into user values (4,'Andersen','男','2016-10-22 17:47:08','上海');
           
MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

4.2、引入log4j配置文件,可省略

### 配置根 ###
# log4j.rootCategory=INFO DEBUG, CONSOLE ,LOGFILE
log4j.rootCategory=DEBUG, CONSOLE

log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

### 配置输出到控制台 ###
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{YYYY-MM-dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m %n
           

4.3、Mybatis简单的测试案例

public class MybatisTest {
    public static void main(String[] args) throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建 SqlSessionFactory 的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);
        //4.使用 SqlSessionFactory 生产 SqlSession 对象
        SqlSession session = factory.openSession();
        //5.使用 SqlSession 创建 dao 接口的代理对象
        UserDao userDao = session.getMapper(UserDao.class);
        //6.使用代理对象执行查询所有方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        //7.释放资源
        session.close();
        in.close();
    }
}
           
MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

4.4、Mybatis注解开发案例

  (1)在Dao持久层接口中添加注解

public interface UserDao {
    /**
     * 查询所有用户
     * @return List<User>
     */
    @Select("select * from user")
    List<User> findAll();
}
           

  (2)修改Mybatis的主配置文件SQLMapConfig.xml

<mappers>
        <mapper class="com.atlantis.dao.UserDao"/>
    </mappers>
           

  注意事项:在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(UserDao.xml)。

MyBatis框架的入门学习1、MyBatis框架的概述2、JDBC操作数据库的问题分析3、MyBatis的环境搭建4、MyBatis入门案例

4.5、小结

  通过 Mybatis 入门示例,我们发现使用 Mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 Mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 JDBC 方便多了。

  使用注解之后,将变得更为简单,只需要编写一个 Mybatis 配置文件。

  后面讲解一些 Mybatis 的基本使用:https://blog.csdn.net/q961250375/article/details/102766074。

继续阅读