mybatis开发dao的方法——(三)
------------------------1. SqlSession使用范围-------------------
1.1 SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。
在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
1.2 SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。
将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
1.3 SqlSession
SqlSession是一个面向用户(程序员)的接口。
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。
-----------2. 原始dao开发方法(程序员需要写dao接口和dao实现类)--------
1. 思路
程序员需要写dao接口和dao实现类。
需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
2. dao接口
3.dao实现类
public class UserDaoImpl implements UserDao {// 需要向dao实现类中注入SqlSessionFactory// 这里通过构造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User findUserById(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);// 释放资源 sqlSession.close();return user;}@Overridepublic void insertUser(User user) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//执行插入操作sqlSession.insert("test.insertUser", user);// 提交事务 sqlSession.commit();// 释放资源 sqlSession.close();}@Overridepublic void deleteUser(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//执行插入操作sqlSession.delete("test.deleteUser", id);// 提交事务 sqlSession.commit();// 释放资源 sqlSession.close();}}
4. 测试代码:
5. 原始 dao开发问题
1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2、调用sqlsession方法时将statement的id硬编码了
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
--------------3. mapper代理开发程序员只需要写mapper接口----------------------
1 思路(mapper代理开发规范)
程序员还需要编写mapper.xml映射文件
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
总结:
以上开发规范主要是对下边的代码进行统一生成:
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.insert("test.insertUser", user);
2. mapper.java
3. mapper.xml
4. 在SqlMapConfig.xml中加载mapper.xml
5.测试
6.总结:
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
附一个完整的mapper开发的配置文件以及测试:(Maven结构)
0.目录结构:
1.Exam表结构:
2.Exam.java与ExamExample.java都是mybatis逆向工程导出来的:
3.ExamMapper,java与ExamMapper.xml也是mybatis逆向工程导出来的:
4.SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 加载属性文件 --><properties resource="db.properties"><!--properties中还可以配置一些属性名和属性值 --><!-- <property name="jdbc.driver" value=""/> --></properties><!-- 全局配置参数,需要时再设置 --><!-- <settings> </settings> --><!-- 别名定义 --><typeAliases><!-- 针对单个别名定义 type:类型的路径 alias:别名 --><!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --><!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) --><package name="cn.itcast.mybatis.po" /></typeAliases><!-- 和spring整合后 environments配置将废除 --><environments default="development"><environment id="development"><!-- 使用jdbc事务管理,事务控制由mybatis --><transactionManager type="JDBC" /><!-- 数据库连接池,由mybatis管理 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><!-- 加载 映射文件 --><mappers><!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中 上边规范的前提是:使用的是mapper代理方法 --><package name="cn.xm.exam.mapper" /></mappers></configuration>
5.测试代码:
package cn.xm.exam.daoTest;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 cn.xm.exam.bean.exam.Exam; import cn.xm.exam.mapper.exam.ExamMapper;public class PageHelperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws IOException {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void test1() {SqlSession sqlSession = sqlSessionFactory.openSession();//创建UserMapper对象ExamMapper examMapper = sqlSession.getMapper(ExamMapper.class);Exam exam = examMapper.selectByPrimaryKey("02e23c37781b4f71a84c5074a8b844d1");System.out.println(exam.toString());} }
mybatis开发dao的方法——(三)相关推荐
- Mybatis学习记录(二)----mybatis开发dao的方法
1 SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将Sq ...
- MyBatis开发Dao的方法
1.SqlSession的使用范围 1.1 SqlSessionFactoryBuilder:用来创建SqlSessionFactory,只需要把SqlSessionfactoryBuilder当成一 ...
- Mybatis 开发 dao 的方法
1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...
- mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...
5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...
- 【MyBatis框架】Mybatis开发dao方法第二部分
下面来继续讨论mybatis开发Dao的方法 我们前面使用原始的Dao开发方法,发现了许多弊端,我们下面使用mapper代理来写Dao方法. 1.mapper代理方法(程序员只需要mapper接口(相 ...
- 【MyBatis框架】Mybatis开发dao方法第一部分
下面来讨论mybatis开发Dao的方法 先来说一下基本架构流程中使用到的几个类 1.SqlSession使用范围 1.1SqlSessionFactoryBuilder 通过SqlSessionF ...
- 【mybatis基础】mybatis开发dao两种方法
mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...
- mybatis教程--原始方式和mapper方式开发dao详解
mybatis开发dao的两种方式 一.原始的dao开发方式 所谓的原始的dao的开发方式,其实就是和hibernate的开发方式类似的,需要dao的接口和dao的实现类,这个就是原始的开发方式,而m ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...
最新文章
- 打桥位lisp_lisp函数
- python开发跟淘宝有关联微_使用Python分析淘宝用户行为
- OEL7.2下Oracle11.2.0.4RAC部署
- php统计变量的位数,php实现统计二进制中1的个数算法示例
- java 注解默认值
- 【遥感物候】Hants NDVI时间序列谐波分析法数据重构,植被生长季曲线效果可佳(附Hants软件下载)
- python lxml xpath_Python/lxml/Xpath:如何找到包含特定文本的行?
- 如何使用Behat在Drupal中使用行为驱动的开发
- memcached的安装(server、client)、magent整合
- Mac 下安装Redis
- DNS篇之二DNS记录类型
- UCI数据集详解及其数据处理(附148个数据集及处理代码)
- 内地见证可以办理哪些香港银行卡?哪家更方便门槛要求更低?
- django学习日志(模板的渲染过程)第八部分:字符串数据转义
- 百度音乐高调改名后 掉队的千千音乐还有机会吗?
- python获取当前工作路径
- single无效,使用maxLines
- Android/Linux招聘要求
- pytorch中实现Balanced Cross-Entropy
- 多商家入驻分销平台基本功能设计
热门文章
- .NET设计模式(4):建造者模式(Builder Pattern)(转)
- WebService注解
- ping: unknown host www.baidu.com问题解决
- Laravel 中的 Many-To-Many
- Java 定时任务调度工具 Quartz(Part 2)
- consul-template + nginx部署高可用负载均衡
- @MySQL为表字段添加索引
- 事务的应用demo1-------采用JDBC硬编码方式模拟银行转账。
- 如何在vc的拆分窗口中使用CFormView派生类
- Kraken采用CashAddr地址,BCH地址统一向前一步