• 二、MyBatis接口开发


      使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。

    将下边的功能实现:

    • 根据用户id查询一个用户信息。

     一、MyBatis组件

    1.1、SqlSessionFactoryBuilder

    • 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

    • 将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

    1.2、SqlSessionFactory

      通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。mybatis和spring整合后,使用单例模式管理sqlSessionFactory

    1.3、SqlSession

    • SqlSession是一个面向用户(程序员)的接口。

    • SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。

    • SqlSession是线程不安全的,因此是不能被共享的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

    • SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的。

    二、原始dao开发

    思路

    • 程序员需要写dao接口和dao实现类。

    • 需要向dao创建SqlSession

    • 和上一篇中的用法操作一样
    • 映射配置文件user.xml
    <?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="user">
    <!--user表字段--> <sql id="sqlColumnsForUserTable"> id,username,sex,birthday,address </sql> <!-- 根据id获取用户信息 --> <select id="findUserById" resultType="com.jdy.mybatis2020.bean.User"> select <include refid="sqlColumnsForUserTable"/> from user where id = #{id}; </select> </mapper>
    • Dao接口
    public interface UserDao {
    
        /**
         * 根据Id获取用户信息
         * @param id
         * @return
         */
        public User findUserById(String id);
    }
    • Dao实现类
    public class UserDaoImpl implements UserDao {
    
        // 需要向dao实现类中注入SqlSessionFactory
        // 这里通过构造方法注入
        private SqlSessionFactory sqlSessionFactory;
    
        public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
            this.sqlSessionFactory = sqlSessionFactory;
        }
    
        @Override
        public User findUserById(Integer id) {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            User user = sqlSession.selectOne("user.findUserById", id);
            // 释放资源
            sqlSession.close();
            return user;
        }
    }
    • 测试
    public class Test_00 {
    
        public static final String RESOURCE = "mybatis-config/mybatis-config_01.xml";
    
        private SqlSessionFactory sqlSessionFactory;
    
        @Before
        public void createFactory(){
            sqlSessionFactory = SqlSessionFactoryUtil.createFactory(RESOURCE);
        }
        
        @Test
        public void test_Method04() {
            UserDao userDao = new UserDaoImpl(sqlSessionFactory);
            User user = userDao.findUserById("1");
            System.out.println("user = " + user);
    
        }
    
    }

    总结:原始 dao开发问题

    • Dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

    • 调用sqlsession方法时将statement的id硬编码了调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

    三、Mapper代理开发

      程序员只需要mapper接口(相当于dao接口)

    思路(遵循mapper代理开发规范)

    • 程序员还需要编写mapper.xml映射文件

    • 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。 开发规范:

    3.1、Mapper开发规范

    1. 在mapper.xml中namespace等于mapper接口地址。

    2. mapper.java接口中的方法名和mapper.xml中statement的id一致。

    3. mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

    4. mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

    3.2、案例演示

    • 新建映射配置文件userMapper.xml

    <?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.jdy.mybatis2020.dao.intf.UserMapperDao">
    
        <!--user表字段-->
        <sql id="sqlColumnsForUserTable">
            id,username,sex,birthday,address
        </sql>
    
        <!-- 根据id获取用户信息 -->
        <select id="findUserById"  resultType="com.jdy.mybatis2020.bean.User">
            select
            <include refid="sqlColumnsForUserTable"/>
            from user where id = #{id};
        </select>
    </mapper>
    • 在mybatis-config_01.xml加载userMapper.xml
        <!--加载映射配置文件-->
        <mappers>
            <mapper resource="sqlmap/userMapper.xml"/>
        </mappers>
    • 新建Dao接口UserMapperDao
    public interface UserMapperDao {
    
        /**
         * 根据Id获取用户信息
         * @param id
         * @return
         */
        public User findUserById(String id);
    }
    • 测试
    public class Test_00 {
    
        public static final String RESOURCE = "mybatis-config/mybatis-config_01.xml";
    
        private SqlSessionFactory sqlSessionFactory;
    
        @Before
        public void createFactory(){
            sqlSessionFactory = SqlSessionFactoryUtil.createFactory(RESOURCE);
        }
       
        @Test
        public void test_Method05() {
            SqlSession sqlSession = null;
            try {
                sqlSession = sqlSessionFactory.openSession();
                UserMapperDao mapper = sqlSession.getMapper(UserMapperDao.class);
                User user =  mapper.findUserById("2");
                System.out.println(user);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (sqlSession != null) {
                    sqlSession.close();
                }
            }
        }
    }
    • selectOne和selectList

    动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

    • namespace

    mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。 

  • 相关阅读:
    linux ubuntu 中文汉化
    微信内核浏览器一些用法
    struts2解耦和获取提交的值
    html背景图片自适应
    Heroku 云服务部署流程
    mac 遇到的奇怪问题?
    h5完美实现无刷新上传并附带上传效果
    ionic 实现 应用内(webview中html页面点击) 和 应用外 (浏览器html页面点击) 打开本地安装应用
    ionic 实现微信朋友圈分享的完整开发流程
    OpenGL ES学习笔记(三)——纹理
  • 原文地址:https://www.cnblogs.com/jdy1022/p/13713705.html
Copyright © 2020-2023  润新知