欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Mybatis的简介与CRUD

程序员文章站 2022-07-07 19:40:05
Mybatis学自B站,遇见狂神环境:JDK1.8Mysql 5.7maven 3.6.1IDEA回顾:JDBCMysqlJava基础MavenJunitSSM框架:配置文件的。 最好的方式:看官网文档;1、简介1.1、什么是MybatisMyBatis 是一款优秀的持久层框架它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简...

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/index.html

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不用每次都需要去导入公共依赖项)
    荐
                                                        Mybatis的简介与CRUD

  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。
荐
                                                        Mybatis的简介与CRUD

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