当前位置: 首页 > news >正文

MyBatis Review——开发Dao的方法



一,原始Dao开发方法


   需要编写的类:Dao接口及Dao接口的实现类。

   使用逻辑:通过向Dao实现类中注入SqlSessionFactory,在方法体内部通过SqlSessionFactory创建SqlSession对象,再通过SqlSession对象操作statement。


  例如:


Dao接口:

/**
 * @author LiuHuiChao
 * 用户管理dao接口
 *
 */
public interface UserDao {

	//根据id来查询用户信息
	public User findUserById(int id) throws Exception; 
	
	//添加用户信息
	public void insertUser(User user) throws Exception;

	//删除用户信息
	public void deleteUser(int id) throws Exception;
	
	//根据用户名称查询用户列表
	public List<User> findUserByUserName(String name) throws Exception;
	
}

Dao实现类:


public class UserDaoImpl implements UserDao{
	
	//注入sqlSessionFactory
	//通过构造函数注入
	private SqlSessionFactory sqlSessionFactory;
	public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
		this.sqlSessionFactory=sqlSessionFactory;
	}

	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		return sqlSession.selectOne("test.findUserById", id);
	}

	@Override
	public void insertUser(User user) throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		sqlSession.insert("test.insertUser", user);
		sqlSession.commit();//提交事务
		sqlSession.close();//释放资源
	}

	@Override
	public void deleteUser(int id) throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		sqlSession.insert("test.deleteUser", id);
		sqlSession.commit();//提交事务
		sqlSession.close();//释放资源
	}

	@Override
	public List<User> findUserByUserName(String name) throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		return sqlSession.selectList("test.findUserByName", name);
	}

}


调用示例:


public class UserDaoImplTest {

	private SqlSessionFactory sqlSessionFactory;
	
	/*此方法是在执行testFindUserDaoById之前执行的*/
	@Before
	public void setUp() throws Exception{
		//sqlSessionFactory
		
		//mybatis配置文件
		String resource="SqlMapConfig.xml";
		//得到配置文件
		InputStream inputStream=Resources.getResourceAsStream(resource);
		//创建会话工厂,传入mybatis的配置信息
		sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void testFindUserById() throws Exception {
		//创建一个UserDao,调用它的方法
		UserDao userDao=new UserDaoImpl(sqlSessionFactory);
		User user=userDao.findUserById(1);
		System.out.println(user.getUsername());
		
		
	}

	
}



使用这种方式的弊端:


        1,dao接口实现类的方法中存在大量的模板方法,代码重复过多,设想能否将这些代码提取出来,减轻工作量。

        2,调用sqlSession执行方法的时候,将statement的id硬编码了。

        3,调用sqlSession方法进行传递参数的时候,由于方法类型为object,即使数据类型传递错误,在编译阶段也不会报错,不利于开发时候排错。



二,mapper代理开发方式


     需要编写:Mapper.java跟Mapper.xml。


      注意,程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

    需要注意的开发规范:


      1,在mapper.xm中定义的namespace的名称要跟mapper.java的位置一致:


            


     2,mapper接口中的方法名称跟mapper.xml中statement的id一致。

     3,mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

     4,mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。



      示例:






 测试方法:


@Test
	public void testFindUserById() throws Exception {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		
		//创建UserMapper对象
		UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
		
		//调用mapper方法
		User user=usermapper.findUserById(1);
		System.out.println(user.getUsername());
		
	}


开发中问题小结


     1,代理对象内部调用selectOne or selectList

             如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

           如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。



     2,mapper接口方法参数只能有一个的问题

      

            mapper接口方法参数只能有一个,系统是否不利于扩展维护???


                    系统框架中,dao层的代码是被业务层公用的。

                     即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。


            注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。





相关文章:

  • react实现路由跳转传参的方式 三种
  • RPC 的概念模型与实现解析
  • react路由传参,以及优缺点 带例子
  • MySQL · 特性分析 · innodb buffer pool相关特性
  • 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么? 分为4个步骤
  • VMware虚拟设备之虚拟磁盘配置与虚拟磁盘置备类型相关介绍
  • 优秀的技术Leader
  • BOM对象有哪些,列举window对象
  • redux实现数据存取的简单写法,简单的写了一下,相信你应该可以看得懂的
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 面向对象三大基本特性 三大特性是:封装,继承,多态
  • CentOS-5.6-x86_64 下搭建DNS服务器
  • 什么是值传递和引用传递
  • nodejs的调试(node-inspector)
  • Es6中我常用的新特性总结
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • (三)从jvm层面了解线程的启动和停止
  • 【Leetcode】104. 二叉树的最大深度
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • angular2 简述
  • create-react-app项目添加less配置
  • Java的Interrupt与线程中断
  • php ci框架整合银盛支付
  • Puppeteer:浏览器控制器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 闭包--闭包之tab栏切换(四)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分布式任务队列Celery
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入门级的git使用指北
  • 树莓派 - 使用须知
  • 网页视频流m3u8/ts视频下载
  • 微信开源mars源码分析1—上层samples分析
  • 中文输入法与React文本输入框的问题与解决方案
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (31)对象的克隆
  • (4)Elastix图像配准:3D图像
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (solr系列:一)使用tomcat部署solr服务
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (一)SpringBoot3---尚硅谷总结
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)项目管理杂谈-我所期望的新人
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .equals()到底是什么意思?
  • .net Application的目录
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net 获取url的方法
  • .NET/C# 使窗口永不获得焦点