SSM框架学习之MyBatis(一)

前言

从今天开始,我们将开启SSM框架的学习,让我们先了解一下什么是MyBatis?

1.简介

  • 持久层框架

  • 几乎避免了所以JDBC代码和手动设置参数以及获取结果集

    使用了ORM思想,实现了结果集的封装

  • ORM:object Relational Mapping 对象关系映射

把数据库表和实体类以及实体类的属性对应起来

让我们可以操作实体类就实现操作数据库表

2.Mybatis环境搭建
在用idea创建Maven的时候,要在pom.xml中导入依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>

依赖可以在maven的仓库或者Mybatis的官网(https://mybatis.org/mybatis-3/zh/getting-started.html)里面找到。

注意:因为是使用JDBC连接MySQL数据库,所以这里还要导入一个MySQL的依赖,和JDBC连接MySQL一样的。

创建MyBatis项目的步骤:

  1. 创建maven工程,并导入坐标(默认已经创建了数据库和表)
  2. 创建mybatis的主配置文件mybatis-config.xml
  3. 创建数据库配置文件db.properties
  4. 创建实体类和Dao的接口
  5. 创建映射配置文件,UserMapper.xml
  6. 测试

这里还加了一个Junit的单元测试依赖,方便功能测试

<dependencies>
    <!--        mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!--        mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--        Junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

在build中配置resources来防止我们资源导出失败问题

<!--    在build中配置resources来防止我们资源导出失败问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

按如下目录创建包:

在这里插入图片描述
注意:
dao层是存放接口
pojo层是存放实体类
utils层是存放一些加载properties文件的和配置的工具类
test测试中的目录结构最好和dao的目录结构一致

创建数据库:

create database db5;
use db5;
create table user
(
	`id` int primary key comment '编号',
	`username` varchar(20) comment '用户名',
 	`password` varchar(20) comment '密码'
)engine=innodb default charset=utf8
insert into user(id,username,password) values(1,'admin','1234')

在这里插入图片描述

一、在resource目录下创建配置文件

1.mybatis-config.xml

<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"/>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <package name="com.demo.dao.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
<!--    绑定接口-->
    <mappers>
        <mapper class="com.demo.dao.UserMapper"/>
    </mappers>
</configuration>

注意:
1.这个是加载数据库配置文件db.properties

 <properties resource="db.properties"/>

2.这里面是标准的日志设置,和设置有关的放<settings></settings>

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

3.这个是包扫描下路径的别名(在后面UserMapper.xml中会用到)

<typeAliases>
        <package name="com.demo.dao.pojo"/>
</typeAliases>

顺序是这个,不要搞错了!!!

环境设置

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

这里我们也可以看到,Mybatis是在JDBC以及连接池的基础上进行封装处理,还记得我们前面简介中提到的“几乎避免了所以JDBC代码和手动设置参数以及获取结果集”

最重要的是<mappers></mappers>

  <mappers>
        <mapper class="com.demo.dao.UserMapper"/>
 </mappers>

加载的Mapper就是这个路径

2.db.properties
这里就是对数据库的配置(数据库驱动、url、username、password)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db5?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

在这里插入图片描述

二、在idea刚刚创建的包下创建实体类和接口

1.pojo包下 创建user的实体类:

package com.demo.pojo;

/**
 * @author: seh
 * @date: 2020/10/25 9:04
 * @version: 1.0
 */

public class User {
    
    
    private int id;
    private String username;
    private String password;

    public int getId() {
    
    
        return id;
    }

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

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }
}


2.在dao层创建接口:UserMapper
(可以创建UserMapper.xml,也可以使用注解的方式)

dao层主要是放一些功能的接口(CURD)

package com.demo.dao;

import com.demo.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author: seh
 * @date: 2020/10/25 9:06
 * @version: 1.0
 */
public interface UserMapper {
    
    

//    创建一个查询方法
    @Select("select * from user where id = #{id}")
    List<User> queryUserById(@Param("id") int id);
}

注意
@Select是用于查询
@Param(“id”)是参数名,和#{id}对应,基本数据类型中最好使用这个注解
返回值类型是一个List集合类型

