MyBatis(三)、原理与三种代码实现

三种实现

1.配置文件实现

import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.domain.User;
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;
import java.util.List;

/**
 * @Program: knowledge-base
 * @Description: MybatisTest
 * @Author: BitterGourd
 * @Date: 2020-01-29 14:12
 */
public class MybatisTest {
    public static void main(String[] args) throws IOException {

        // 1. 读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig" +
                ".xml");
        // 2. 创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3. 使用工厂生产SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 4. 使用SqlSession创建Dao接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 5. 使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user:
             users) {
            System.out.println(user);
        }
        // 6. 释放资源
        sqlSession.close();
        in.close();
    }
}

易错点

  • 1.项目中的路径问题
    • 不靠谱
      • 绝对路径
      • 相对路径
    • 靠谱
      • 类加载器[只能读取类路径下的配置文件]
      • ServletContext对象的getRealPath()方法
  • 2.构建者模式

优点:

把对象创建的细节隐藏,使调用者直接调用方法即可拿到对象。

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
  • 3.工厂模式

优点:

解耦(降低类之间的依赖关系)。

        SqlSession sqlSession = factory.openSession();
  • 4.代理模式

优点:

不修改源码的基础上对源码的方法增强。

        UserDao userDao = sqlSession.getMapper(UserDao.class);

2.使用注解实现


public interface UserDao {
    @Select("select * from user")
    List<User> findAll();
}
    <mappers>
<!--        <mapper resource="com/bittergourd/mybatis/dao/UserDao.xml"></mapper>-->
        <mapper class="com.bittergourd.mybatis.dao.UserDao"></mapper>
    </mappers>

3.自己实现类[不推荐:麻烦]

import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.dao.impl.UserDaoImpl;
import com.bittergourd.mybatis.domain.User;
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;
import java.util.List;

/**
 * @Program: knowledge-base
 * @Description: MybatisTest
 * @Author: BitterGourd
 * @Date: 2020-01-29 14:12
 */
public class MybatisTest {
    public static void main(String[] args) throws IOException {

        // 1. 读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig" +
                ".xml");
        // 2. 创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3. 使用SqlSession创建Dao接口的代理对象
        UserDao userDao = new UserDaoImpl(factory);
        // 4. 使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user:
             users) {
            System.out.println(user);
        }
        in.close();
    }
}
import com.bittergourd.mybatis.dao.UserDao;
import com.bittergourd.mybatis.dao.impl.UserDaoImpl;
import com.bittergourd.mybatis.domain.User;
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;
import java.util.List;

/**
 * @Program: knowledge-base
 * @Description: MybatisTest
 * @Author: BitterGourd
 * @Date: 2020-01-29 14:12
 */
public class MybatisTest {
    public static void main(String[] args) throws IOException {

        // 1. 读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig" +
                ".xml");
        // 2. 创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3. 使用SqlSession创建Dao接口的代理对象
        UserDao userDao = new UserDaoImpl(factory);
        // 4. 使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user:
             users) {
            System.out.println(user);
        }
        in.close();
    }
}
也需要通过xml文件找到sql语句。
通过全限定类名唯一确定一个方法。

    <mappers>
        <mapper resource="com/bittergourd/mybatis/dao/UserDao.xml"></mapper>
<!--        <mapper class="com.bittergourd.mybatis.dao.UserDao"></mapper>-->
    </mappers>

原理分析

1.mybatis做了哪些工作

  • 创建代理对象
  • 在代理对象中调用selectList

封装的两部分重点:
  • 连接信息
  • 映射信息 [两部分组合为一个对象]
    • 执行的sql语句
    • 封装结果的实体类全限定类名

原文地址:https://www.cnblogs.com/biturd/p/12623142.html