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的更多相关文章

随机推荐

  1. EZ-USB FX2(68013)固件研究

    原始资料来自网络 整理日: 2015年2月12日 1. Welcome 算是给所有正在学习USB,还徘徊着不得其门而入的朋友一个入门的契机吧,我也深知入门的痛苦,有些人入门就是抱着那什么USB协议,包 ...

  2. ipad在非viewport 1:1下缩放问题

    1.最小会有980宽度,小于980应设置viewport 2.fix元素使用100%指定宽度时,默认会以min-width或980作为尺寸,可以选择给定与页面缩放时触发定宽来设置宽度,或设置设置bod ...

  3. PHP传引用报错(5.4版本)

    php5.3系列版本以及以前版本,传引用没有什么问题,升级到php5.4以后,传引用的地方,全报错 Fatal error: Call-time pass-by-reference has been ...

  4. 【网络流24题】No.9 方格取数问题 (二分图点权最大独立集)

    [题意] 在一个有 m*n 个方格的棋盘中, 每个方格中有一个正整数. 现要从方格中取数, 使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入文件示例inp ...

  5. Jquery UI dialog 传参

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3519318.html] $("#dialog").dialog({ aut ...

  6. C#子线程更新UI控件的方法总结

    http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...

  7. Android用户界面 UI组件--TextView及其子类(一) TextView

    1.TextView android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none /web/email/phone/map/a ...

  8. dump 验证实例恢复的起点和终点

    什么时候会产生实例恢复呢?当你数据库服务器异常断电,重启数据库就会发生实例恢复.实例恢复是由数据库自动完成的,无须DBA的干涉.当然这里有个前提条件:数据文件. 在线日志文件.控制文件不得有损坏. 我 ...

  9. 【HDOJ】3436 Queue-jumpers

    离散化+伸展树. /* 3436 */ #include <iostream> #include <string> #include <map> #include ...

  10. VirtualBox的四种网络连接方式详解

    VirtualBox中有4中网络连接方式: 1. NAT 2. Bridged Adapter 3. Internal 4. Host-only Adapter VMWare中有三种,其实他跟VMWa ...