存在的问题:
原始Dao开发中存在以下问题:
1.Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
2.调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护

Dao开发方法:
使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法。这里先介绍原始DAO方法的使用!
SqlSession的使用范围

  1. SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
  2. SqlSession通过SqlSessionFactory创建.
  3. 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开发方法以及存在的问题相关推荐

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

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

  2. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...

  3. mybatis开发dao的方法——(三)

    ------------------------1.    SqlSession使用范围------------------- 1.1     SqlSessionFactoryBuilder 通过S ...

  4. Mybatis学习记录(二)----mybatis开发dao的方法

    1  SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将Sq ...

  5. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisS ...

  6. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  7. 原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)

    1.原始Dao开发方式 原始Dao开发方法需要程序员编写Dao接口和Dao实现类. 1.映射文件:(user.xml) <?xml version="1.0" encodin ...

  8. MyBatis开发Dao的方法

    1.SqlSession的使用范围 1.1 SqlSessionFactoryBuilder:用来创建SqlSessionFactory,只需要把SqlSessionfactoryBuilder当成一 ...

  9. Mybatis 开发 dao 的方法

    1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...

最新文章

  1. Mysql5.7版本ERROR 1055问题
  2. 移动应用发展远超Web 谷歌苹果将主导世界?联网的发展才刚刚开始
  3. html中autocomplete无效,OnChange和AutoComplete都不能使用HTML.TextBox
  4. 【9702】黑白棋的移动
  5. java $表示什么_java – 变量名中$的含义是什么?
  6. 三层架构之初识庐山真面目
  7. 一、数据库应用系统分析及规划
  8. 3月21日阿里云北京峰会的注册二维码
  9. python实现团队游戏小程序——你画我猜
  10. Python计算中国GDP在那一年超越美国GDP(假设)
  11. element ui级联选择器添加必填验证
  12. 域名、dns、服务器、IP、主机名(写的好)
  13. Pegasus education technical support
  14. 广告轮播图的前后台实现
  15. 线性代数笔记【空间曲面】
  16. 【ArcGIS风暴】ArcGIS tif转jpg:JPEG压缩仅支持8位或16位无符号数据(具有一个或三个波段,且没有色彩映射表)解决方案!
  17. 用c语言求出1加到100的和
  18. 【论文解读】手术机器人系统的工作原理分析与解读
  19. 联发科向上,高通向下
  20. 给一条直线和一个椭圆的方程,它们相交于两点,求交点与原点所构成的三角形的面积的最大值

热门文章

  1. linux+mysql登录日志_Linux查看登录日志
  2. python字典和集合对象可以进行索引操作_Python中的字典跟集合整理笔记
  3. docker 部署_Nginx K8s + Docker 部署 ,虚拟机部署教程。
  4. JAVA可不可以编写应用程序_编写一个java应用程序
  5. oracle 增量设为3 循环_Oracle 差异性增量 和 累计增量 原理(转)
  6. 请概述可视化卷积神经网络的中间输出的基本思想。_最详细的卷积神经网络入门指南!...
  7. android运行别人的项目_导入他人的Android工程
  8. 静态ip ssh无法登录_识别动静态IP的技巧
  9. python导出excel文件数字签名_Python使用RSA+MD5实现数字签名
  10. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)