Java进阶篇——MyBatis框架的初步认识与简单使用

文章目录



前言

随着互联网技术的快速发展,对于我们这些java开发工程师的而言每一个web项目都离不开框架的使用,在刚结束掉第一阶段的JavaSE的学习后,现在正式开始进军Java进阶篇,以下是本人最近几日通过自学学到的一些关于SSM框架中MyBatis框架的知识,通过对一些简单的操作来进行一个学习总结,如果有帮助,请留下一个大指姆以示鼓励~~~


提示:以下是本篇文章正文内容,下面案例可供参考

一、框架的介绍

(1)框架的概念

介绍:所谓框架,我们可以把它看做是软件的半成品,它完成了软件开发过程中通用的操作,程序员仅仅需要少有的加工过程即可,从而减少了开发者的步骤以此提高了开发效率。

(2)常见的框架(服务端)

2.1、MVC框架部分

说明:简化Servelet开发步骤的框架,主要是与服务器打交道,常见的框架有以下:

  1. Struts2
  2. SpringMVC

2.2、持久层框架部分

说明:该框架主要是完成对数据库的操作,几乎替代了JDBC技术的使用,常见的框架有以下:

  1. apache DBUtils
  2. Hibernate
  3. Spring JPA
  4. MyBatis

2.3、胶水框架

说明:顾名思义,用于粘合的框架,该部分的内容会较多,需要熟悉的话,建议去百度,一时半会儿我也扯不清。该类的具体框架如下:

  1. Spring

(3)SSM框架是什么?

在当前的JavaWeb(企业级信息系统开发+互联网开发)开发领域每个工程师都需要掌握与熟知的一项框架技术,SSM框架具体是指 MVC 框架中的 SpringMVC ,持久层框架中的MyBatis框架 以及 Spring框架作为其胶水框架,用于粘合SpringMVC与 MyBatis ,因此 SSM=SpringMVC+Spring+MyBatis。 今天我带来的内容是其中的MyBatis框架的简单介绍与使用。

二、MyBatis框架的介绍与使用

(1)MyBatis框架的介绍

1、MyBatis框架的前身是iBatis框架,他是一个半自动的ORM框架
2、ORM的介绍:ORM(Object Relational Mapping)对象关系映射时,将Java中的一个对象与数据表中的记录一 一对应。ORM框架提供了实体类与数据类表的映射关系通过映射文件(mapper.xml,类似于接口的实现类接下来会讲)的配置实现对象的持久化。

(2)MyBatis框架的特点

1、支持自定义SQL存储过程
2、对原有的JDBC代码进行封装,几乎消除了所有JDBC代码,让开发者只关注SQL本身
3、支持XML与注解配置方式自定义完成ORM操作,从而实现了映射。
映射的说明:所谓映射就是对象的属性对应的数据表的的关系。(如果不明白,后面通过案例说明)

三、MyBatis框架的使用

说了这么多,接下来 我们就开始正式走进它吧~~

(1)MyBatis框架的部署(即:将框架引入到我们的项目中)

1.1、创建Maven项目

在这里插入图片描述

在这里插入图片描述

项目结构如下

在这里插入图片描述

1.2、在pom.xml中添加需要的依赖

所需要的依赖都可以在官网去下载,作为一个开发者要熟知这些操作
官网地址:https://mvnrepository.com/

添加需要的Mysql依赖,之前说过了MyBatis是一个ORM框架,主要是与数据库打交道的所以我们需要对应的数据库依赖

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加需要的Mybais依赖(与上面的操作一样)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里 由于我已经写好了项目,我就将所有需要配置的依赖全部发出来吧,方便后面的项目运行

<?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.yzy</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>


        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

1.3、创建一个数据表的实验对象【可以使用可视化工具Navicat】

创建一个学生表 tb_students
在这里插入图片描述
可视化结果
在这里插入图片描述

1.4、创建MyBatis配置文件【mybatis-config】(后期需要使用的数据源)

在resource中创建 mybatis-config.xml
在这里插入图片描述
在这里插入图片描述

<?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>
    
    <!--在environment配置数据库连接信息-->
    <!--在environment标签中可以定义多个environment标签,每个environment标签都可以定义一套连接配置-->
    <!--default属性,用来指定使用哪个environment标签-->
    <!---->
    <environments default="mysql">
        <environment id="mysql">
            <!--transactionManager标签用于配置数据库管理方式-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSouce标签用来配置数据库连接信息-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/java2107?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--将映射文件StudentMapper添加到主配置文件mybatis-config.xml文件中-->
    <mappers>
        <mapper resource="mappers/StudentMapper.xml"></mapper>
    </mappers>

</configuration>

1.5 创建实体类对象【Student】与 DAO接口【StudentDAO】

实体类Student对象代码如下
在这里插入图片描述

