mybatis09
1mybatis开发dao的方法
.1SqlSession作用范围
是使用局部变量、成员变量,还是形参? 1.1.1SqlSessionFactoryBuilder
SqlSessionFactoryBuilder不是单例是以工具类方式来使用,用来创建sqlSessionFactory,需要创建sqlSessionFactory就new一个SqlSessionFactoryBuilder,之后就一直没用了。 1.1.2sqlSessionFactory
正常开发时,new一次,以单例方式管理sqlSessionFactory,整个系统运行过程中sqlSessionFactory只有一个实例,将来和spring整合后由spring以单例方式管理sqlSessionFactory。 1.1.3SqlSession sqlSession是一个面向用户(程序员)的接口,程序员调用sqlSession的接口方法进行操作数据库。
sqlSession能否以单例 方式使用??
由于sqlSession的成员变量有数据字段,多线程是共享成员变量的数据,是线程不安全,所以sqlSession最佳应用范围在方法体内,如果sqlSession定义成成员变量则多个线程会共享该成员变量,在方法体内定义局部变量使用sqlSession,因为每个线程对于方法中的内存空间是互不影响的。
1原始dao开发方式
.
程序员需要写dao接口和dao 的实现 类 1.1.1dao接口
package cn.itcast.mybatis.dao;
import java.util.List;
import cn.itcast.mybatis.po.User;
public interface UserDao {
//根据id查询用户信息,异常抛给了service
public User findUserById(int id) throws Exception;
//根据用户名称模糊查询用户列表
public List<User> findUserByUsername(String username) throws Exception;
//插入用户
public void insertUser(User user) throws Exception;
}
dao接口实现
package cn.itcast.mybatis.dao; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import cn.itcast.mybatis.po.User; public class UserDaoImpl implements UserDao { private SqlSessionFactory sqlSessionFactory; // spring将SqlSessionFactory注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
} @Override
public User findUserById(int id) throws Exception { // 创建SqlSession,SqlSession有sql语句,所以要在方法内部才能没有线程安全问题。
SqlSession sqlSession = sqlSessionFactory.openSession(); // 根据id查询用户信息
User user = sqlSession.selectOne("test.findUserById", id);
//与spring整合之后不需要手动关闭
sqlSession.close(); return user; } @Override
public List<User> findUserByUsername(String username) throws Exception {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("test.findUserByName", username);
sqlSession.close();
return list;
} @Override
public void insertUser(User user) throws Exception {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser", user);
//
sqlSession.commit();
sqlSession.close(); } }
测试:
package cn.itcast.mybatis.dao; import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import cn.itcast.mybatis.po.User; public class UserDaoImplTest { // 会话工厂
private SqlSessionFactory sqlSessionFactory; // 创建工厂
@Before
public void init() throws IOException { // 配置文件(SqlMapConfig.xml)
String resource = "SqlMapConfig.xml"; // 加载配置文件到输入 流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test
public void testFindUserById() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById();
System.out.println(user); } }
问题:
1.1.1上边原始dao开发方式的问题
dao的实现类中存在重复代码,整个mybatis操作的过程的整个代码模板就重复了(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)都是这3中模版。 、dao的实现 类中存在硬编码,调用sqlsession方法时将statement的id硬编码(sqlSession.selectList("test.findUserByName", username)的test.findUserByName硬编码
)不利于系统维护。
mapper代理的方式解决的问题,
程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象,不用程序员写了,就不存在重复代码,实现类不用写可以封装了,将重代码封装起来。
本身dao在三层架构中就是一个通用的接口。Service不是通用的接口。
mybatis09的更多相关文章
随机推荐
- PHP 中的随机数——你觉得可靠么?
本文主要分析以加密为目的的随机数生成问题.PHP 5 并未提供生成强加密随机数的简便机制,但是,PHP 7 引入了两个 CSPRNG 函数以解决该问题.系 OneAPM 工程师编译整理. 什么是 CS ...
- ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合
package com.example.s02_e12_json3; import java.lang.reflect.Type; import java.util.Iterator; import ...
- bzoj1927
看到这道题不难想到费用流吧,但是怎么做呢? 一开始看到“每个点都恰好走一次”,我首先想到的有下界最小费用流, 然后发现这没有满足最大流的条件,然后又连边松弛掉多余的流 为了按照可行流的做法先减减去极大 ...
- 日常工作中使用的一些Mongodb语句
.通过_userID字段查询重复录入内容 > db.template.aggregate({}}},{$}}) .查询 db.template.find({"group_7ee1247 ...
- WP8模拟器需要BIOS开启虚拟化支持(转载)
在BIOS里启用hypervisor和virtualization,然后安装WP8 SDK. 如果出现“当前用户未添加到Hyper-V管理组时”, 以管理员身份运行CMD: net localgrou ...
- [NOIP2007]奖学金
题目来源:http://www.luogu.org/problem/show?pid=1093# 2007年NOIP全国联赛普及组 [题目描述 Description] 某小学最近得到了一笔赞助, ...
- bayer图像格式
Bayer数据,其一般格式为:奇数扫描行输出 RGRG……偶数扫描行输出 GBGB…… 根据人眼对彩色的响应带宽不高的大面积着色特点,每个像素没有必要同时输出3种颜色.因此,数据采样时, 奇数扫描行的 ...
- Linux下常用I/O模型
Linux异步I/O是Linux内核中提供的一个相当新的增强.它是2.6版本内核的一个标准特性,异步非阻塞I/O背后的基本思想是允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成.稍后或在接收到 ...
- 转:栈和队列小知识【STL用法】
原文出处:http://blog.csdn.net/chenzhenyu123456/article/details/44519943 栈: (一)头文件 #include<stack> ...
- 【python自动化第七篇:面向对象进阶】
知识点概览: 静态方法,类方法,属性方法 类的特殊方法 反射 异常处理 socket开发基础 一.静态方法:@staticmethod 只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何 ...