原始Dao开发方法以及存在的问题
存在的问题:
原始Dao开发中存在以下问题:
1.Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
2.调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。
Dao开发方法:
使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。这里先介绍原始DAO方法的使用!
SqlSession的使用范围
- SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
- SqlSession通过SqlSessionFactory创建.
- SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
SqlSession
SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作方法。
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭
如下:
SqlSession session = sqlSessionFactory.openSession();
try {// do work
} finally {session.close();
}
原始Dao开发方式
原始Dao开发方法需要程序员编写Dao接口和Dao实现类。
DAO接口:
public interface UserDao {/*** 根据id查询用户* * @param id* @return*/User queryUserById(int id);/*** 根据用户名模糊查询用户* * @param username* @return*/List<User> queryUserByUsername(String username);/*** 保存用户* * @param user*/void saveUser(User user);
}
DAO实现类:
public class UserDaoImpl implements UserDao {private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {super();this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User queryUserById(int id) {// 创建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 执行查询逻辑User user = sqlSession.selectOne("queryUserById", id);// 释放资源sqlSession.close();return user;}@Overridepublic List<User> queryUserByUsername(String username) {// 创建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 执行查询逻辑List<User> list = sqlSession.selectList("queryUserByUsername", username);// 释放资源sqlSession.close();return list;}@Overridepublic void saveUser(User user) {// 创建SqlSessionSqlSession sqlSession = this.sqlSessionFactory.openSession();// 执行保存逻辑sqlSession.insert("saveUser", user);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();}
}
DAO测试:
public class UserDaoTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws Exception {// 创建SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建SqlsessionFactorythis.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);}@Testpublic void testQueryUserById() {// 创建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 执行查询User user = userDao.queryUserById(1);System.out.println(user);}@Testpublic void testQueryUserByUsername() {// 创建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 执行查询List<User> list = userDao.queryUserByUsername("张");for (User user : list) {System.out.println(user);}}@Testpublic void testSaveUser() {// 创建DAOUserDao userDao = new UserDaoImpl(this.sqlSessionFactory);// 创建保存对象User user = new User();user.setUsername("刘备");user.setBirthday(new Date());user.setSex("1");user.setAddress("蜀国");// 执行保存userDao.saveUser(user);System.out.println(user);}
}
原始Dao开发方法以及存在的问题相关推荐
- mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...
5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...
- mybatis开发dao的方法——(三)
------------------------1. SqlSession使用范围------------------- 1.1 SqlSessionFactoryBuilder 通过S ...
- Mybatis学习记录(二)----mybatis开发dao的方法
1 SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将Sq ...
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisS ...
- (转)MyBatis框架的学习(三)——Dao层开发方法
http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...
- 原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
1.原始Dao开发方式 原始Dao开发方法需要程序员编写Dao接口和Dao实现类. 1.映射文件:(user.xml) <?xml version="1.0" encodin ...
- MyBatis开发Dao的方法
1.SqlSession的使用范围 1.1 SqlSessionFactoryBuilder:用来创建SqlSessionFactory,只需要把SqlSessionfactoryBuilder当成一 ...
- Mybatis 开发 dao 的方法
1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...
最新文章
- Mysql5.7版本ERROR 1055问题
- 移动应用发展远超Web 谷歌苹果将主导世界?联网的发展才刚刚开始
- html中autocomplete无效,OnChange和AutoComplete都不能使用HTML.TextBox
- 【9702】黑白棋的移动
- java $表示什么_java – 变量名中$的含义是什么?
- 三层架构之初识庐山真面目
- 一、数据库应用系统分析及规划
- 3月21日阿里云北京峰会的注册二维码
- python实现团队游戏小程序——你画我猜
- Python计算中国GDP在那一年超越美国GDP(假设)
- element ui级联选择器添加必填验证
- 域名、dns、服务器、IP、主机名(写的好)
- Pegasus education technical support
- 广告轮播图的前后台实现
- 线性代数笔记【空间曲面】
- 【ArcGIS风暴】ArcGIS tif转jpg:JPEG压缩仅支持8位或16位无符号数据(具有一个或三个波段,且没有色彩映射表)解决方案!
- 用c语言求出1加到100的和
- 【论文解读】手术机器人系统的工作原理分析与解读
- 联发科向上,高通向下
- 给一条直线和一个椭圆的方程,它们相交于两点,求交点与原点所构成的三角形的面积的最大值
热门文章
- linux+mysql登录日志_Linux查看登录日志
- python字典和集合对象可以进行索引操作_Python中的字典跟集合整理笔记
- docker 部署_Nginx K8s + Docker 部署 ,虚拟机部署教程。
- JAVA可不可以编写应用程序_编写一个java应用程序
- oracle 增量设为3 循环_Oracle 差异性增量 和 累计增量 原理(转)
- 请概述可视化卷积神经网络的中间输出的基本思想。_最详细的卷积神经网络入门指南!...
- android运行别人的项目_导入他人的Android工程
- 静态ip ssh无法登录_识别动静态IP的技巧
- python导出excel文件数字签名_Python使用RSA+MD5实现数字签名
- 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)