Mybatis Mapper代理的开发方式

1.Mapper代理的开发方式

使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder、SqlSessionFactroy、SqlSession。

小伙伴们都知道,SqlSession中封装了对数据库的操作,如:增删改查,通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建的

a、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

b、SqlSessionFactory

SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

c、SqlSession

SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。

SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象),SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,SqlSession最佳应用场合在方法体内,定义成局部变量使用,绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。今天的博文中,小编将着重介绍小伙伴们介绍mybatis中开发dao的两种方法,原始dao的开发方式和mapper代理开发。

mybatis 中 dao 的开发方法,分别是原始 dao 的开发和 mapper 代理开发,原始Dao开发和Mapper动态代理开发,这两种各有优点。原始Dao开发:程序员要写Dao和Dao实现,需要些较多的代码,但是比较好理解。Mapper动态代理:程序员只需要写Mapper接口,然后按照规范进行配置,MyBatis就会自动实现类似Dao实现,减少模板方法。mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

这里主要介绍mapping代理开发模式

2.Mybatis开发过程

1、编写mybatis的配置文件SqlMapConfig.xml

2、编写mybatis的映射文件mapper.xml

这里主要是定义了statement和sql语句

3、编程通过配置文件创建SqlSessionFactory

4、通过SqlSessionFactory获取SqlSession

5、通过SqlSession操作数据库

如果执行添加、更新、删除需要调用SqlSession.commit()

6、SqlSesion使用完成要关闭

3.Mapper代理的开发规范

1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。

UserMapper.xml

[java] view plain copy

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEmapper
  3. PUBLIC"-//mybatis.org//DTDMapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--namespace命名空间,为了对sql语句进行隔离,方便管理,mapper开发dao方式,使用namespace有特殊作用
  6. mapper代理开发时将namespace指定为mapper接口的全限定名
  7. -->
  8. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

此步骤目的:通过mapper.xml和mapper.Java进行关联。

2、 UserMapper.xml中statement的id就是mapper.java中的方法名

3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致。

4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。

 4.开发

【1】Mapping接口

[html] view plain copy

  1. public interface UserMapper{
  2. //1.根据用户ID查询用户信息
  3. public User findUserById(int id) throws Exception;
  4. //2.添加用户
  5. public void insertUser(User user) throws Exception;
  6. //3.根据用户名字查询用户信息
  7. public List<User> findUserByName(String username) throws Exception;
  8. }

【2】Mapper映射文件

在config下创建mapper目录然后创建UserMapper.xml

namespace和mapper接口的全限定名一致

