相信看过我的上一篇博客的同学都已经对mybatis有一个初步的认识了。这篇博客主要是对mybatis的mapper代理做一下简单的介绍,希望能够帮助大家共同学习。

我的上一篇博客:mybatis入门介绍


相信用过mybatis的程序员都知道mybatis有两种配置文件,这个在上一篇博客中也写到。为了这篇博客的整体性,在这里重复一次。

这两种配置文件分别是:

SqlMapConfig.xml(mybatis全局配置文件,名称不固定,用来配置运行环境(数据源、事务)

XXXmapper.xml 主要用来配置sql语句

而SqlMapConfig.xml文件在整个项目中只有一个,而XXXmapper.xml却又很多个。

我们这篇博客的主要内容是和这个XXXmapper.xml有关的。

想必大家都知道在mybatis项目中,会有和XXXmapper.xml同名的Java文件,也就是XXXmapper.java而且,它是一个接口

至于为什么要有XXXmapper.Java,以我现在学习的基础,我认为应该是为了方便调用同名xml文件中的statement,而我看的教学视频上说:

1、dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)

2、dao的实现 类中存在硬编码,调用sqlsession方法时将statement的id硬编码。

所以我们先介绍一下传统的Dao方法开发mybatis。


原始dao开发方式

  1.先创建Dao接口

  

  2.实现Dao接口

  

  3.测试代码

  

  从上面的三段代码中可以验证我们前面所说的:

  1、dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)

  2、dao的实现 类中存在硬编码,调用sqlsession方法时将statement的id硬编码。


下面我们再来写一写这个通过mapper代理的方式来开发:

mapper代理的方式

  使用mapper代理的方式来开发的话,我们是不需要Dao的实现类的,因为我们通过mapper的代理,来创建代理类,mybatis提出了mapper接口,相当 于dao 接口。

  而Mapper的代理类,就相当于Dao的实现类。但是代理类并没有Dao的实现类那样存在重复性代码和硬编码问题。

亮代码:

1.仍然是Dao接口:

 public interface UserDao {

     //根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据用户名称模糊查询用户列表
public List<User> findUserByUsername(String username) throws Exception;
//插入用户
public void insertUser(User user) throws Exception; }

2.XXXmapper.xml(代码选择性粘贴,如果直接拷贝的话请自行修改)

     <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
select * from user where username like '%${value}%'
</select> <!-- 自定义查询条件查询用户的信息
parameterType:指定包装类型
%${userCustom.username}%:userCustom是userQueryVo中的属性,通过OGNL获取属性的值
-->
<select id="findUserList" parameterType="userQueryVo" resultType="user"> select id,username,birthday from user
<!-- where标签相当 于where关键字,可以自动去除第一个and -->
<where>
<!-- 引用sql片段,如果sql片段和引用处不在同一个mapper必须前边加namespace -->
<include refid="query_user_where"></include>
<!-- 下边还有很其它的条件 -->
<!-- <include refid="其它的sql片段"></include> -->
</where>
</select>

3.UserMapper.java

 public interface UserMapper {

     //根据用户id查询用户信息
public User findUserById(int id) throws Exception; //根据用户名称 查询用户信息
public List<User> findUserByName(String username) throws Exception; //自定义查询条件查询用户信息
public List<User> findUserList(UserQueryVo userQueryVo) throws Exception; //查询用户,使用resultMap进行映射
public List<User> findUserListResultMap(UserQueryVo userQueryVo)throws Exception;
//查询用户,返回记录个数
public int findUserCount(UserQueryVo userQueryVo) throws Exception; //插入用户
public void insertUser(User user)throws Exception;
//删除用户
public void deleteUser(int id) throws Exception;
//修改用户
public void updateUser(User user) throws Exception;
}

通过这三个文件我们就完成了mybatis对增删改查的编写,就差一个测试类了,也是最关键的。此处先不贴出测试类的代码。这里请注意上面三个代码UserMapper.xml , UserMapper.java , UserDao.java

这种写法比传统的Dao开发mybatis容易很多。代码里没有了重复性代码和硬编码!没有了UserDaoImpl.java中那种创建、连接、关闭等重复性的操作了。

而这种写法应该注意一点就是UserMapper.java和UserMapper.xml是要关联起来的!

而通过什么来关联呢?就是namespace:通过namespace里面,填上UserMapper.java的权限定名即可!

而UserMapper.xml文件中的一些规则也应该注意:

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

2、mapper.xml中statement的parameterType和mapper.java中方法输入参数类型一致

3、mapper.xml中statement的resultType和mapper.java中方法返回值类型一致.

 最后贴出很重要的测试类代码:

 public class UserMapperTest {

     // 会话工厂
private SqlSessionFactory sqlSessionFactory; // 创建工厂
@Before
public void init() throws IOException { // 配置文件(SqlMapConfig.xml)
String resource = "SqlMapConfig.xml"; // 加载配置文件到输入 流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test
public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); System.out.println(user); }

