当前位置: 移动技术网 > IT编程>开发语言>Java > 荐 Mybatis的简介与CRUD

荐 Mybatis的简介与CRUD

2020年07月07日  | 移动技术网IT编程  | 我要评论

Mybatis

学自B站,遇见狂神

环境:

  • JDK1.8

  • Mysql 5.7

  • maven 3.6.1

  • IDEA

  • 回顾:

  • JDBC

  • Mysql

  • Java基础

  • Maven

  • Junit
    SSM框架:配置文件的。 最好的方式:看官网文档;

1、简介

1.1、什么是Mybatis

  • MyBatis 是一款优秀的持久层框架
  • 它支持定制化 SQL、存储过程以及高级映射。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
  • 2013年11月迁移到Github。

如何获得Mybatis?

  • maven仓库:

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    
  • Github : https://github.com/mybatis/mybatis-3/releases

  • 中文文档:https://mybatis.org/mybatis-3/zh/

1.2、持久化

数据持久化

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

为什么需要需要持久化?

  • 有一些对象,不能让他丢掉。

  • 内存太贵了

1.3、持久层

Dao层,Service层,Controller层….

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

1.4 为什么需要Mybatis?

  • 帮助程序猿将数据存入到数据库中。

  • 传统的JDBC代码太复杂了。简化。框架。自动化。

  • 不用Mybatis也可以。更容易上手。 技术没有高低之分

  • 优点:

    • sql和代码的分离,提高了可维护性。
    • 能够与Spring很好的集成;
    • 提供映射标签,支持对象与数据库的orm(对象关系映射)字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。
  • 缺点:

    • SQL语句的编写工作量较大,尤其当字段多、关联表多时,SQL语句的编写复杂
    • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

2、Mybatis-CRUD

思路:搭建环境(建数据库,导入Mybatis的依赖,配置MyBatis核心配置文件,实体类pojo,工具类拿到sqlSession)–>编写接口,接口对应的mapper.xml–>测试类!

2.1、搭建环境