@Data
@AllArgsConstructor//带有全部参数的构造器
@NoArgsConstructor//带有无参的构造器
@ToString//ToString 方法
public class Student {
    /**
     * 注意 实体类中的属性要与数据库中的字段类型与数量相匹配
     */
    private int stuId;
    private String stuNum;
    private String stuName;
    private String stuGender;
    private int stuAge;
}

StudentDAO接口
在这里插入图片描述

public interface StudentDAO {
    //MyBatis 进行操作
    /*
    1、如果操作方法具有一个简单的类型或者字符串类型的参数,在Mapper配置中可以直接通过#{str}直接获取
    2、如果操作方法有一个对象类型的参数,在Mapper配置中可以直接通过#{attrName}获取对象的指定属性值(attrName必须是参数对象的属性)
    3、如果操作方法有一个Map类型的参数,在Mapper配置中可以直接通过#{key}获取key对应的value
    4、如果操作方法有多个参数,..........
     */

    public int insertStudent(Student student);
    public int deleteStudent(int stuId);
    public int updateStudent(Student student);
    public List<Student> listStudents();
    public Student queryStudent(String stuNum);
    public List<Student> listStudentsByPage(@Param("start") int start,
                                            @Param("pageSize") int pageSize);

    //获取数据数目
    public int count();


}

1.6、创建DAO接口的映射文件

在rusource文件下创建mapper文件夹,再在文件夹下创建【StudentMapper.xml】

在这里插入图片描述
在这里插入图片描述

