zoukankan      html  css  js  c++  java
  • 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语句
      • 封装结果的实体类全限定类名

  • 相关阅读:
    有用数据结构---图的操作和算法
    Jackson 框架,轻易转换JSON
    移动Web开发实践
    Spring官方文档翻译——15.1 介绍Spring Web MVC框架
    面向对象五大原则_1.单一职责原则&amp;2.里氏替换原则
    ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
    Yii学习笔记之二(使用gii生成一个简单的样例)
    一个令人蛋疼的NDK链接错误
    Android 阅读器架构图,网上收集,留做存货
    Xcode 6 打包ipa文件
  • 原文地址:https://www.cnblogs.com/biturd/p/12623142.html
Copyright © 2011-2022 走看看