Mybatis

  1. 第一个myabtis程序:

思路: 搭建环境 -----> 导入mybatis ------>编写代码 ------>测试代码

1.1 搭建环境

​ 步骤:

  1. 搭建数据库

  2. 新建maven项目

​ 2.1 删除src目录

​ 2.2 导入需要的maven 依赖

<dependencies>
      <!--mybatis-->
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.4.6</version>
     </dependency>

     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.47</version>
     </dependency>

     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>
     </dependency>

 </dependencies>
  1. 在项目里面创建一个模块

    点击 项目 , 在新建一个Module

  2. 编写mybatis的核心配置文件

    在resources文件夹中 ,创建一个 mybatis-config.xml

    <?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>
        <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>
    
    </configuration>
    
  3. 编写mybatis的工具类

    package com.lsq.utills;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    //mybatis  工具类
    /*
        sqlSessionFactory        ---生产-->  sqlSession
    
     */
    public class MybatisUtils {
    
        /*
            sqlSessionFactoryBuilder(构造器) ,会根据,代码或配置 ,生产 sqlSessionFactory
         */
          static {
    
              //mybatis 的第一步, 获取  sqlSessionFactory  对象
              try {
                  String  resource ="mybatis-config.xml";
                  InputStream inputStream = Resources.getResourceAsStream(resource);
                  //通过sqlSessionFactoryBuilder类(构造器), 生成一个sqlSessionFactory
                  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
    }
    
    

    ​ 5.1 这是myabtis 的第一步, 获取 sqlSessionFactory 对象

    ​ 5.2 由 sqlSessionFactory 获取 sqlSession sqlSession 完全包含了面向数据库执行SQL命令所需的需所有方法

     ``` java
    

    package com.lsq.utills;

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    import java.io.IOException;
    import java.io.InputStream;

    //mybatis 工具类
    /*
    sqlSessionFactory ---生产--> sqlSession

    */
    public class MybatisUtils {

    /*
        sqlSessionFactoryBuilder(构造器) ,会根据,代码或配置 ,生产 sqlSessionFactory
     */
    
         private  static  SqlSessionFactory  sqlSessionFactory;  //提升作用域
    
      static {
    
          //mybatis 的第一步, 获取  sqlSessionFactory  对象
          try {
              String  resource ="mybatis-config.xml";
              InputStream inputStream = Resources.getResourceAsStream(resource);
              //通过sqlSessionFactoryBuilder类(构造器), 生成一个sqlSessionFactory
              sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
    
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    
      //获取  从sqlSessionFactory  中获取sqlSession
      public  static SqlSession  getsqlSession(){
    
          SqlSession sqlSession = sqlSessionFactory.openSession();
          return sqlSession;
          
      }
    

    }

    pojo 实体类

    package com.lsq.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;
        }
    }
    
    

  4. 定义接口

    package com.lsq.dao;
    
    import com.lsq.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
        List<User> getUserList();
    }
    
    
  5. mybatis 不在需要接口实现类 , 由 配置文件代替 ,这里我要UserMapper.xml , mybatis使用动态代理技术使得这个接口执行,

    mybatis会为这个接口生成一个代理对象

    <?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.lsq.dao.UserDao">                      <!--相当于接口实现类-->
        
        <select id="getUserList" resultType="com.lsq.pojo.User">                <!--id  对应dao接口的方法名-->
            select * from mybatis.user
        </select>
    
    </mapper>
    
    
  6. 测试代码

    ​ 最好建立测试的结构和 正常代码的位置一样

    ``` java
    

    package com.lsq.dao;

    import com.lsq.pojo.User;
    import com.lsq.utills.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;

    import java.util.List;

    public class UserDaoTest {

    @Test
    public  void  test(){
    
          //1. 获取sqlsession
        SqlSession sqlSession = MybatisUtils.getsqlSession();
        //映射器的接口实例  是从 sqlSession中获取的      
        UserDao mapper = sqlSession.getMapper(UserDao.class);    
        List<User> userList = mapper.getUserList();   //执行接口中定义的方法
        for (User u: userList) {
            System.out.println(u);
            
        }
        sqlSession.close();
    }
    

    }

    ```
    

​ 执行这个测试类 会出现异常, org.apache.ibatis.binding.BindingException: Type interface com.lsq.dao.UserDao is not known to the MapperRegistry.

​ 异常解析:类型接口 (指定的某接口) , 是未知的 mapperRegistry(未知的mapper注册中心)

问题是: mapper 没有在mybatis的核心配置文件中 配置该mapper

 <!--mappers  注册中心   每一个mapper.xml 都需要在mybatis核心配置文件中心 注册  -->
    <mappers>

        <!--注册 UserDao接口   的配置文件  UserMapper.xml  的mapper -->
         <mapper resource="UserMapper.xml"/>

    </mappers>

maven 项目 打包文件过滤问题, 一些 在java 中的定义的文件,有时候读取不到

解决方案 在maven 项目的 pom.xml 下

<!-- 解决maven打包时候, 在src/main/java目录下的xml文件没有打包进来的问题 -->
        <resources>  
            <resource>  
                <directory>src/main/resources</directory>  
                <includes>  
                    <include>**/*.properties</include>  
                    <include>**/*.xml</include>  
                    <include>**/*.tld</include>  
                </includes>  
                <filtering>false</filtering>  
            </resource>  
            <resource>  
                <directory>src/main/java</directory>  
                <includes>  
                    <include>**/*.properties</include>  
                    <include>**/*.xml</include>  
                    <include>**/*.tld</include>  
                    <include>**/*.*</include>  
                </includes>  
                <filtering>false</filtering>  
            </resource>  

  1. ​ Mybatis 的 组成元素的 生命周期

    1. ​ sqlSessionFacatoryBuilde : 这个类可以被实例化, 一旦创建出了 sqlSessionFactory 就不需要 它了

    2. ​ sqlSessionFactory : 一旦被创建就应该在运行期间一直存在,

    3. sqlSession 则相当于一个connnection 连接对象 ------》 sqlsession几乎包含所有的数据库语句

    4. Mapper : 这是一个接口 , 由sqlSession 创建, 用来处理一些业务, 作用范围最好和sqlSession 一样