Mybatis学习(一)-mybatis入门案例

一、Mybatis概述

1.1、mybatis简介

1)MyBatis 是支持定制化 SQL、存储过程以及高级 映射的优秀的持久层框架。

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

3)MyBatis可以使用简单的XML或注解用于配置和原 始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记 录

1.2、MyBatis历史

1)原是Apache的一个开源项目iBatis, 2010年6月这 个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github

2)iBatis一词来源于“internet”和“abatis”的组合,是 一个基于Java的持久层框架。 iBatis提供的持久 层框架包括SQL Maps和Data Access Objects (DAO)

1.3、为什么要使用MyBatis

1)MyBatis是一个半自动化的持久化层框架

2)JDBC

  • SQL夹在Java代码块里,耦合度高导致硬编码内伤
  • 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
package com.dianchou.dao;

import java.sql.*;

/**
 * @author lawrence
 * @create 2020-07-10 17:41
 */
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/mybatis?characterEncoding=utf-8", "root", "123456");
            //定义sql语句
            String sql = "select * from user where name = ?";
            //获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "AA");
            //向数据库发出 sql 执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            //遍历查询结果集
            while (resultSet.next()) {
                System.out.println("id = " + resultSet.getString("id") + ", name = " + resultSet.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if(resultSet != null){
                try {
                    resultSet.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(preparedStatement != null){
                try {
                    preparedStatement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

        }


    }
}
View Code

3)Hibernate和JPA

  • 长难复杂SQL,对于Hibernate而言处理也不容易
  • 内部自动生产的SQL,不容易做特殊优化。
  • 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。

image

4)对开发人员而言,核心sql还是需要自己优化

image

5)sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据

1.4、相关网站

官方中文:https://mybatis.org/mybatis-3/zh/getting-started.html

github:https://github.com/mybatis/mybatis-3/

二、搭建 Mybatis 开发环境

2.1、创建maven工程

可以先先出src目录,使其成为一个空project,然后创建module

image

2.2、创建依赖坐标

在父工程pom文件中添加依赖


<!--父工程-->
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>

2.3、创建测试表

CREATE TABLE employee(
	id	INT PRIMARY key,
	last_name VARCHAR(30) NOT null,
	email VARCHAR(30) NOT null,
	gender VARCHAR(30) NOT null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

测试数据:

image

2.4、创建对应的实体类

package com.dianchou.bean;

/**
 * @author lawrence
 * @create 2020-07-10 19:32
 */
public class Employee {
    private Integer id;
    private String lastName; //注意:与数据表字段不一样,可以使用别名
    private String email;
    private String gender;

    public Employee() {
    }

    public Employee(Integer id, String lastName, String email, String gender) {
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

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

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

2.5、编写持久层接口EmployMappper

package com.dianchou.dao;

import com.dianchou.bean.Employee;

import java.util.List;

/**
 * @author lawrence
 * @create 2020-07-10 19:36
 */
public interface EmployeeMapper {

    //获取全部emp对象
    List<Employee> getEmps();
}

2.6、编写持久层接口的映射文件EmployMappper.xml

创建位置:必须和持久层接口在相同的包中。

名称:必须以持久层接口名称命名文件名,扩展名是.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.dianchou.dao.EmployeeMapper">
    <select id="getEmps" resultType="com.dianchou.bean.Employee">
        select * from employee
    </select>
</mapper>

2.7、创建mybatis全局配置文件

<?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>
    <!-- 配置 mybatis 的环境 -->
    <environments default="development">
        <!-- 配置 mysql 的环境 -->
        <environment id="development">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置连接数据库的信息:用的是数据源(连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--sql映射文件一定要注册到全局配置文件中-->
    <mappers>
        <mapper resource="com/dianchou/dao/EmployeeMapper.xml"></mapper>
    </mappers>

</configuration>

2.8、加入log4j配置文件

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

2.9、编写测试代码

@Test
public void test01() throws IOException {
    //1.读取配置文件
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    //2.创建SqlSessionFactory构建者对象
    SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();
    //3.创建SqlSessionFactory
    SqlSessionFactory factory = builder.build(in);
    //4.使用 SqlSessionFactory 生产 SqlSession 对象
    SqlSession sqlSession = factory.openSession();
    //5.使用 SqlSession 创建 dao 接口的代理对象
    EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
    //6.使用代理对象执行查询所有方法
    List<Employee> emps = mapper.getEmps();
    for (Employee emp : emps) {
        System.out.println(emp);
    }
    //7.释放资源
    sqlSession.close();
    in.close();
}

问题出现:

image

2.10、整体目录结构

image

2.11、基于注解方法

1)接口添加注解

public interface EmployeeMapper {

    //获取全部emp对象
    @Select("select * from employee")
    List<Employee> getEmps();
}

2)修改主配置文件

在使用基于注解的 Mybatis 配置时,请移除 xml 的sql映射配置

<!--sql映射文件一定要注册到全局配置文件中-->
<mappers>
    <mapper class="com.dianchou.dao.EmployeeMapper"></mapper>
</mappers>
posted @ 2020-07-10 16:12  运维人在路上  阅读(236)  评论(0编辑  收藏  举报