MyBatis初探二
2016-04-03 00:53
495 查看
摘要: 1.Mybatis 的 Dao 层( 持久层 )的开发方式。
》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,通过SqlSessionFactory获取SqlSession来获取数据库操作对象。》
缺点: 1.代码冗余,重复代码很多。
2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。
3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");
2、mapper代理方法( 自己只需要写mapper接口( Dao接口 ) ):与Spring整合后就更简单,这种方式也就不需要了,在这做大概了解。
根据接口编写规范:Mybatis可以自动生成Mapper接口实现类的代理对象
1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件
2.Mybatis自动生成代理实现类需要遵循的规范
->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )
->Mapper.java接口中的方法名和mapper.xml中每个SQL的ID一致
->Mapper.java接口中的输入参数类型和mapper.xml中每个SQL的输入参数指定的类型一致
->Mapper.java接口中的返回值参数类型和mapper.xml中每个SQL的返回值指定的类型一致
3.测试( 不要忘记把mapper.xml添加到SqlMapConfig.xml中)
一、Mybatis 的 Dao 层两种开发方式
1、原始Dao开发模式( 自己手动实现Dao层接口和实现类 )》 实现思路:编写Dao接口和实现类,在Dao接口中注入单例的SqlSessionFactory,通过SqlSessionFactory获取SqlSession来获取数据库操作对象。》
package com.ts.dao; import com.ts.domain.Users; public interface UsersDao { //根据ID查询用户信息 Users findUserById(int id) throws Exception; }
package com.ts.dao.impl; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.ts.dao.UsersDao; import com.ts.domain.Users; public class UsersDaoImpl implements UsersDao { private SqlSessionFactory sqlSessionFactory; //构造函数注入SqlSessionFactory public UsersDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory =sqlSessionFactory; } /** * 1和3是模板代码 * 1.SqlSession sqlSession = getSqlSession(); * 2.业务逻辑 * 3.sqlSession.close(); */ @Override public Users findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); Users user = sqlSession.selectOne("Users.findUserById", id); sqlSession.close(); return user; }
缺点: 1.代码冗余,重复代码很多。
2.根据Users.xmlMapper映射文件的id获取SQL语句(Users.findUserById),硬编码在Java代码里了。
3.调用SqlSession方法时,传入的参数编译期间不报错,不能及时发现错误。(如:sqlSession.selectOne("Users.findUserById","123");
2、mapper代理方法( 自己只需要写mapper接口( Dao接口 ) ):与Spring整合后就更简单,这种方式也就不需要了,在这做大概了解。
根据接口编写规范:Mybatis可以自动生成Mapper接口实现类的代理对象
1.编写UserMapper.java接口和UserMapper.xml的SQL映射文件
package com.ts.dao; public interface UserMapper { public Users findUserById(int id) throws Exception; }
<mapper namespace="com.ts.dao.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.ts.domain.Users"> select * from Users where id = #{id} </select> </mapper>
2.Mybatis自动生成代理实现类需要遵循的规范
->Mapper.xml的namespace 和 mapper.xml接口全限定名一致( 观察上面代码 )
->Mapper.java接口中的方法名和mapper.xml中每个SQL的ID一致
->Mapper.java接口中的输入参数类型和mapper.xml中每个SQL的输入参数指定的类型一致
->Mapper.java接口中的返回值参数类型和mapper.xml中每个SQL的返回值指定的类型一致
3.测试( 不要忘记把mapper.xml添加到SqlMapConfig.xml中)
package com.ts.dao.test; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import com.ts.dao.UserMapper; import com.ts.domain.Users; public class UserMapperTest { private static SqlSessionFactory sqlSessionFactory; @Before public void before() throws IOException{ //通过输入流读取全局配置信息创建工厂 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //生成代理实现类 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Users user = userMapper.findUserById(1); //==>Users [id=1, name=田硕, sex=男, birth=Sat Apr 02 00:00:00 CST 2016, address=河南商丘] System.out.println(user); } }
相关文章推荐
- 刷题(soj、voj)总结
- Quick cocos2dx-Lua中计时器(scheduler)
- 数组与字符串简单剖析
- C/C++中的指针
- skynet
- hadoop的unknownhostexception
- JNI log来代替printf打印调试
- 分享一个网址
- C++ 11的新特性(初识)
- System Permissions—— android系统权限
- 简单的 Winsocket UDP 通信
- hdu CA Loves GCD(dp)
- 阿里巴巴Dubbo实现的源码分析(优秀)
- C++ Prime chapter.9 顺序容器性质(表)
- lua基础——安装使用以及helloworld
- css绝对定位
- Alibaba Dubbo框架同步调用原理分析-2
- iOS开发 ☞ NSString详解
- 多线程与单线程
- 在Elasticsearch中查询Term Vectors词条向量信息