StudentMapper.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文件相当于DAO接口的“实现类” ,namespace属性要制定实现的DAO接口的全限定名-->
<mapper namespace="com.yzy.dao.StudentDAO"><!--namespace 后面跟需要实现的接口对象的路径 -->

    <!--useGeneratedKeys 设置添加操作是否需要回填生成的主键-->
    <!--keyProperty 设置会填的主键值赋值到参数对象的那个属性-->
    <insert id="insertStudent" useGeneratedKeys="true" keyProperty="stuId">
        insert into tb_students(stu_num,stu_name,stu_gender,stu_age)
        values (#{stuNum},#{stuName},#{stuGender},#{stuAge})
    </insert>
    <delete id="deleteStudent" >
        delete from tb_students where stu_num=#{stuNum}
    </delete>
    <update id="updateStudent">
        update  tb_students
        set
           stu_name=#{stuName},
           stu_gender=#{stuGender},
           stu_age=#{stuAge}
        where
           stu_Num=#{stuNum}
    </update>

    <!--resultType 指定该查询结果封装的对象的实体类-->
    <!--resuletSets 指定当前的操作返回的集合类型(可以省略)-->
    <!--第一种查询方式
    <select id="listStudents" resultType="com.yzy.pojo.Student" >
        select sid stuId,stu_num stuNum,stu_name stuName,stu_gender stuGender,stu_age stuAge
        from tb_students
    </select>
    -->
    <!--第二种查询方式 ,通过定义映射关系-->
    <!--resultMap用于定义实体类与数据表与数据表的映射关系(ORM)-->
    <resultMap id="studentMap" type="com.yzy.pojo.Student">
        <id column="sid" property="stuId"/>
        <result column="stu_num" property="stuNum"/>
        <result column="stu_name" property="stuName"/>
        <result column="stu_gender" property="stuGender"/>
        <result column="stu_age" property="stuAge"/>
    </resultMap>

    <!--resultMap 用于引用一个实体的映射关系,当配置resultMap之后 resultType就可以省略-->
    <select id="listStudents" resultMap="studentMap" >
        select sid ,stu_num,stu_name ,stu_gender ,stu_age
        from tb_students
    </select>

    <select id="queryStudent" resultMap="studentMap">
         select sid,stu_num,stu_name,stu_gender,stu_age from tb_students where sid=#{stuNum}
    </select>

    <select id="listStudentsByPage" resultMap="studentMap">
         select  sid,stu_num,stu_name,stu_gender,stu_age
         from tb_students
         limit #{start},#{pageSize}
    </select>

    <select id="count" resultType="int">
        select count(1) from tb_students
    </select>
</mapper>

说明:StudentMapper.xml文件下的 id中的名字必须和DAO接口中的抽象方法名字一模一样

在这里插入图片描述

四、单元测试(测试以上的代码)

添加单元测试的依赖(前面已经把所有需要的依赖全部发了出来)
在这里插入图片描述

在这里插入图片描述

测试 insertStudent

在这里插入图片描述

 @Test
    public void insertStudent() {
        //加载MyBatis配置文件

            //会话(连接)
            SqlSession sqlSession= MyBatisUtil.getSqlSession();
            //通过会话获取DAO对象
            StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
            //测试studentDAO中的方法
            int i=studentDAO.insertStudent(new Student(0,"00003","陈留","女",22));
            sqlSession.commit();//进行事务提交
            System.out.println("受影响的行数:"+i);

    }

测试deleteStudent

在这里插入图片描述

 @Test
    public void deleteStudent() {
        //加载MyBatis配置文件
        try {
            //获取数据源
           InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //会话工厂  SqlSessionFactory表示MyBatis的会话工厂
            SqlSessionFactory factory=builder.build(is);
            //会话(连接),SqlSession代表着Mybatis与数据的会话,所谓会话就是 连接 的意思,而SqlSession是通过工厂会话模式获取
            SqlSession sqlSession=factory.openSession();
            //通过会话获取DAO对象,通过MyBatis提供的sqlSession调用getMapper获取DAO接口对象,括号中填 需要 具体指向的DAO对象
            StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
            //测试studentDAO中的方法
            int i=studentDAO.deleteStudent(1);
            sqlSession.commit();//进行事务提交
            System.out.println("受影响的行数:"+i);
        } catch (IOException e) {     e.printStackTrace();
       }
   }

测试updateStudent

在这里插入图片描述

 @Test
    public void updateStudent(){
        //修改表记录
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //会话工厂
            SqlSessionFactory factory=builder.build(is);
            //会话(连接)
            SqlSession sqlSession=factory.openSession();
            //通过会话获取DAO对象
            StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
            //测试studentDAO中的方法
            int i=studentDAO.updateStudent(new Student(0,"00001","王文","女",20));
            sqlSession.commit();//进行事务提交
            System.out.println("受影响的行数:"+i);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

测试listStudents

在这里插入图片描述

@Test
    public void listStudents(){
        //查询表中信息
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //会话工厂
            SqlSessionFactory factory=builder.build(is);
            //会话(连接)
            SqlSession sqlSession=factory.openSession();
            //通过会话获取DAO对象
            StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);

            List<Student> list = studentDAO.listStudents();

            for (Student lis: list) {
                System.out.println(lis);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

测试 QueryStudents

在这里插入图片描述

    @Test
    public void QueryStudents(){
        //根据组件查询一条信息
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //会话工厂
            SqlSessionFactory factory=builder.build(is);
            //会话(连接)
            SqlSession sqlSession=factory.openSession();
            //通过会话获取DAO对象
            StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);

            Student student = studentDAO.queryStudent("00001");
            System.out.println(student);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

测试listStudentByPage

在这里插入图片描述

 @Test
    public void listStudentByPage(){
        try {
            //1、获取数据源
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //2、通过sql对话创建者工厂创建一个 build对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //3、通过工厂创建者对象 builder 来创建一个 会话工厂
            SqlSessionFactory factory = builder.build(is);
            //4、通过会话工厂来连接会话
            SqlSession sqlSession = factory.openSession();
            //5、通过会话获取DAO对象,通过MyBatis提供的sqlSession调用getMapper获取DAO接口对象的class文件,括号中填 需要 具体指向的DAO对象
            StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
            List<Student> students = studentDAO.listStudentsByPage(0, 3);
            for (Student list: students) {
                System.out.println(list);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

测试getCount

在这里插入图片描述

@Test
    public void getCount(){

        try {
            //1、获取数据源
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //2、通过工厂创建者来创建一个会话工厂
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //3、通过工厂创建者builder来创建一个会话
            SqlSessionFactory factory = builder.build(is);
            //4、通过会话工厂对象来创建sql会话
            SqlSession sqlSession = factory.openSession();
            //5、通过sqlSession来获取StudentDAO类的映射文件
            StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
            int nums = studentDAO.count();
            System.out.println("数据库中的学生一共有:"+nums);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


# 补充部分 >封装工具类 >说明:该部分为扩展部分,看不懂不强求,毕竟今天的内容是简单了解MyBatis即可,这个工具类是为了方便代码的使用,为了简化在测试类中对工厂部分的简化,其中第一个插入方法我已经使用了这个工具类,是能运行的。该方法的操作流程类似于JDBC的封装技术

在这里插入图片描述

在这里插入图片描述

package com.yzy.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;

public class MyBatisUtil {
    private static SqlSessionFactory factory;
    private static final ThreadLocal<SqlSession> local=new ThreadLocal<SqlSession>();

    static {
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //会话工厂
            factory=builder.build(is);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        SqlSession sqlSession= local.get();
        if (sqlSession == null){
            sqlSession=factory.openSession();
            local.set(sqlSession);
        }
        return sqlSession;
    }
    public static <T extends Object> T getMapper(Class<T> c){
        SqlSession sqlSession=getSqlSession();
        return sqlSession.getMapper(c);

    }
}

总结

如果代码和我是一样的话,应该不会出什么问题,如果有问题就留下评论,我会及时回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sugar-free->小粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值