MyBatis学习

MyBatis

环境:

  • JDK 1.8
  • MySQL 5.7
  • Maven 3.6.1
  • IDEA

回顾:

  • JDBC
  • MySQL
  • Java基础
  • Maven
  • Junit

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

1、 简介

1.1 、什么是MyBatis

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

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

如何获得MyBatis?

  • Maven仓库:

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</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和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。

    最重要的一点:使用的人多!

    Spring SpringMVC SpringBoot

2、第一个MyBatis程序

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

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,'工一木子','123456');

新建项目

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

​ 2.删除src目录

​ 3.导入maven依赖

 <!-- 导入依赖-->
    <dependencies>
        <!-- mysql驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.24</version>
        </dependency>

        <!--mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!--junit-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

2.2、创建一个模块

  • 编写mybatis的核心配置文件:mybatis-config.xml【mybatis系列的配置文件,隨便拷贝一个,改下头部的configuration Config config为相应的约束就可以用了】

    <?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核心配置文件-->
    <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="123456"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    
  • 编写mybatis工具类

    //sqlSessionFactory -->sqlSession
    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
    
        static {
            try {
                //使用mybatis第一步:获取sqlSessionFactory对象
                String resource = "mybatis-config.xml";
                InputStream inputStream = null;
                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、编写代码

  • 实体类

    //实体类
    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接口:

    public interface UserDao {
        List<User> getUserList();
    }
    
    
  • 接口实现类由原来的UserDaoImpl转换为一个Mapper配置文件:UserMapper.xml【idea如果连接了数据库,写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">
    
    <!--namespace=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.gy.dao.UserDao">
        <!--select查询语句-->
        <select id="getUserList" resultType="com.gy.pojo.User">
        select * from mybatis.user
      </select>
    </mapper>
    

2.4、测试

注意点:
1)org.apache.ibatis.binding.BindingException: Type interface com.gy.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?

核心配置文件中注册mappers【在mybatis-config.xml中添加如下内容】

<mappers>
        <mapper resource="com/gy/dao/UserMapper.xml" />
    </mappers>

2)org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/gy/dao/UserMapper.xml

发现target目录下的dao目录下无xml文件,在pom中配置就可以了

3) org.apache.ibatis.builder.BuilderException: Mapper’s namespace cannot be empty

mapper文件中加入:namespace="com.gy.dao.UserDao"即可,这样可以看到sql和dao层关联在一起了

4)Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

在mybatis-config.xml中把
属性driver的值由com.mysql.jdbc.Driver
变为:com.mysql.cj.jdbc.Driver即可
  • junit测试

     @Test
        public void getUserList() {
            //第一步:获得SQLSession对象
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            //方式一:getMapper
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            List<User> userList = userDao.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
            //关闭SQLSession
            sqlSession.close();
        }
    

    改进版:

     @Test
        public void getUserList1() {
            //第一步:获得SQLSession对象
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            try {
                //方式一:getMapper
                UserDao userDao = sqlSession.getMapper(UserDao.class);
                List<User> userList = userDao.getUserList();
    
                //方式二:
                //List<User> userList = sqlSession.selectList("com.gy.dao.UserDao.getUserList");
    
                for (User user : userList) {
                    System.out.println(user);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭SQLSession
                sqlSession.close();
            }
        }
    

    你们可能会遇到的问题:

    1.配置文件没有注册

    2.绑定接口错误

    3.方法名不对

    4.返回类型不对

5.Maven导出资源问题

解决:pom.xml文件中添加如下内容:

<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

3.彩蛋

1)代码地址:
https://gitee.com/zengqiang_wang/mybatis-gongyi
2)将本地代码与远程仓库关联

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git status
fatal: not a git repository (or any of the parent directories): .git

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git remote add origin git@gitee.com:zengqiang_wang/mybatis-gongyi.git
fatal: not a git repository (or any of the parent directories): .git

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git init
Initialized empty Git repository in C:/Users/Administrator/Desktop/学习笔记/mybatis/mybatis-study/.git/

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git remote add origin git@gitee.com:zengqiang_wang/mybatis-gongyi.git

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git push --set-upstream origin master
error: src refspec master does not match any
error: failed to push some refs to 'git@gitee.com:zengqiang_wang/mybatis-gongyi.git'

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From gitee.com:zengqiang_wang/mybatis-gongyi
* branch            master     -> FETCH_HEAD
* [new branch]      master     -> origin/master

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git push --set-upstream origin master
Everything up-to-date
Branch 'master' set up to track remote branch 'master' from 'origin'.

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>

问题解决:
1.拉取代码无权限
and the repository exists.

C:\Users\Administrator\Desktop\学习笔记\mybatis\mybatis-study>git pull origin master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
解决:
把本地的公钥复制到gitee
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值