[java] view plain copy

  1. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
  2. <!--  根据id查询用户信息
  3. id:唯一标识一个statement
  4. #{}:表示一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意
  5. parameterType:输入参数的类型,通过#{}接收parameterType输入的参数
  6. resultType:输出结果类型,不管返回是多条还是单条,指定单条记录映射的pojo类型
  7. -->
  8. <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.user">
  9. SELECT * FROM USER WHERE id= #{id}
  10. </select>
  11. <!-- 添加用户
  12. parameterType:输入参数的类型,User对象包括username,birthday,sex,address
  13. #{}接收pojo数据,可以使用OGNL解析出pojo的属性值
  14. #{username}表示从parameterType中获取pojo的属性值
  15. selectKey:用于进行主键返回,定义了获取主键值的sql
  16. order:设置selectKey中sql执行的顺序,相对于insert语句来说
  17. keyProperty:将主键值设置到哪个属性
  18. resultType:select LAST_INSERT_ID()的结果类型
  19. -->
  20. <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
  21. <selectKey keyProperty="id" order="AFTER" resultType="int">
  22. select LAST_INSERT_ID()
  23. </selectKey>
  24. INSERT INTO USER(username,birthday,sex,address)VALUES(#{username},#{birthday},#{sex},#{address})
  25. </insert>
  26. <!-- 根据用户名称查询用户信息,可能返回多条
  27. ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
  28. -->
  29. <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
  30. select * from user where usernamelike ‘%${value}%‘
  31. </select>
  32. </mapper>

【3】加载映射文件

在SqlMapConfing.xml中加载UserMapper.xml,如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。代码如下所示:

 【4】测试代码

     

小结:

代理对象内部调用selectOne或selectList

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

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

时间: 2024-10-04 23:46:32

Mybatis Mapper代理的开发方式的相关文章

4.MyBatis Mapper代理开发方式(推荐使用)

1 Mapper代理开发方式(推荐) Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可.Mybatis会自动的为mapper接口生成动态代理实现类. 不过要实现mapper代理的开发方式,需要遵循一些开发规范. 1.1  Mapper开发规范 1. mapper接口的全限定名要和mapper映射文件的namespace的值相同. 2. mapper接口的方法名称要和mapper映射文件中的statement的id相同: 3. mapper接口的方法参数只能有一

spring和mybatis的整合(包含原始dao的整合方式和mapper代理整合方式)

一.原始dao的开发的整合方式 1.引入jar包 spring的jar包 mybatis的jar包 由mybatis提供的mybatis和spring的整合jar包(mybatis-spring-xxx.jar) mysql的驱动jar包(mysql-connector-java-5.1.22-bin.jar) c3p0数据源的jar(c3p0-0.9.5.1.jar) 2.引入配置文件和dao的实现代码 结构如下: UserDao接口的代码 package com.si.demo.dao; i

Mybatis 和Spring整合之mapper代理开发

F:\1ziliao\mybatis\代码 1.1 SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <conf

mybatis系列笔记(2)---mapper代理方法

mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下: (2)mapper.xml中namespace等于mapper接口的地址 (3)Usermapper.java接口中国的方法名和Usermapper.xml中statement的id一致 <!-- 7综

mybatis学习笔记,mapper代理方法的使用

一.开发人员需要完成的任务: mapper.xml映射文件和mapper.java 二.开发规范 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的re

mybatis入门-mapper代理原理

原始dao层开发 在我们用mybatis开发了第一个小程序后,相信大家对于dao层的开发其实已经有了一个大概的思路了.其他的配置不用变,将原来的test方法,该为dao的方法,将原来的返回值,直接在dao层进行一下接收就可以了.依然是老一套,先是大框架,然后写配置文件及UserMapper.xml文件这一系列的操作.如果不明白的,请参考本人博客<入门第一个程序>. 我们需要做的就是,首先建立一个会话工厂(SqlSessionFactory),然后用会话工厂创建会话(SqlSession).然后

【MyBatis学习04】mapper代理方法开发dao

上一篇博文总结了mybatis使用 原始dao的方法存在的一些弊端,我们肯定不会去用它,那么mybatis中该如何开发dao呢?如题所述,这篇博文主要来总结一下使用mapper代理的方法来开发dao的步骤. 使用mapper代理的方法来开发dao时,程序员只需要干两件事即可: 需要编写mapper.xml映射文件 需要编写mapper接口(相当于dao接口) 从做的工作来看,使用mybatis中使用mapper代理来开发dao会很方便,完全不需要我们去写具体的实现类,只需要写出接口即可,但是接口

用mybatis实现dao的编写或者实现mapper代理

一.mybatis和hibernate的区别和应用场景hibernate:是一个标准的ORM框架(对象关系映射).入门门槛较高的,不需要写sql,sql语句自动生成了.对sql语句进行优化.修改比较困难的.应用场景:使用与需求变化不多的中小型项目,比如:后台管理系统,erp.orm.oamybatis:专注是sql本身,需要程序员写sql,修改优化比较方便.也可以实现映射.应用场景:使用需求变化较多的项目,比如:互联网项目, 二.实现dao的编写(以user为例) 1.编写userDAO pac

mybatis入门基础(二)----原始dao的开发和mapper代理开发

阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先苦后甜嘛! 回到顶部 一:原始dao开发方法 概要:1.在上篇中搭建好的框价中编写dao接口和dao实现类 2.向dao接口实现类中注入SqlSessionFactory,在方法体内通过SqlSe