Mybatis介绍

  • Mybatis是一个由Java编写的持久层框架,它封装了很多JDBC的细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建链接等繁琐的过程,它使用了ORM思想,实现了结果集的封装。

ORM介绍

  • Object Relational Mapping : 对象关系映射
    就是把数据库表实体类的属性对应起来,让我们操作实体类就能完成对数据库的操作。

开始搭建环境

  1. 创建maven工程
  2. pom文件中导入下面的依赖

    <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
  3. 建立实体类,且此实体类继承 Serializable
  4. 实体类属性与表中字段对应
  5. 生成所有属性的get,set方法(或者使用lombok的@Data注解)

     package com.oylong.domain;
    
     import java.io.Serializable;
     import java.util.Date;
    
     public class User implements Serializable {
         private Integer id;
         private String username;
         private Date birthday;
         private String sex;
         private String address;
    
         public Integer getId() {
             return id;
         }
    
         public void setId(Integer id) {
             this.id = id;
         }
    
         public String getUsername() {
             return username;
         }
    
         public void setUsername(String username) {
             this.username = username;
         }
    
         public Date getBirthday() {
             return birthday;
         }
    
         public void setBirthday(Date birthday) {
             this.birthday = birthday;
         }
    
         public String getSex() {
             return sex;
         }
    
         public void setSex(String sex) {
             this.sex = sex;
         }
    
         public String getAddress() {
             return address;
         }
    
         public void setAddress(String address) {
             this.address = address;
         }
     }
  6. 建立dao层接口,写方法

    package com.oylong.dao;
    
    import com.oylong.domain.User;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface UserDao {
        public List<User> findAll();
    }
  7. 建立mybatis配置文件,在resources文件夹中新建一个xml文件,名称任意
  8. 加入配置文件约束

     <?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">
        <!--配置文件约束头-->
  9. 配置环境

     <?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>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql环境-->
        <environment id="mysql">   <!--default的值与id一致-->
            <transactionManager type="JDBC"></transactionManager>  <!--配置食物的类型-->
            <dataSource type="pooled"><!--配置连数据源-->
                <!--配置连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.3.66:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123123"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射配置文件位置,指每个dao的独立的配置文件-->
    <mappers>
        <mapper resource="com/oylong/dao/UserDao.xml"></mapper>  <!--这个路径必须手动一个一个创建,根目录为resources目录-->
    </mappers>

</configuration>
  1. 建立映射配置文件,加入约束

    <?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">
  2. 配置映射文件

    <?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.oylong.dao.UserDao">  <!--类名-->
        <select id="findAll">  <!--这里必须与dao中的方法名一致,下面为sql语句-->
            select * from user
        </select>
    </mapper>

    注意事项

  3. 在resources中创建目录时,不能用 ‘ . ' 快速创建目录,用了的话只会创建一个目录
  4. mybatis的映射配置文件位置必须和dao接口的包结构相同
  5. 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
  6. 映射配置文件的操作配置(如select),id属性必须是dao接口的方法名

    如果遵循的这个规则,那么在开发中就无需在实现dao接口的实现类

mybatis的使用

  1. 创建测试类
  2. 读取配置文件
  3. 创建SqlSessionFactory工厂
  4. 使用工厂建立SqlSession对象
  5. 使用SqlSession创建dao代理接口的代理对象
  6. 使用代理对象执行方法
  7. 释放资源

一个异常!!!

运行之后,出现了错误如下:

A query was run and no Result Maps were found for the Mapped Statement

为什么出现这个异常呢,因为在我们的 mapper 映射文件中,并没有指明返回类型,那么mybatis框架就不知道要将返回的结果封装成什么类型,所以就出现了这个no result maps were found的异常了。

解决方案: 在映射文件的中,加入返回类型,如下:

<?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.oylong.dao.UserDao">  <!--类名-->
    <select id="findAll" resultType="com.oylong.domain.User">  <!--此处加入resultType-->
    select * from user
    </select>
    </mapper>

运行

之后即可正常运行,运行代码如下:

    public static void main(String[] args) throws IOException {
            InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            List<User> userList = userDao.findAll();
            System.out.println(userList);
            session.close();
            in.close();
        }
Last modification:March 26, 2020
If you think my article is useful to you, please feel free to appreciate