01【MyBatis-快速入门】

发布于:2022-11-16 ⋅ 阅读:(820) ⋅ 点赞:(0)

一、MyBatis 快速入门

1.1 MyBatis简介

1.1.1 传统JDBC开发的弊端

传统的JDBC开发如下步骤如下:

  • 1)注册驱动
  • 2)获取连接(Connection)
  • 3)获取语句对象(Statement、PreaparedStatement)
  • 4)获取结果集(ResultSet)
  • 5)封装到JavaBean(非常麻烦)
  • 6)释放资源

public class Demo01 {

    public static void main(String[] args) throws SQLException {
        
        // 1、加载和注册驱动(jdbc4以后不需要)
        // Class.forName("com.mysql.jdbc.Driver");
        
        // 2、使用用户名、密码、URL得到连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04", "root", "admin");
		
        // 3、创建语句对象
        Statement statement = conn.createStatement();
        
        // 4、执行SQL语句,返回结果集
        ResultSet rs = statement.executeQuery("select * from dept inner join user on d.id=user.dept_id");
        
        //遍历结果集
        while (rs.next()) {
			// 取出每一行的数据,封装到JavaBean中
        }
        
        //释放资源
        rs.close();
        statement.close();
        conn.close();
    }
}

我们之前一直使用的是JDBC来操作数据,存在如下几个问题:

  • 1)步骤太过繁琐,每一次的SQL语句执行都需要重复上面几个步骤
  • 2)SQL语句存在硬编码,SQL语句和Java代码耦合在一起,如果SQL语句变动需要修改源代码,重新编译、发布
  • 3)结果集处理太过繁琐,需要一个一个手动设置值,在列数非常多的情况下,非常麻烦
  • 4)无法建立关系映射,如一对多、多对多等关系无法建立,例如一个部门里面有很多员工,查询出来的数据无法自动映射到部门里面的员工,只能自己手动映射
  • 5)实现动态SQL非常麻烦,如果SQL语句是根据前端传递的参数动态的变化,那么我们需要编写很多个if条件来实现不同的SQL语句生成;
  • 6)频繁创建和释放数据库连接对象,非常容易造成系统资源的浪费,我们可以使用连接池(数据源)等技术来帮我们实现,MyBatis自带数据源;

1.1.2 MyBatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

MyBatis是对JDBC的封装,让我们操作数据库更加的方便、快捷,而不需把时间和精力浪费在如何封装结果集、如何注册驱动、如何获取连接上面;

总而言之,MyBaits就是用于简化我们DAO层的开发、在此之外还提供其他一些高级特性,例如动态SQL、一级缓存、二级缓存、日志管理、多表级联查询、批处理等

MyBatis官网:https://mybatis.org/mybatis-3/zh/index.html

在这里插入图片描述

Github官网:https://github.com/mybatis/mybatis-3/releases

在这里插入图片描述

1.2 MyBatis环境搭建

1.2.1 创建测试表

create database test;

use test;

drop table if exists emp;

CREATE TABLE `emp`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '员工年龄',
  `addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯',
  `salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪资',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 ;

INSERT INTO `emp` VALUES (1, '张三', 20, '广西来宾', 7600.00);
INSERT INTO `emp` VALUES (2, '李四', 22, '浙江绍兴', 6800.00);
INSERT INTO `emp` VALUES (3, '小明', 25, '广东云浮', 6600.00);
INSERT INTO `emp` VALUES (4, '小红', 23, '河南信阳', 7000.00);
INSERT INTO `emp` VALUES (5, '张明', 25, '山东临沂', 8000.00);

1.2.2 搭建项目

1)引入依赖

<?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.dfbz</groupId>
    <artifactId>01_MyBatis_快速入门</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

        <!--日志依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--测试单元-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>
</project>

2)实体类

package com.dfbz.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Integer id;
    private String name;
    private Integer age;
    private String addr;
    private Double salary;

}

3)创建MyBatis核心配置文件

在resources目录下创建一个配置文件(名称随意):

在这里插入图片描述

<?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> 
</configuration> 

有的人这里会识别不到约束,按住Alt+Enter键:

在这里插入图片描述

配置文件如下:

<?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>
    <!--日志配置-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <!--  default 默认使用那个运行环境 -->
    <environments default="dev">
        <!--配置dev运行环境-->
        <environment id="dev">
            <!--事务管理器:JDBC事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED指定采用mybatis内置的连接池支持-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF8"></property>
                <property name="username" value="root"></property>
                <property name="password" value="admin"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>

4)IDEA配置代码模板

我们在使用MyBatis时,都要创建一个MyBatis的核心配置文件,然后写上上面的配置,为此我们可以配置一个代码模板;

在这里插入图片描述

再次打开右键菜单,发现多了一个MyBatisConfig选项:

在这里插入图片描述

1.2.3 dao接口

package com.dfbz.dao;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
import com.dfbz.entity.Emp;

import java.util.List;

public interface EmpDao {
    List<Emp> findAll();
}

1.2.4 接口映射文件

在与Dao接口的同级目录下创建个映射文件:EmpDao.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">

<!--namespace 名称空间,指定对哪个接口进行映射-->
<mapper namespace="com.dfbz.dao.EmpDao">
    <!--
        select 表示执行查询sql
            id 唯一; 必须与接口中方法名称一致。
            resultType 表示执行查询SQL封装的实体类对象。如果放回集合,只需要指定集合中元素的类型即可。
            标签体中存放要执行的select语句 
    -->
    <select id="findAll" resultType="com.dfbz.entity.Emp">
        select * from emp
    </select>
</mapper>

Tips:使用之前同样的方法,创建一个代码模板,保存上述的代码;

1.2.5 加载接口映射文件

在这里插入图片描述

<mappers>
    <!--加载mapper映射文件-->
    <mapper resource="com/dfbz/dao/EmpDao.xml"></mapper>
</mappers>

1.3 测试类

  • 测试代码:
package com.dfbz.demo;

import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01_快速入门测试 {

    @Test
    public void test1() throws Exception {

        // 1. 加载mybatis的核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        // 2. 根据核心配置文件创建一个SqlSession工厂
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(is);

        // 3. 使用工厂对象创建SqlSession
        SqlSession session = sessionFactory.openSession();

        // 4. 通过session获取对应的Mapper对象
        EmpDao empDao = session.getMapper(EmpDao.class);

        // 5. 调用方法执行查询
        List<Emp> userList = empDao.findAll();

        for (Emp emp : userList) {
            System.out.println(emp);
        }

        is.close();
        session.close();
    }
}
本文含有隐藏内容,请 开通VIP 后查看