发表于: 2016-07-19 12:26:45

2 2316


【完成工作】

花了一个多星期仔细理了一下mybatisspring+mybatis,springmvc,springmvc+mybatis

Mybatis

Mybatis是一个持久成框架,是对jdbc的封装,所以想弄懂mybatis,个人认为先得看一看jdbc,即通过java代码访问数据库。

以下为任务一mybatis工程的完成步骤及 原始开发mappermapper的代理开发

源码链接:http://pan.baidu.com/s/1miq7BRi   (maven项目)

1.  所需jar包:

1mybatis-3.1.1

2mysql-connection-java-5.1.20

3commons-dbcp-1.2.2 (本例用dbcp驱动访问数据库)

4junit-4.10

5log4j-1.7.7slf4j-api-1.5.8slf4j-log4j12-1.5.8

2.  pojo类(本例中为Student.class

3.  log4j.properties

4.  配置SqlMapConfig.xml

         该文件用于加载mybatis运行环境(数据源,事务,加载mapper.xml

(1)     数据源:可以直接硬编码或者配置jdbc.properties

(2)     为了调用方便,可以定义别名。

(3)     加载mapper.xml

5.  配置mapper.xml

         该文件用于配置sql语句,可以让程序员灵活操作数据库。

Namespace sql语句进行隔离,方便管理,可随意命名;若使用mapper代理开发则有特殊格式。

Id:用于标识一个方法(statement);

ParamterType:输入参数类型;

ResultType:输出参数。

#{id}:表示一个占位符,id为形参;

${name}:表示一个字符串,name为形参(不能防止sql注入)。

每个方法只能有一个输入参数和返回参数,若想输入或返回多个参数可通过封装类完成。

6. junit测试

 1)读取SqlMapConfig.xml

 2)加载配置到输入流

 3)创建会话工厂

 4)通过sqlSessionFactory创建sqlSession

 5)调用sqlSession的方法查询数据库

        SqlSession.selectone(); 返回单条记录,可用pojo类接;

        SqlSession.select(); 返回多条记录,用集合接。

 6)提交,关闭sqlSession


实际开发中会写一个daomapper)层接口,然后通过反射或者spring注入的方式直接调用接口中的方法。下面对不同的dao开发方式进行对比。

 

原始dao开发

1.      dao接口

2.      dao接口实现

(1)     拿到sqlSessionFactory(和sping整合后通过注入拿到,这里通过构造方法拿到)

(2)     创建sqlSession

(3)     调用mapper.xml中的方法

(4)     提交,关闭sqlSession


sqlSession.close();应该写在finally块中,以便程序运行出错后依然执行。这里只测试第一个方法,故后面没有写。

3.      Junit测试

可以直接选中需要测试的类创建junit测试类。


(1)     创建sqlSessionfactory

(2)     注入sqlSessionfactory

(3)     调用方法测试

mapper代理开发方式

1.      Mapper namespace指定为dao接口的全限定名,是mapper.xmlmapper.java相关联。

接口中的方法名,输入参数,返回值类型与mapper.xml中对应的方法相同。

2.      测试。

15.16.17.18


通过dao代理开发不用编写dao实现类,通过反射可以拿到dao接口对应mapper.xml中的方法,然后可以直接调用。

可以看出,通过mybatis访问数据库的程序中,原始开发dao方式中调用方法的方式为:

student= sqlSession.selectOne("com.nitasty.dao.StudentMapper.getStudentById", id);

sqlSession.insert("com.nitasty.dao.StudentMapper.addStudent",student);

sqlSession.update("com.nitasty.dao.StudentMapper.updateStudent",student);

sqlSession.delete("com.nitasty.dao.StudentMapper.deleteStudentById", id);

必须通过mapper.xml中的namespace+加方法id 才能调用,这样的硬编码不利于后期维护。

通过dao代理的方式可以直接拿到方法避免硬编码。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

但是两种方式都需要反复打开和关闭sqlSession,导出程序中存在大量重复代码,

而通过mybatis+spring 可以避免这个问题。详情见下一篇日报。

【遇到问题】

1.      调试中的各种错误,已解决。

【目前收获】

1.      理解了mybatis的作用,学习了原始daomapper)开发和daomapper)代理开发。

原始dao开发需要自己编写dao实现类;而dao代理开发通过反射直接拿到mapper.xml中的方法(感觉和springIOC类似,容我再研究研究),不需要编写实现类。

【后续计划】

1.      整理spring+mybatisspringmvcspringmvc+mybatis



返回列表 返回列表
评论

    分享到