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方法中建议不要使用包装类型(不利于业务层的可扩展)。

时间: 2024-10-25 20:34:09

MyBatis Review——开发Dao的方法的相关文章

【MyBatis框架】Mybatis开发dao方法第一部分

下面来讨论mybatis开发Dao的方法 先来说一下基本架构流程中使用到的几个类 1.SqlSession使用范围 1.1SqlSessionFactoryBuilder  通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder. 在需要创建SqlSessionFactory时候,只需要new一次SqlSessi

【MyBatis框架】Mybatis开发dao方法第二部分

下面来继续讨论mybatis开发Dao的方法 我们前面使用原始的Dao开发方法,发现了许多弊端,我们下面使用mapper代理来写Dao方法. 1.mapper代理方法(程序员只需要mapper接口(相当 于dao接口)) 开发人员需要先编写Mapper接口(相当 于dao接口),需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象. package cn.edu.hpu.mybatis.mapper; import cn.edu.hpu.mybatis.PO.User;

【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder.SqlSessionFactroy.SqlSession. 小伙伴们都知道,SqlSession中封装了对数据库的操作,如:增删改查,通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建的

MyBatis实践之DAO与Mapper_java

MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注册驱动.设置参数.创建Connection/Statement.解析结果集等JDBC过程性代码.MyBatis基于XML/注解的方式配置Statement,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class pers

后台(36)——MyBatis的原始Dao开发方式

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

java持久层框架mybatis防止sql注入的方法_java

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

AngularJS整合Springmvc、Spring、Mybatis搭建开发环境_AngularJS

最近想学习AngularJS的使用,网上搜了一圈后,折腾了半天解决bug后,成功使用AngularJS整合Springmvc.Spring.Mybatis搭建了一个开发环境.(这里Spring使用的版本是4.0.6,Mybatis版本是3.2.5,AngularJS的版本是1.0.3) 第一步:创建一Maven项目,在pom.xml下添加需要的包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

求一个接口能使js直接调用到ios开发里面的方法

问题描述 求一个接口能使js直接调用到ios开发里面的方法 求一个接口能使js直接调用到ios开发里面的方法,就是js里面连接一个接口,能直接调用ios里面的函数,进行数据的交互 解决方案 参考iOS中JavaScript和OC交互

提高iOS开发效率的方法和工具(转)

转载作者@__weak_Point部分内容并作出自己认为更加高效率的方式 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这里我主要介绍Xcode中提升开发效率的方法. 1.善用快捷键 快捷键是开发中必不可少的,当你善于使用快捷键的时候,十指在键盘上飞舞,那画面太美,我不敢想象. 常用快捷键操作 2.常用代码片段 开发中有一些常用的代码,可