初识MyBatis——构建第一个MyBatis工程

1. 什么是MyBatis

        MyBatis是一个基于java的持久层框架,它的底层封装了jdbc,使我们不用与jdbc api打交道,就可以完成数据库持久层的操作。使用MyBatis框架,开发者只需要关注sql语句本身,不必像传统jdbc编程那样,花费大量时间处理加载驱动、创建连接、创建statement、执行查询、遍历结果集、释放资源等一系列重复步骤。

        MyBatis采用ORM思想(object   relational   mapping  对象关系映射),解决实体和数据库之间的映射问题。

           * O:面向对象领域的Object(JavaBean对象)

           * R:关系数据库领域的Relational(表的结构)

           * M:映射Mapping(XML的配置文件)

        MyBatis通过xml或注解的方式将要执行的各种sql配置起来,并通过MyBatis框架执行该sql语句,将结果映射成java对象返回。

2. JDBC程序回顾

        为了便于阅读和理解,此处对jdbc查询数据库表数据的操作进行回顾

    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/mybatis?characterEncoding=utf-8","root", "root");
            //定义 sql 语句 ?表示占位符
            String sql = "select * from user where username = ?";
            //获取预处理 statement
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, "张三");
            // 查询数据库,获取结果集
            resultSet = preparedStatement.executeQuery();
            //遍历结果集
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+resultSet.getString("username"));
            }
        }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();
                }
            }
        }
    }

问题分析:

  1. 每执行一次数据库操作,创建一次数据库连接。频繁创建数据库连接和释放资源,会造成系统资源的浪费,影响系统的性能。(使用连接池可以解决该问题,后面文章会有补充
  2. 在java程序中对sql语句进行硬编码,sql变动,需要对java代码进行维护,维护成本高。
  3. prepareStatement中使用“?”做占位符,sql中的where条件参数不固定,当遇到需要修改参数个数的时候,修改sql还需要维护java代码,系统维护不易
  4. 对结果集的解析存在硬编码,sql 变化导致解析代码变化,系统不易维护。

3. MyBatis框架入门

3.1 创建Maven工程

初识MyBatis——构建第一个MyBatis工程_第1张图片

3.2 添加pom文件坐标依赖

首先添加打包方式,以jar的方式进行打包

    
    jar

然后添加依赖坐标,主要添加mysql(数据库)、mybatis(持久层框架)、log4j(日志)和junit(单元测试)的依赖

    
        
            org.mybatis
            mybatis
            3.5.4
        
        
            mysql
            mysql-connector-java
            8.0.19
        
        
            log4j
            log4j
            1.2.17
        
        
            junit
            junit
            3.8.2
            test
        
    

3.3 编写User实体类

主要包含姓名、年龄、联系方式和住址4个信息。其中getter,setter和toString方法可以通过右键-generater...使用IDE自动生成。

package com.aifocus.domain;

import java.io.Serializable;

public class UserInfo implements Serializable {
    /**
     * 姓名
     */
    String userName;
    /**
     * 年龄
     */
    int age;
    /**
     * 联系方式
     */
    String phoneNumber;
    /**
     * 地址
     */
    String address;

    public String getUserName() {
        return userName;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

3.4 编写实体层接口UserMapper

该接口用于查询userinfo表中的所有用户信息

package com.aifocus.dao;

import com.aifocus.domain.UserInfo;

import java.util.List;

/**
 * 用户信息持久层接口
 */
public interface UserInfoMapper {
    /**
     * 查询所有用户信息
     * @return 用户信息列表
     */
    List findAll();
}

3.5 编写持久层接口映射文件UserMapper.xml

注意:resources路径下对应的包路径,无法使用“.”做分割,com/aifocus/dao需要分别创建(类似文件夹创建)

初识MyBatis——构建第一个MyBatis工程_第2张图片

添加UserInfoMapper.xml文件的Mapper约束



 

编写findAll的sql查询语句


    

其中,中的namespace表示该配置文件对应的接口文件,