MyBatis详细教程入门(从0-1这一步你必须迈出去)

Posted 李子捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis详细教程入门(从0-1这一步你必须迈出去)相关的知识,希望对你有一定的参考价值。

MyBatis

1、简介

1.1 什么是MyBatis

在这里插入图片描述

  • MyBatis 是一款优秀的持久层框架;
  • 它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2 持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(Jdbc),io文件持久化。

为什么要持久化?

  • 有一些对象,不能让他丢掉
  • 内存太贵

1.3 持久层

Dao层、Service层、Controller层

  • 完成持久化工作的代码块
  • 层界限十分明显

1.4 为什么需要MyBatis

  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的JDBC代码太复杂了,简化,框架,自动化
  • 不用MyBatis也可以,技术没有高低之分
  • 优点:
    • 简单易学
    • 灵活
    • sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql

2、第一个Mybatis程序

思路:搭建环境 --> 导入MyBatis --> 编写代码 --> 测试

新建项目

  1. 创建一个普通的maven项目
  2. 删除src目录 (就可以把此工程当做父工程了,然后创建子工程)
  3. 导入maven依赖
  <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!--Junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
        <!--log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

4.创建一个Module

2.2 创建一个模块

  • 编写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/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    
    </configuration>
    
  • 编写mybatis工具类

    package com.liziba.mybatis.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.InputStream;
    
    /**
     * @auther LiZiBa
     * @date 2021/1/17 17:01
     * @description: mybatis工具类
     **/
    public class MybatisUtil {
    
        /** SqlSessionFactory对象 */
        static SqlSessionFactory sqlSessionFactory;
    
        static {
            try{
                // 第一步:通过SqlSessionFactoryBuilder获取SqlSessionFactory
                String resource = "mybatis-config.xml";
                InputStream is = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取SqlSession (SqlSession提供执行数据库语句方法)
         * @return  SqlSession对象
         */
        public static SqlSession getSqlSession() {
            return sqlSessionFactory.openSession();
        }
    }
    

2.3 编写代码

  • 实体类

    package com.liziba.mybatis.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.apache.ibatis.type.Alias;
    
    /**
     * @auther LiZiBa
     * @date 2021/1/17 17:07
     * @description:
     **/
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    // 别名自定义默认使用实体首字母小写  User-->Alias-->user
    @Alias("user")
    public class User {
    
        private Integer id;
        private String name;
        private String password;
    
    }
    
    
  • Dao/Mapper接口

    public interface UserMapper {    
    	/**
         * 查询所有User
         * @return
         */
        List<User> getUserList();
    }
    
  • 接口实现类 (由原来的UserMapperImpl转变为一个Mapper配置文件)

    <?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.liziba.mybatis.mapper.UserMapper">
        
        <!--查询所有User-->
        <select id="getUserList" resultType="com.liziba.mybatis.pojo.User">
            select id,name,pwd as password from user
        </select>
    
    </mapper>   
        
    
  • 测试

    package com.liziba.mybatis.mapper;
    
    import com.liziba.mybatis.pojo.User;
    import com.liziba.mybatis.utils.MybatisUtil;
    import org.apache.ibatis.session.RowBounds;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.log4j.Logger;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @auther LiZiBa
     * @date 2021/1/17 17:28
     * @description:
     **/
    public class UserMapperTest {
    
        /**
         * 测试获取全部user
         */
        @Test
        public void getUserListTest() {
            // 开启一个SqlSession
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            // 通过SqlSession获取UserMapper
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getUserList();
            // 循环输出userList
            userList.forEach(user -> {
                System.out.println(user.toString());
            });
            // 关闭SqlSession
            sqlSession.close();
        }
        
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fgbp0vH1-1622730704315)(C:\\Users\\Leon Plious\\AppData\\Roaming\\Typora\\typora-user-images\\1610891512594.png)]

可能会遇到的问题:

  1. 配置文件没有注册

  2. 绑定接口错误

  3. 方法名不对

  4. 返回类型不对

  5. Maven导出资源问题

3、CURD

3.1 namespace

namespace中的包名要和Dao/Mapper接口的包名一致

3.2 select

选择,查询语句;

  • id:就是对应的namespace对于的mapper中的方法名;

  • resultType : Sql语句执行的返回值;

  • parameterType : 参数类型;

    1. 编写接口

      /**
        * 通过id获取用户
        * @param id
        * @return
       */
      User getUserById(Integer id);
      
    2. 编写对应的mapper中的sql语句

      <!--通过id查询用户-->
      <select id="getUserById" resultType="com.liziba.mybatis.pojo.User">
          select * from user where id = #{id}
      </select>
      
    3. 测试

      /**
       * 通过id获取用户
       */
      @Test
      public void getUserByIdTest() {
      
          logger.info("通过id获取用户");
      
          SqlSession sqlSession = MybatisUtil.getSqlSession();
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
          User user = userMapper.getUserById(1);
          System.out.println(user.toString());
          sqlSession.close();
      }
      

*insert/update/delete 语句需要提交事务sqlSession.commit();

3.3 Insert

  1. 编写接口

    /**
     * 插入User
     * @param user
     */
    void addUser(User user);
    
  2. 编写对应的mapper中的sql语句

    <!--添加User-->
    <insert id="addUser" parameterType="user">
        insert into user (id, name, pwd) values (#{id}, #{name}, #{pwd})
    </insert>
    
  3. 测试

    /**
     * 测试插入user
    */
    @Test
    public void addUserTest() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(5, "liangqinshi", "123456");
        userMapper.addUser(user);
        // 增加、删除、修改一定要提交事务
        sqlSession.commit();
        sqlSession.close();
    }
    

3.4 update

  1. 编写接口

    /**
     * 通过id修改User
     * @param user
    */
    void updateUserById(User user);
    
  2. 编写对应的mapper中的sql语句

    <!--通过id修改用户-->
    <update id="updateUserById" parameterType="user">
        update user set name = #{name} ,pwd = #{pwd} where id = #{id}
    </update>
    
  3. 测试

     /**
      * 通过id修改用户
     */
    @Test
    public void updateUserByIdTest() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(1, "liziba01", "654321");
        userMapper.updateUserById(user);
    
        sqlSession.commit();
        sqlSession.close();
    }
    