搭建数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
  `id` INT(20) NOT NULL PRIMARY KEY,
  `name` VARCHAR(30) DEFAULT NULL,
  `pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(`id`,`name`,`pwd`) VALUES 
(1,'狂神','123456'),
(2,'张三','123456'),
(3,'李四','123890')

新建项目

  1. 新建一个普通的maven项目

  2. 删除src目录
    (这样一个好处是通过Maven构建的项目作为总项目将项目依赖导入pom.xml,方便管理其子模块,子模块的pom.xml不用每次都需要去导入公共依赖项)
    在这里插入图片描述

  3. 导入maven依赖

         <!--导入依赖-->
     <dependencies>
         <!--mysql驱动-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.47</version>
         </dependency>
         <!--mybatis-->
         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.2</version>
         </dependency>
         <!--junit-->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
     </dependencies>
     <!--在build中配置resources,来防止我们资源导出失败的问题-->
     <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>
                 <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    

2.2、创建一个子模块:Mybatis01

  • 编写mybatis的核心配置文件:mybatis-config.xml
    注意:这里的encoding="UTF8"如果为encoding="UTF-8"会报错
<?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核心配置文件-->
<configuration>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/wu/Dao/UserMapper.xml"/>
    </mappers>
</configuration>
  • 编写mybatis工具类:java.com.wu.utils.MybatisUtils.class
//sqlSessionFactory --> sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            //使用Mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
    // SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

2.3、编写代码

  • 实体类
 package com.wu.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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}
  
  • Dao接口
    UserDao
package com.wu.Dao;

import com.wu.pojo.User;

import java.util.List;
import java.util.Map;
//接口中的属性的默认是public static final 
//方法是public abstract
public interface UserDao {
    List<User> getUserList();//查询全部
    User getUserById(int id);//通过id查询
    List<User> getUserLike(String value);//模糊查询

    int addUser(User user);//增
    int addUser2(Map<String,Object>map);//map传值

    int updateUser(User user);//改
    int deleteUser(int id);//删
}

  • 接口实现类由原来的UserDaoImpl转变为一个 Mapper配置文件.
    UserMapper.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wu.Dao.UserDao">
    <!--select查询语句-->
    <select id="getUserList" resultType="com.wu.pojo.User">
      select * from mybatis.user
    </select>
    <select id="getUserById" resultType="com.wu.pojo.User" parameterType="int">
        select * from mybatis.user where id=#{id};
    </select>

    <select id="getUserLike" resultType="com.wu.pojo.User" parameterType="String">
        select * from mybatis.user where name like "%"#{values}"%";
    </select>

    <insert id="addUser" parameterType="com.wu.pojo.User">
        insert  into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})
    </insert>
    <insert id="addUser2" parameterType="Map">
        insert into mybatis.user (id,name,pwd) values (#{userId},#{userName},#{userPwd});
    </insert>

    <update id="updateUser" parameterType="com.wu.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>

2.4、测试

注意:

org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?

核心配置文件中注册 mappers

  • junit测试
package com.wu;

import com.wu.Dao.UserDao;
import com.wu.pojo.User;
import com.wu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserDaoTest {
    @Test
    public void test() {
        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userLists = userDao.getUserList();

        for (User userList : userLists) {
            System.out.println(userList);
        }
        //关闭SqlSession
        sqlSession.close();
    }

    @Test
    public void getUserById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = userDao.getUserById(1);
        System.out.println(user);
        sqlSession.close();
    }
    @Test
    public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> users = userDao.getUserLike("李");
        for(User user:users){
            System.out.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void addUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        userDao.addUser(new User(5, "呵呵", "root"));
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        Map<String,Object>map = new HashMap<String, Object>();
        map.put("userId",5);
        map.put("userName","李五");
        map.put("userPwd","roots");
        userDao.addUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void updateUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userMapper = sqlSession.getMapper(UserDao.class);
        userMapper.updateUser(new User(4, "WXY", "666"));
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper( UserDao.class);
        userDao.deleteUser(5);
        sqlSession.commit();
        sqlSession.close();
    }

}

你们可以能会遇到的问题:

  1. 配置文件没有注册
  2. 绑定接口错误
  3. 方法名不对
  4. 返回类型不对
  5. Maven导出资源问题

2.5、分析错误

2.5.1、容易出现的错误

  • 标签不要匹配错
  • resource 绑定mapper,需要使用路径!
<mappers>
        <mapper resource="com/wu/Dao/UserMapper.xml"/>
  </mappers>
  • 程序配置文件必须符合规范!
  • NullPointerException,没有注册到资源!
  • 输出的xml文件中存在中文乱码问题!
  • maven资源没有导出问题!(资源穿透)

2.5.2、P2 第一个Mybatis程序

出现异常

1.绑定异常

org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.

没有在mybatis-config.xml中配置

<mappers>
    <mapper resource="com/wu/Dao/UserDao.xml"/>
</mappers>

java.lang.ExceptionInInitializerError

2.配置文件无法导出

**措施:**在maven的配置文件pom.xml配置build标签

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<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>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
3.编码字符集

措施:将UserDao.xml和mybatis-config.xml中的"UTF-8"改为"UTF8"

Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: **1 字节的 UTF-8 序列的字节 1 无效。**

4.绑定失误

类似映射找不到的字样可能是用于实现接口的配置文件UserDao.xml中绑定失误,比如namespace和id等属性。

2.5.3、P5 Map和模糊查询

UserDao //接口

 List<User> getUserLike(String value);//模糊查询

UserMapper.xml

<select id="getUserLike" resultType="com.wu.pojo.User" parameterType="String">
        select * from mybatis.user where name like "%"#{values}"%";
 </select>

UserMapperTest.java

public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> users = userDao.getUserLike("李");
        for(User user:users){
            System.out.println(user);
        }
        sqlSession.close();
    }

注意:

Type interface com.wu.Dao.UserMapper is not known to the MapperRegistry.(在UserMapper从哪里产生,干了什么,最终去哪里思考)

是资源导出失败问题,在pom.xml配置build标签。

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<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>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

另外还有一种情况是,namespace那里出错,导致无法映射UserMapper。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tZQxaQqE-1593944963081)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200416213517474.png)]

本文地址:https://blog.csdn.net/weixin_43215223/article/details/107142676

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网