1  SqlSession使用范围

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最佳应用场合在方法体内,定义成局部变量使用。

2  原始dao开发方法(程序员需要写dao接口和dao实现类)

2.1 思路

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

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

2.2 dao接口

2.3 dao接口实现类

package com.joe.mybatis.dao.impl;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import com.joe.mybatis.dao.UserDao;
import com.joe.mybatis.entities.User;public class UserDaoImpl implements UserDao {// 需要向Dao实现类注入SqlSessionFactory// 这里通过构造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}/** <非doc 标签> Title: findUserById Description: 通过Id查询用户信息* * @param id* * @return* * @throws Exception* * @see com.joe.mybatis.dao.UserDao#findUserById(int)*/@Overridepublic User findUserById(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// 查询数据User user = sqlSession.selectOne("test.findUserById", id);// 释放资源
        sqlSession.close();return user;}/* *<非doc 标签>* Title: findUserByName* Description: TODO 父类方法描述* @param name* @return* @throws Exception * @see com.joe.mybatis.dao.UserDao#findUserByName(java.lang.String) */@Overridepublic List<User> findUserByName(String name) throws Exception {// TODO Auto-generated method stubSqlSession sqlSession = sqlSessionFactory.openSession();// 查询数据List<User> list = sqlSession.selectList("test.findUserByName", name);// 释放资源
        sqlSession.close();return list;}/** <非doc 标签> Title: insertUser Description: 添加用户信息* * @param user* * @throws Exception* * @see* com.joe.mybatis.dao.UserDao#insertUser(com.joe.mybatis.entities.User)*/@Overridepublic void insertUser(User user) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// 查询数据sqlSession.insert("test.insertUser", user);// 提交事务
        sqlSession.commit();// 释放资源
        sqlSession.close();}/** <非doc 标签> Title: deleteUser Description: TODO 父类方法描述* * @param id* * @throws Exception* * @see com.joe.mybatis.dao.UserDao#deleteUser(int)*/@Overridepublic void deleteUser(int id) throws Exception {// TODO Auto-generated method stubSqlSession sqlSession = sqlSessionFactory.openSession();// 查询数据sqlSession.delete("test.deleteUser", id);// 提交事务
        sqlSession.commit();// 释放资源
        sqlSession.close();}}

2.4 测试代码:

2.5 总结原始 dao开发问题

  • dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
  • 调用sqlsession方法时将statement的id硬编码了
  • 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

3  mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

3.1 思路(mapper代理开发规范)

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

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

开发规范:

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

  • mapper.java接口中的方法名和mapper.xml中statement的id一致
  • mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
  • mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

总结:

以上开发规范主要是对下边的代码进行统一生成:

User user = sqlSession.selectOne("test.findUserById", id);

sqlSession.insert("test.insertUser", user);

。。。。

3.2 mapper.java

3.3 mapper.xml

3.4 在SqlMapConfig.xml中加载mapper.xml

3.5 测试

3.6 一些问题总结

  • 代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

  • mapper接口方法参数只能有一个是否影响系统 开发

mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统 框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

转载于:https://www.cnblogs.com/doctorJoe/p/5279155.html

Mybatis学习记录(二)----mybatis开发dao的方法相关推荐

  1. 【mybatis学习记录】mybatis的各种查询 一对一关联查询(4种方式) 一对多(2种方式)

    文章目录 一对一 方式一: 方式2 方式3 方式4 一对多查询(2种方式) 方式2 一对一 如:通过订单id查询订单的时候,将订单关联的用户信息也返回. 首先建库建表: 新建实体类: @Builder ...

  2. Mybatis学习总结二

    Mybatis学习总结二 0.不需要修改的文件(在src下面) jdbc.properties文件 log4j.properties文件 SqlMapConfig.xml文件 1.高级结果映射 1.1 ...

  3. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

  4. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  5. mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...

    5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...

  6. 第十四课 k8s源码学习和二次开发原理篇-调度器原理

    第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...

  7. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理

    第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...

  8. 第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习

    第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第三课 k8s源码学习和二 ...

  9. 大数据之spark学习记录二: Spark的安装与上手

    大数据之spark学习记录二: Spark的安装与上手 文章目录 大数据之spark学习记录二: Spark的安装与上手 Spark安装 本地模式 Standalone 模式 基本配置 步骤1: 复制 ...

  10. 第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习

    第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第四课 k8s源码学习和二次开发-De ...

最新文章

  1. 查linux还是unix,C、C++判断操作系统是Linux、windows还是Unix
  2. Spring Cloud Alibaba 2021.0.1.0 发布:版本号再也不迷糊了
  3. php执行rsync,使用rsync工具构建php项目管理平台,rsync项目管理
  4. LeetCode Linked List Cycle
  5. sys.stdout sys.stderr的用法
  6. [jQuery]无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
  7. Java程序员从笨鸟到菜鸟之(八十七)跟我学jquery(三)jquery动态创建元素和常用函数示例
  8. UPS对发电机组的影响
  9. Arduino--Mlx90614红外温度传感器(额温枪芯片)
  10. TypeError: 'dict' object is not callable
  11. java中退订程序怎么写_如何在RxJava中的自定义Observable中获得观察者的退订操作的通知...
  12. git 修改远程仓库地址
  13. python自带的用于解析HTML的库HtmlParser
  14. Java虚拟机学习 - 体系结构 内存模型
  15. mysql linux压缩包官网下载_mysql for linux 压缩包下载
  16. Ubuntu中切换用户
  17. 【计算机网络笔记】数据链路层(封装成帧,差错检测,可靠传输)
  18. 802.11n 重新扬帆
  19. winform 固定splitContainer某一部分大小
  20. 数据库文档自动生成工具

热门文章

  1. vegas pro 17中文版
  2. Unity3D笔记 愤怒的小鸟六 弹弓发射小鸟
  3. 【面向对象】第一单元总结——表达式求导
  4. matlab从工作区读取一维数组和结构体
  5. bat批处理(二):%0 %1——给批处理脚本传递参数
  6. List泛型集合总结(一)
  7. Python从题目中学习:random() module
  8. 一条进程的栈区、堆区、数据区和代码区在内存中的映射
  9. Red Hat Enterprise Linux 5.4安装GCC
  10. JQury自动切换图片