【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

前言

一、准备工作

1.1、下载MyBatis

1.2、数据库设计

二、搭建框架

2.1、创建Maven项目

2.2、jar包、引入依赖

2.3、创建MyBatis核心配置文件

2.4、映射文件

2.5、通过junit测试功能

2.6、框架优化

三、增删改查+优化

四、小结——注意事项


前言

        本篇全程从0到1搭建MyBatis框架,连接MySQL,以向数据库中插入一条信息为例进行使用,再到最后的优化,绝对的一条龙服务~


一、准备工作

1.1、下载MyBatis

MyBatis下载地址:GitHub – mybatis/mybatis-3: MyBatis SQL mapper framework for Java

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

 注意:这里的mybatis版本之间差异不是很大,可以自己选择版本,本篇以3.5.7为例;安装位置就放在一个你能找到的地方就ok;

1.2、数据库设计

这里以向用户表插入信息为例,搭建MyBatis框架;

(1)、用MySQL创建一个库名为:ssm;

(2)、在ssm数据库下创建一个表,名为user的用户表,sql语句如下:

create table user(id int, username varchar(20), password varchar(20));

二、搭建框架

2.1、创建Maven项目

创建Maven项目基本上就是把项目名自定义一下,然后一路next就完事了;

2.2、jar包、引入依赖

都是在pom.xml的project中加入:

jar包:

    <packaging>jar</packaging>

 引入依赖:

    <dependencies>
        <!-- Mybatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
            <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
    </dependencies>

2.3、创建MyBatis核心配置文件

        习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略;

用处:用来连接数据库以及全局配置信息;

核心配置文件存放的位置是src/main/resources目录下,如下:

注意:所有的配置文件都放在resources文件下

【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>
    <!--配置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1111"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--这里需要引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/> 
    </mappers>
</configuration>

这里直接复制粘贴即可,别忘记输入你的数据库名称和密码以及url,如下图:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

2.4、映射文件

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

这里需要映射什么呢,就是我们所要插入信息的用户表,所以还需要在java中创建一个用户表,如下:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

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

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User() {
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

那怎么样才能通过mybatis实现与数据库的交互呢?我们可以提供一个公开的接口供MyBatis使用,如下:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

解释:

        MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类;

        为什么可以这么做呢,还记得JDBC实现与数据库的连接吗,咱们用MyBatis就可以不用像JDBC那一套那么繁琐,按照规定,我们只需要提供一个接口即可;

如何将这个接口和刚刚创建的映射文件关联起来呢?接着往下看!

映射文件UserMapper.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.bite.mybatis.mapper.UserMapper"> <!--这里建立映射关系-->
<!--
    mapper接口和映射文件要保证两个一致
    1.mapper接口的全类名和映射文件的namespace一致
    2.mapper接口中的方法的方法名要和映射文件的sql的id一致
-->
    <!--int insertUser();-->
    <insert id="insertUser">
        insert into user values(null, "admin", "123");
    </insert>
</mapper

解释:

        这里的<mapper namespace=”com.bite.mybatis.mapper.UserMapper”> 就是在建立映射关系(注意看代码中的注释,那是我们需要格外注意的地方,否则就会报错!),然后将你想要写的sql语句写在这个标签下即可,仔细观察你会发现,不是直接将sql语句写入其中,而是通过一个inser的标签,实际上这个标签就表明了你要对这个表进行一个什么操作,MyBatis不仅提供了这个insert,还有很多其他方法,如下图:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

咱们只需要将我们所要实现的逻辑(sql语句), 写入对应功能的标签下即可,例如select标签就是查询功能,那咱们只需要在这个标签下写查询的sql语句即可;

这里我的是插入功能,那么这里所需要的sql代码就是插入逻辑,向user表中插入数据;

insert标签后面的id熟悉是什么?

        这便是我们需要像MyBatis提供的接口;

2.5、通过junit测试功能

在java文件下创建如下目录结构,用于测试;

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

测试代码如下:(解释都在注释中)


import com.bite.mybatis.mapper.UserMapper;
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.IOException;
import java.io.InputStream;

public class MyBatisTest {
    @Test
    public void testInsert() throws IOException {
        //获取核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sql的会话对象SqlSession,是MyBatis提供操作数据库的对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserMapper类的代理实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用mapper接口中的方法,实现添加用户信息的功能
        int result = mapper.insertUser();
        System.out.println("结果:" + result);
        //提交事务(若没有commit,只会插入表中,但是不显示插入结果)
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}

执行结果:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

2.6、框架优化

优化一:自动提交事务(commit)

        上面我们提到,若不写commit方法,是不会自动提交sql语句的,并且每次此提交都要写是很麻烦的,实际上我们在创建SqlSession会话的时候是可以指定是否自动提交的,只需要在openSession构造参数中填写true,即可实现自动提交事务~

如下代码:


import com.bite.mybatis.mapper.UserMapper;
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.IOException;
import java.io.InputStream;

public class MyBatisTest {
    @Test
    public void testInsert() throws IOException {
        //获取核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sql的会话对象SqlSession(不会自动提交事务,如下),是MyBatis提供操作数据库的对象
        //SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取sql的会话对象SqlSession(会自动提交事务,如下),是MyBatis提供操作数据库的对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取UserMapper类的代理实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用mapper接口中的方法,实现添加用户信息的功能
        int result = mapper.insertUser();
        System.out.println("结果:" + result);
        //提交事务(若没有commit,只会插入表中,但是不显示插入结果)
        //sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}

优化二:日志功能

        日志功能就是可以在我们执行代码后,会给打印一些日志信息,如:执行的sql代码,修改了几行…等等;

(1)首先先向pom.xml中加入log4j依赖

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

(2)向resources中添加如下配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

注意:如下图,这里标红,是没事的,直接点击运行没有关系:

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

执行效果: 

【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)


三、增删改查+优化

        框架优化中讲到MyBatisTest的设计,你每写一个增加、删除等功能,都需要把获取SqlSession这套流程再写一遍,相当麻烦,因此我们可以把这条流程封装成一个方法getSqlSession()专门用来获取SqlSession对象;对应的,如果我们需要实现某一功能,例如删除功能,我们就可以另外写一个@Test测试方法进行测试,方法中,通过代理实现类对象UserMapper实现对应功能即可;

如下代码:(增删改查)

SqlSessionUtil.java中实现获取SqlSession流程,以及对应的测试方法,如下:

import com.bite.mybatis.mapper.UserMapper;
import com.bite.mybatis.pojo.User;
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 javax.xml.ws.RequestWrapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class SqlSessionUtil {
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try {
            //获取核心配置文件的输入流
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            //获取建造工厂方法
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //获取工厂对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
            //获取SqlSession对象(设置参数为true,自动提交)
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

    //修改数据功能
    @Test
    public void testUpdate() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser();
        sqlSession.close();
    }

    //删除数据
    @Test
    public void testDelete() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUser();
        sqlSession.close();
    }

    //查询
    @Test
    public void testGetUserById() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById();
        System.out.println(user);
        sqlSession.close();
    }

    //查询所有
    @Test
    public void testGetAllUser() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.getAllUser();
        list.forEach(System.out::println);
    }
}

