SSM框架学习之MyBatis(一)

更新时间:2020-10-28 16:22:52点击次数:273次
前言
从今天开始,我们将开启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项目的步骤:
创建maven工程,并导入坐标(默认已经创建了数据库和表)
创建mybatis的主配置文件mybatis-config.xml
创建数据库配置文件db.properties
创建实体类和Dao的接口
创建映射配置文件,UserMapper.xml
测试
这里还加了一个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 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
最后得到如下的目录以及文件结构

环境搭建的注意事项:

在mybatis中它把持久层的操作接口名称和映射文件也叫Mapper
在idea中创建目录的时候,和包不一样,包是三级目录,目录是一级
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.查看日志打印的结果


本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息