通过Mybatis原始Dao来实现curd操作
环境的配置见我上一篇博客。
首先,在上一篇博客中,我们知道,SqlSession中封装了对数据库的curd操作,通过sqlSessionFactory可以创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder来进行创建的。

通过ss实例,来实现对数据库的curd操作。
例如: ss.delete("test.deleteUserById", 3);
然后,关于SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFactory,并且SqlSessionFactory一旦创建完成就不需要SqlSessionFactoryBuilder了,所以可以把它当做一个工具类使用。
最佳的使用方法是放到方法体内当局部变量。
关于SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法。最佳使用范围是整个应用运行期间,一旦创建后可以重复使用。所以创建一个实例就够了
所以通常以单例模式管理它。
关于SqlSession
SqlSession是一个面向用户的接口,其中定义了数据库的操作方法。
每个线程都应该有它自己的SqlSession实例,该实例不能被共享使用,它也是线程不安全的。所以使用的最佳范围是请求或方法内。绝对不能把它实例的引用放到一个类的静态字段或实例字段中。
打开一个SqlSession,使用完毕要记得关闭它。所以通常放到finally代码块中以确保每次都能关闭。
这里直接进入正题~~
配置文件依旧用的上一篇博客定义的User.xml
首先,编写Dao接口和Dao实现类
在这里,用查询操作来举例子。
要实现Insert,update,delete操作,都是同样的道理,这里不再赘述。

由于SqlSessionFactory一旦创建后可以重复使用。所以创建一个实例就够了,并且可以通过构造方法把它传入进去。
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
//通过构造方法注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(Integer id) {
//sqlSession是线程不安全的,所以它最佳的使用范围在方法体内,用完就能销毁
SqlSession ss = sqlSessionFactory.openSession();
User user = ss.selectOne("test.findUserById", id);
return user;
}
@Override
public List<User> findUserByUserName(String username) {
SqlSession ss = sqlSessionFactory.openSession();
List<User> list = ss.selectList("test.findUserByUserName",username);
return list;
}
}
测试代码:
public class UserDaoTest {
private SqlSessionFactory factory;
//在测试方法前执行这个方法
@Before
public void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
UserDao userdao = new UserDaoImpl(factory);
User user = userdao.findUserById(1);
System.out.println(user);
}
@Test
public List<User> testFindUserByUsername() throws Exception{
UserDao ud = new UserDaoImpl(factory);
List<User> list = ud.findUserByUserName("王");
return list;
}
}
这是第一个方法的运行结果:

原始Dao开发存在的问题:
Dao方法体依旧存在重复代码,即:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法。
在本例中,调用sqlSession的数据库操作方法需要指定id,这里存在硬编码,不利于开发维护。
通过Mybatis原始Dao来实现curd操作的更多相关文章
- Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合
Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合 标签: mybatisSpringbeanApplicationContextMapper 2015-12-31 1 ...
- MyBatis原始dao开发及问题总结(五)
一.MyBatis原始Dao开发方式 1.原始dao开发需要程序员编写dao接口和dao接口实现类 编写UserDao接口:UserDao.java package codeRose.dao; pub ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
- Mybatis 原始dao CRUD方法
用到的相关jar包及所用版本如下: 其中的Mybatis可以到github.com的网站下载 <project xmlns="http://maven.apache.org/POM/4 ...
- MyBatis 原始Dao开发方式
原始Dao开发方法需要程序员编写Dao接口和Dao实现类. 映射文件 <?xml version="1.0" encoding="UTF-8" ?> ...
- Mybatis使用Dao代码方式CURD
Mybatis 使用Dao代码方式进行增.删.改.查. 1.Maven的pom.xml <project xmlns="http://maven.apache.org/POM/4.0. ...
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...
- 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...
- MyBatis开发Dao层的两种方式(原始Dao层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
随机推荐
- 第 9 章 数据管理 - 077 - 跨主机使用 Rex-Ray volume
跨主机使用 Rex-Ray volume 在docker1上创建mysql容器,并挂载使用mysqldata数据卷 磁盘文件直接挂载在了docker1 上 验证数据 也是存在的 Rex-Ray 可以提 ...
- 《R语言入门与实践》第四章:R 的记号体系
这一章节将如何对 R 对象中的值进行选取,R 的符号规则有两种方式进行查询: 第一种记号体系:索引查询索引语法:deck[ , ](使用中括号)其中[ , ] 为索引,其中含有两个索引参数,用 &qu ...
- LInux 些许知识
1.Linux下去掉^M的方法 ①dos2unix filename ②sed -i 's/^M//g' filename #注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M 2.so ...
- JVM垃圾回收(二)- Minor GC vs Major GC vs Full GC
Minor GC vs Major GC vs Full GC 垃圾回收的活动会清理对内存中的不同区域,这些事件一般被称为Minor,Major以及Full GC events.本章我们会讨论这些清理 ...
- java网络编程小白教程
1 网络编程 1.1 网络 把多台终端(计算机)通过物理线路连接起来,形成网络.便于交换数据.共享信息.组成更强大的逻辑体. 1.1.1 网络通信三要素 [1]IP地址:唯一标识网络上的每一台计算机 ...
- vue中data中引用本地图片报错404
首先说明vue-cli中assets和static两个文件的区别 1.assets在项目编译的过程中会被webpack处理理解为模块依赖,如果执行npm run dev或npm run build命令 ...
- 『Python』为什么调用函数会令引用计数+2
一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...
- BUAAOO-Second-Summary
#目录 homework & class & trainning : 两次上机.三次作业.四周课堂 code analysis & review : 为什么我没有bug,为什么 ...
- day2 购物车
需求: 商家入口: 1.商品列表永久保存(暂时使用存储在文件,也可以使用sqlite)里. 2.商家可以增加商品,也可以修改商品价格 买家入口: 1.购物车信息永久保存,暂时使用存储在文件,也可以使用 ...
- riakKV 配置
安装好riakKV之后, 我们需要将 riak.conf 文件中的 nodename修改为本机的 IP 地址. nodename = xx@xxx.xxx.xx.xx listener.http.in ...