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>
  10. 建立映射配置文件,加入约束

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

     <?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>

    注意事项

  • 在resources中创建目录时,不能用 ‘ . ' 快速创建目录,用了的话只会创建一个目录
  • mybatis的映射配置文件位置必须和dao接口的包结构相同
  • 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
  • 映射配置文件的操作配置(如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();
        }
最后修改:2020 年 03 月 26 日
如果觉得我的文章对你有用,请随意赞赏