Mybatis 学习笔记总结

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 学习笔记总结相关的知识,希望对你有一定的参考价值。

文章目录

1. Mybatis

1.1 Mybatis 官方定义


官方给的定义:

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

1.2 Mybatis 历史和获取安装


Mybatis的历史?

Mybatis本是apache的一个开源项目iBatis(现在,我们导入包很多包也是iBatis的名字。) ,后来由阿帕奇转到了谷歌,才改名为Mybatis,之后又迁移到了Github上面。


如何获得Mybatis?

  • maven仓库获取。
  • Github获取。

一般我们直接maven获取就行。

1.3 Dao层


Dao层(Data access Object)也就是持久层。

我们的内存一般就是 断电即失

而jdbc数据库,io持久化。持久化就是将程序数据在持久状态和瞬时状态转化的过程

1.4 为什么需要Mybatis?


2. Mybatis 准备工作

2.1 错误注意事项(重点!)


Mybatis的错误注意点:

  • Type interface com.itholmes.dao.UserDao is not known to the MapperRegistry. 这个错误就是因为我们设置的Mapper.xml没有在Mybatis-config.xml中进行配置注册。

Maven的常见的错误:

  • 在Mybatis配置中,遇到的类似下图的错误:
  • 原因就是我们设定的xml等配置文件,这些配置文件在maven中,默认是设定在了resources文件中。如果将xml配置文件放到了java结构下,maven测试导入的时候就没办法引入了。

Maven的机制就是约定优于配置

也就是说我们在resources的其他结构写配置文件,可能无法导出或者生效!不过,这里是有解决办法的!

解决办法就是在pom.xml文件中来进行引入就可:

<!--在build中配置resources,从而也可以将其他结构下的xml配置文件也会被导入,让其生效!-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

配置好之后,再运行就没问题了,也能在target中看到配置文件的导入。

2.2 Mybatis的 使用


第一步:导包导依赖。

mysql驱动包和mybatis包的依赖。


第二步:编写mybatis的核心配置文件,mybatis-config.xml文件。

配合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">

<!--mybatis的核心配置文件-->
<configuration>
    <!--
    	环境,可以设定多个,不同场景用不同的环境。
		
		想用那个环境直接设置default属性就行。
    -->
    <environments default="development">
        <environment id="development">
            <!--事务管理器-->
            <transactionManager type="JDBC"/>
            <!--dataSource是数据源,平时我们遇到的数据源有dbcp,c3p0,德鲁伊等等。-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--
                    useSSL=true: 安全
                    连接。
                    &amp; 在xml需要转义,转义后的内容就是 & 符号。
                    useUnicode=true: 使用Unicode编码,设置中文。
                    characterEncoding=UTF-8: 字符集。
                    serverTimezone=Asia/Shanghai:设置时区。
                -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="0818"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

第三步:封装mybatis工具类,负责生产SqlSession。

这里有个工厂过程:

SqlSessionFactoryBuilder  => SqlSessionFactory => SqlSession

封装mybatis工具类MybatisUtils 类:

package com.itholmes.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 MybatisUtils 

    private static String resource = null;
    private static InputStream inputStream = null;
    private static SqlSessionFactory sqlSessionFactory = null;

    static 
        try 

            //使用Mybatis的第一步骤:获取sqlSessionFactory对象
            resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

         catch (IOException e) 
            e.printStackTrace();
        
    

    public static SqlSession getSqlSession()
        /*
        *   获取到了SqlSessionFactory,我们可以从中获得 SqlSession 的实例。
        *   SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
        * */
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    



第四步:编写代码。

首先,设定一个pojo层的实体类,对应数据库内容的User类:

package com.itholmes.pojo;

public class User 

    private int id;
    private String name;
    private String pwd;

    public User() 
    

    public User(int id, String name, String pwd) 
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    

    public int getId() 
        return id;
    

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

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getPwd() 
        return pwd;
    

    public void setPwd(String pwd) 
        this.pwd = pwd;
    

设定一个Dao层的接口:

package com.itholmes.dao;

import com.itholmes.pojo.User;

import java.util.List;

public interface UserDao 
    List<User> getUserList();

设定接口实现类:

一般我们平时使用jdbc操作,都是直接写一个UserDaoImpl.java文件,写一堆操作数据库的代码获取结果集啥的。但是在这里我们可以使用一个Mapper.xml配置文件,来替代这些操作。

写一个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">
<!--namespace:绑定一个对应的Dao/Mapper接口。-->
<mapper namespace="com.itholmes.dao.UserDao">
    <!--
        select查询语句
        id属性就是我们要重写的方法的名字,对应namespace绑定的接口。

        resultType:返回一个类型。
        resultMap:返回多个类型。
    -->
    <select id="getUserList" resultType="com.itholmes.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