UserMapper.java中实现对应功能的接口


import com.bite.mybatis.pojo.User;

import java.util.List;

public interface UserMapper {
    //添加用户信息
    int insertUser();
    //修改用户信息
    void updateUser();
    //删除用户信息
    void deleteUser();
    //查找数据
    User getUserById();
    //查询所有用户信息
    List<User> getAllUser();
} 

UserMapper.xml通过对应功能写入sql语句(注意查询功能有些不一样,注意看注释!)

<?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.bite.mybatis.mapper.UserMapper"> <!--这里建立映射关系-->
<!--
    mapper接口和映射文件要保证两个一致
    1.mapper接口的全类名和映射文件的namespace一致
    2.mapper接口中的方法的方法名要和映射文件的sql的id一致
-->
    <!--int insertUser();-->
    <insert id="insertUser">
        insert into user values(null, "admin", "123");
    </insert>

    <!--void updateUser-->
    <update id="updateUser">
        update user set username='root',password='123' where id = 2;
    </update>

    <!--void deleteUser-->
    <delete id="deleteUser">
        delete from user where id = 1;
    </delete>

    <!--User getUserById-->
    <!--
        resultType: 设置结果类型,即查询的数据要转换为的java类型
        resultMap:自定义映射,处理多对一或一对多的银蛇关系
    -->
    <select id="getUserById" resultType="com.bite.mybatis.pojo.User">
        select * from user where id = 2;
    </select>
    
    <!--List<User> getAllUser-->
    <!--注意这里为什么不直接写List,因为我们还是需要先转化为实体类对象,再放入List-->
    <select id="getAllUser" resultType="com.bite.mybatis.pojo.User">
        select * from user;
    </select>
    
</mapper>

四、小结——注意事项

注意:mapper接口和映射文件要保证两个一致

1.mapper接口的全类名和映射文件的namespace一致;

2.mapper接口中的方法的方法名要和映射文件的sql的id一致;

以上两点一定要注意,否则就会失败;


【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/130400.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!