3.5 Delete

  1. 编写接口

    /**
         * 通过id删除用户
         * @param id
         */
    void deleteUserById(Integer id);
    
  2. 编写对应的mapper中的sql语句

    <!--通过id删除用户-->
    <delete id="deleteUserById" parameterType="int">
        delete from user where id = #{id}
    </delete>
    
  3. 测试

    /**
         * 通过id删除用户
         */
    @Test
    public void deleteUserByIdTest() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.deleteUserById(5);
        sqlSession.commit();
        sqlSession.close();
    }
    

3.6 万能Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应该考虑使用Map!

  1. UserMapper接口
/**
     * 通过Map对象插入User
     * @param map
     */
void addUserByMap(Map<String, Object> map);
  1. UserMapper.xml
<!--通过map添加User-->
<insert id="addUserByMap" parameterType="map">
    insert into user (id, name, pwd) values (#{id}, #{name}, #{password})
</insert>
  1. 测试
/**
  * 通过map新增User
 */
@Test
public void addUserByMapTest() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    // 构建map,传入参数
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("id", 4);
    userMap.put("name", "xieli");
    userMap.put("password", "123456");
    userMapper.addUserByMap(userMap);

    sqlSession.commit();
    sqlSession.close();
}

Map传递参数,直接在sql中取出key即可! 【parameter=“map”】

对象传递参数,直接在sql中取出对象的属性即可! 【parameter=“Object”】

只有一个基本类型参数的情况下,可以直接在sql中取到

多个参数用Map , 或者注解!

3.7 模糊查询

*建议Java代码执行的时候,传递通配符% %

  1. UserMapper接口
/**
     * 通过名字模糊查询User
     * @param nameLike   %nameLike%
     * @return
     */
List<User> getUserLikeByName(String nameLike);
  1. UserMapper.xml
<!--通过名字模糊查询-->
<select id="getUserLikeByName" resultMap="UserMap">
    select * from user where name like #{nameLike}
</select>
  1. 测试
/**
 * 通过名字模糊查询
 */
@Test
public void getUserLikeByNameTest() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    String nameLike = "%li%";
    List<User> users = userMapper.getUserLikeByName(nameLike);
    users.forEach(user -> {
        System.out.println(user.toString());
    });

    sqlSession.close();
}

4、配置解析

4.1 核心配置文件

  • mybatis-config.xml

  • Mybatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。

    configuration(配置)
        properties(属性)
        settings(设置)
        typeAliases(类型别名)
        typeHandlers(类型处理器)
        objectFactory(对象工厂)
        plugins(插件)
        environments(环境配置)
        	environment(环境变量)
        		transactionManager(事务管理器)
        		dataSource(数据源)
        databaseIdProvider(数据库厂商标识)
        mappers(映射器)
    

4.2 环境配置 environments

MyBatis 可以配置成适应多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境

学会使用配置多套运行环境!

MyBatis默认的事务管理器就是JDBC ,连接池:POOLED

4.3 属性 properties

我们可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.poperties】

  1. 编写一个配置文件

    db.properties

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username=root
    password=123456
    
  2. 在核心配置文件中引入

    <!--属性配置-->
    <!--数据库连接配置,如果属性properties存在与外部配置文件相同的key则以外部文件为标准-->
    <properties resource="db.properties" />
    
    • 可以直接引入外部文件
    • 可以在其中增加一些属性配置
    • 如果两个文件有同一个字段,优先使用外部配置文件的

4.4 类型别名 typeAliases

  • 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置.

  • 意在降低冗余的全限定类名书写。

     <!--别名配置-->
    <!--
         在实体类比较少的时候,使用第一种方式。
         如果实体类十分多,建议用第二种扫描包的方式。
         第一种可以自定义别名,第二种需要在实体上增加注解才能自定义别名。
     -->
    <typeAliases>
        <!--第一种-->
        <typeAlias type="com.liziba.mybatis.pojo.User" alias="user"></typeAlias> 
    </typeAliases>
    

    也可以指定一个包,每一个在包 com.liziba.mybatis.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.liziba.mybatis.pojo.User 的别名为 user,;若有注解,则别名为其注解值。见下面的例子:

    <typeAliases>
        <!--第二种-->
        <package name="com.liziba.mybatis.pojo"/>
    </typeAliases>
    

    在实体类比较少的时候,使用第一种方式。

    如果实体类十分多,建议用第二种扫描包的方式。

    第一种可以自定义别名,第二种不行,如果非要改,需要在实体上增加注解。

    @Alias("user")
    public class User {
        ...
    }
    

4.5 设置 Settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

https://mybatis.org/mybatis-3/zh/configuration.html#settings

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="mu

以上是关于MyBatis详细教程入门(从0-1这一步你必须迈出去)的主要内容,如果未能解决你的问题,请参考以下文章

黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

工作总结:Git的学习和使用,最详细的Git教程,从入门到精通

详细正则表达式30分钟入门教程

API 入门 (27) 使用 OpenAPI 描述 REST API——资源和操作

网络安全工程师入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

Jmeter - 从入门到精通 - 创建测试计划(Test Plan)详细教程