这个测试类的代码应该着重注意到第26行的创建代理对象。UserMapper是个代理类,虽然不知道里面怎么样把那些重复性代码封装起来的,但是,这种方法用起来确实很方便,通过代理,我们都不必实现UserMapper这个接口了(大家别忽视了UserMapper是个接口),只需要一个代理类就能解决全部问题!所以代理还是一种很不错的方法来帮助我们开发的!

对了!还有一点要注意!每当我们创建一个新的XXXmapper.xml文件,都要在总的配置文件SqlMapConfig.xml加上这个配置文件的信息!

然而,我最近了一个项目,我自己写了一个xml文件,可是并没有在总的配置文件中编写xml配置文件信息,依然可以正常运行,打开那个全局配置文件,也没有看到那些配置。可能是我水太浅,请哪位大神能告诉我那些配置最后都哪去了?

经过自己一番百度,终于找到了结果,此处也给大家写出来解决一些新手的疑惑:

现在经过百度终于知道了,mybatis在和Spring整合之后,只需要一条配置信息就可以将所有的XXXmapper.xml加载了。

如下:

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
.......
<property name="mapperLocations" value="classpath:/mappings/**/*.xml"/>
</bean>

这样的话,就可以加载到classpath下的mappings下面的所有以xml结尾的配置文件了。

mybatis入门介绍二的更多相关文章

  1. mybatis入门介绍一

    首先介绍一下Mybatis是什么?mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装. 使用mybatis之后,开发者只需要关注sql ...

  2. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

  3. MyBatis入门(二)---一对一,一对多

    一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybati ...

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

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  5. JavaScript入门介绍(二)

    JavaScript入门介绍 [函数] 函数function 是Javascript的基础模块单元,用于代码的复用.信息影藏和组合调用. function a(){} 函数对象Function Lit ...

  6. MyBatis入门(二)接口式编程

    在  MyBatis入门(一) 的基础之上编写接口 将接口和Mapper文件进行绑定,会为接口创建一个代理对象,代理对象去执行增删改查 (1)编写接口 public interface EmpDao ...

  7. MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询

    一.输入映射和输出映射 1. parameterType(输入类型) 1.1 传递简单类型 <select id="getUserById" parameterType=&q ...

  8. SSM框架之MyBatis入门介绍

    一.什么是MyBatis? MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis.它是一个优秀的持久层框架. 二.为什么使用MyBatis? 为了和 ...

  9. Mybatis入门(二)------增删改查

    Mybatis增删改查基本操作 一.XML实现方式 1.mapper.xml的配置 <?xml version="1.0" encoding="UTF-8" ...

随机推荐

  1. kali系统破解WPA密码实战

    上次发布过一篇在OSX系统破解WIFI密码的教程, 这次发布一篇使用kali破解wifi的教程 WEP和WPA/PSK的区别 WPA/PSK的加密方式相对于WEP的加密方式更加安全,WEP是一种老式的 ...

  2. windbg工具安装配置及dump抓取

    安装与配置windbg 安装与配置windbg的symbol(符号) 第一步 下载WinDBG, 第二步 双击下载的文件安装windbg.安装时注意记住安装到那里了. 第三步 windbg访问符号需要 ...

  3. c#中foreach的一种用法

    以下定义的MyClass类中的addnum方法使用了一个数组型参数b: public class MyClass { ; public void addnum(ref int sum, params ...

  4. PDO数据库操作类

    <?php include 'common_config.php'; /** * Class Mysql * PDO数据库操作类 */ class Mysql { protected stati ...

  5. 简单svg动画实现

    一.将svg嵌入到html中 svg是指可伸缩矢量图形,它使用XML格式定义图像.在html中可以使用<svg>标签直接嵌入svg代码,例如: <svg version=" ...

  6. Ajax 向后台提交一个 JavaScript 对象数组?

    var postArray= new Array(); var temp = new Object(); temp.id='1'; temp.name='test'; postArray.push(t ...

  7. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...

  8. Vulkan Tutorial 27 combined image sampler

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 我们在教程的uniform 缓冲区中首次了解了描述符.在本 ...

  9. java 线程 理解 解析

    1 线程的概述 进程:正在运行的程序,负责了这个程序的内存分配,代表了内存中的执行区域. 线程:就是在一个进程中负者一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 假象: 电脑上的程序 ...

  10. Java基础语法<三> 输入输出

    1. 读取输入 Scanner in = new Scanner(System.in);   输入一行(包含空格) String str = in.nextLine()   读取一个单词(以空白符作为 ...