第五步:编写测试。

package com.itholmes.dao;

import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import java.util.List;

public class UserDaoTest 
    @Test
    public void test()

        //通过我们设定的工具类来获取sqlSession。
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        /*
            方式一:使用getMapper来获取实现类(常用!!!最新推荐的)
        */
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();

        /*
            方式二:使用getMapper来获取实现类(不常用但是要知道!)

            如果返回的是一个结果:sqlSession.selectOne。
            如果返回的是一个list:sqlSession.selectList。
            如果返回的是一个map:sqlSession.selectMap。
            ... 等等都是与返回值类型对应出来的。
        */
        List<User> userList2 = sqlSession.selectList("com.itholmes.dao.UserDao.getUserList");

        System.out.println("userList:");

        for (User user : userList) 
            System.out.println(user);
        

        System.out.println("userList2:");

        for (User user : userList2) 
            System.out.println(user);
        

        //关闭sqlSession
        sqlSession.close();
    

2.3 Mybatis的 注意事项


命名空间:

一定使用全限定名:

三者的关系和注意事项:

3. Mybatis 的 CRUD实现

接下来的操作配置都在我们自己设定的Mapper.xml中进行!

3.1 namespace


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

3.2 select 查询


选择,查询语句:

  • id属性:对应的namespace中的方法名。
  • resultType属性:Sql语句执行的返回值!
    对应的还有个resultMap,区别就是resultType返回一个类型,resultMap返回多个类型。
  • parameterType属性:设置参数类型。

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.itholmes.dao.UserMapper">

    <select id="getUserList" resultType="com.itholmes.pojo.User" >
        select * from mybatis.user
    </select>

    <!--
        parameterType属性:定义参数类型。
        #id ,拿到对应方法中参数名为id的参数。
    -->
    <select id="getUserById" resultType="com.itholmes.pojo.User" parameterType="int">
        select * from mybatis.user where id = #id
    </select>

</mapper>

UserMapper.java接口:

package com.itholmes.dao;

import com.itholmes.pojo.User;

import java.util.List;

public interface UserMapper 
    //查询全部用户
    List<User> getUserList();
    //根据ID查询用户
    User getUserById(int id);

测试类:

package com.itholmes.dao;

import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import java.util.List;

public class UserDaoTest 

    @Test
    public void getUserById()
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
        sqlSession.close();
    


3.3 增删改 语句


需要注意的是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">
<!--namespace:绑定一个对应的Dao/Mapper接口。-->
<mapper namespace="com.itholmes.dao.UserMapper">

    <!--
        select查询语句
        id属性就是我们要重写的方法的名字,对应namespace绑定的接口。

        resultType:返回一个类型。
        resultMap:返回多个类型。
    -->
    <select id="getUserList" resultType="com.itholmes.pojo.User" >
        select * from mybatis.user;
    </select>
    <!--
        select查询语句(有参数):
        parameterType属性:定义参数类型。
        #id ,拿到对应方法中参数名为id的参数。
    -->
    <select id="getUserById" resultType="com.itholmes.pojo.User" parameterType="int">
        select * from mybatis.user where id = #id;
    </select>

    <!--
        insert插入语句:
            对象中的属性,可以直接取出来。
    -->
    <insert id="addUser" parameterType="com.itholmes.pojo.User">
        insert into mybatis.user (`id`,`name` ,`pwd`) values (#id,#name,#pwd);
    </insert>
    <!--
        更新语句:
    -->
    <update id="updateUser" parameterType="com.itholmes.pojo.User">
        update mybatis.user set `name`=#name,`pwd`=#pwd where id = #id;
    </update>
    <!--
        删除语句:
    -->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #id;
    </delete>
</mapper>

UserMapper.java接口文件:

package com.itholmes.dao;

import com.itholmes.pojo.User;

import java.util.List;

public interface UserMapper 
    //查询全部用户
    List<User> getUserList();
    //根据ID查询用户
    User getUserById(int id);
    //插入用户
    int addUser(User user);
    //修改用户
    int updateUser(User user);
    //删除用户
    int deleteUser(int id);

UserDaoTest测试文件:

package com.itholmes.dao;

import com.itholmes.pojo.User;
import com.itholmes.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import java.util.List;

public class UserDaoTest 
    @Test
    public void test()

        //通过我们设定的工具类来获取sqlSession。
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        /*
            方式一:使用getMapper来获取实现类(常用!!!最新推荐的)
        */
        UserMapper mapper = sqlSession.getMapper(UserMapper.以上是关于Mybatis 学习笔记总结的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 学习笔记总结

Mybatis 学习笔记总结

Mybatis 学习笔记总结

mybatis学习笔记(11)-多对多查询

springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

MyBatis自用MyBatis学习笔记