Mybatis学习记录(二)----mybatis开发dao的方法
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的方法相关推荐
- 【mybatis学习记录】mybatis的各种查询 一对一关联查询(4种方式) 一对多(2种方式)
文章目录 一对一 方式一: 方式2 方式3 方式4 一对多查询(2种方式) 方式2 一对一 如:通过订单id查询订单的时候,将订单关联的用户信息也返回. 首先建库建表: 新建实体类: @Builder ...
- Mybatis学习总结二
Mybatis学习总结二 0.不需要修改的文件(在src下面) jdbc.properties文件 log4j.properties文件 SqlMapConfig.xml文件 1.高级结果映射 1.1 ...
- [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍
[MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...
5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...
- 第十四课 k8s源码学习和二次开发原理篇-调度器原理
第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...
- 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理
第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...
- 第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习
第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第三课 k8s源码学习和二 ...
- 大数据之spark学习记录二: Spark的安装与上手
大数据之spark学习记录二: Spark的安装与上手 文章目录 大数据之spark学习记录二: Spark的安装与上手 Spark安装 本地模式 Standalone 模式 基本配置 步骤1: 复制 ...
- 第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习
第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第四课 k8s源码学习和二次开发-De ...
最新文章
- 查linux还是unix,C、C++判断操作系统是Linux、windows还是Unix
- Spring Cloud Alibaba 2021.0.1.0 发布:版本号再也不迷糊了
- php执行rsync,使用rsync工具构建php项目管理平台,rsync项目管理
- LeetCode Linked List Cycle
- sys.stdout sys.stderr的用法
- [jQuery]无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
- Java程序员从笨鸟到菜鸟之(八十七)跟我学jquery(三)jquery动态创建元素和常用函数示例
- UPS对发电机组的影响
- Arduino--Mlx90614红外温度传感器(额温枪芯片)
- TypeError: 'dict' object is not callable
- java中退订程序怎么写_如何在RxJava中的自定义Observable中获得观察者的退订操作的通知...
- git 修改远程仓库地址
- python自带的用于解析HTML的库HtmlParser
- Java虚拟机学习 - 体系结构 内存模型
- mysql linux压缩包官网下载_mysql for linux 压缩包下载
- Ubuntu中切换用户
- 【计算机网络笔记】数据链路层(封装成帧,差错检测,可靠传输)
- 802.11n 重新扬帆
- winform 固定splitContainer某一部分大小
- 数据库文档自动生成工具