3.创建MyBatisUtils的工具类

创建工具类的主要目的是通过调用工具类中的方法完成一些配置

package com.demo.utils;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author: seh
 * @date: 2020/10/14 18:50
 * @version: 1.0
 */
/*
 * 工具类
 *
 * */
public class MybatisUtils {
    
    
    private static SqlSessionFactory sqlSessionFactory;

    static {
    
    
//      1.获取SqlSessionFactory对象
        try {
    
    
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /*
    * 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    * 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    * */
    public static SqlSession getSqlSession() {
    
    

        return sqlSessionFactory.openSession(true);//自动提交事务
    }
}

这么配置的原因是,根据mybatis官网的配置要求,构建 SqlSessionFactory,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder。

而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

最后得到如下的目录以及文件结构

在这里插入图片描述
环境搭建的注意事项:

  1. 在mybatis中它把持久层的操作接口名称和映射文件也叫Mapper
  2. 在idea中创建目录的时候,和包不一样,包是三级目录,目录是一级
  3. mybatis的映射文件位置必须和dao接口的包结构相同

三、创建测试类,进行测试

在这里插入图片描述

package com.demo.dao;

import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author: seh
 * @date: 2020/10/25 9:13
 * @version: 1.0
 */
public class TestCode {
    
    

    @Test
    public void TestQuery(){
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.queryUserById(1);
        for (User user : userList) {
    
    
            System.out.println(user);
        }
        sqlSession.close();
    }
}

注意:
1.在使用完资源以后记得关闭:sqlSession.close();
2.getMapper方法是利用了反射的机制,对Mapper进行扫描

最后我们来看看日志打印的结果是什么
在这里插入图片描述

按照以上步骤,我们创建一个插入的方法

1.在UserMapper中申明一个方法:insertUser(Map map);

package com.demo.dao;
import com.demo.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;

/**
 * @author: seh
 * @date: 2020/10/25 9:06
 * @version: 1.0
 */
public interface UserMapper {
    
    

//    创建一个查询方法
    @Select("select * from user where id = #{id}")
    List<User> queryUserById(@Param("id") int id);

    //创建一个插入的方法
    @Insert("insert into user(id,username,password) values(#{id},#{username},#{password})")
    int insertUser(Map map);
}

这里参数使用的是Map类型,比较万能,推荐使用!

为什么方法返回的是int类型呢?

这就和JDBC有关了,回忆一下,在JDBC中我们的修改,删除和插入返回的值是不是都是int类型呢?

这里的返回值表示影响的行数

2.在测试类中创建一个测试方法

package com.demo.dao;
import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
/**
 * @author: seh
 * @date: 2020/10/25 9:13
 * @version: 1.0
 */
public class TestCode {
    
    

    @Test
    public void TestQuery(){
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.queryUserById(1);
        for (User user : userList) {
    
    
            System.out.println(user);
        }
        sqlSession.close();
    }
    @Test
    public void insertUser(){
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap map = new HashMap();
        map.put("id",2);
        map.put("username","user1");
        map.put("password","1234");
        mapper.insertUser(map);
        sqlSession.close();
    }
}

查看日志打印结果
在这里插入图片描述
查看数据库
在这里插入图片描述
我们确实已经插入成功了!!!

最后,我们再来创建一个查询全部用户的方法

1.在userMapper中,申明一个findAll()方法

    @Select("select * from user")
    List<User> findAll();

2.在TestCode测试类中,创建测试方法

@Test
    public void findAll(){
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findAll();
        for (User user : list) {
    
    
            System.out.println(user);
        }
        sqlSession.close();
    }

3.查看日志打印的结果
在这里插入图片描述
本文描述了Mybatis的作用以及如何创建一个简单的MyBatis项目,在后续的文章中将介绍如何使用UserMapper.xml以及日志、缓存、MyBatis-Plus等内容,请持续关注!!!

获取本节内容的原码以及更多宝贵的编程资源,请关注:
在这里插入图片描述
求一键三连!!!QAQ

猜你喜欢

转载自blog.csdn.net/weixin_45088667/article/details/109269683