• 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语句
      • 封装结果的实体类全限定类名

  • 相关阅读:
    SSH through HTTP proxy
    聊聊主流框架,Less/Sass/Compass/Bootstrap/H5bp » 社区 | Ruby China
    HTTP Tunneling (HTTP Proxy Socket Client)
    现代 C++ 编程指南
    用C++实现HTTP服务器 Windows平台(开放源代码) Que's C++ Studio 博客频道 CSDN.NET
    nvie/rq
    第二章 C语言实例 —制作http服务器 dennis ITeye技术网站
    GNU libmicrohttpd: a library for creating an embedded HTTP server
    Design Patterns and Refactoring
    A LinuxJunky Blog: A Very Simple HTTP Server writen in C
  • 原文地址:https://www.cnblogs.com/biturd/p/12623142.html
Copyright © 2020-2023  润新知