zoukankan      html  css  js  c++  java
  • mybatis入门介绍二

    相信看过我的上一篇博客的同学都已经对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接口:

     1 public interface UserDao {
     2     
     3     //根据id查询用户信息
     4     public User findUserById(int id) throws Exception;
     5     //根据用户名称模糊查询用户列表
     6     public List<User> findUserByUsername(String username) throws Exception;
     7     //插入用户
     8     public void insertUser(User user) throws Exception;
     9 
    10 }

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

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

    3.UserMapper.java

     1 public interface UserMapper {
     2     
     3     //根据用户id查询用户信息
     4     public User findUserById(int id) throws Exception;
     5     
     6     //根据用户名称  查询用户信息
     7     public List<User> findUserByName(String username) throws Exception;
     8     
     9     //自定义查询条件查询用户信息
    10     public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;
    11     
    12     //查询用户,使用resultMap进行映射
    13     public List<User> findUserListResultMap(UserQueryVo userQueryVo)throws Exception;
    14     //查询用户,返回记录个数
    15     public int findUserCount(UserQueryVo userQueryVo) throws Exception;
    16     
    17     //插入用户
    18     public void insertUser(User user)throws Exception;
    19     //删除用户
    20     public void deleteUser(int id) throws Exception;
    21     //修改用户
    22     public void updateUser(User user) throws Exception;
    23 }

     通过这三个文件我们就完成了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中方法返回值类型一致.

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

     1 public class UserMapperTest {
     2 
     3     // 会话工厂
     4     private SqlSessionFactory sqlSessionFactory;
     5 
     6     // 创建工厂
     7     @Before
     8     public void init() throws IOException {
     9 
    10         // 配置文件(SqlMapConfig.xml)
    11         String resource = "SqlMapConfig.xml";
    12 
    13         // 加载配置文件到输入 流
    14         InputStream inputStream = Resources.getResourceAsStream(resource);
    15 
    16         // 创建会话工厂
    17         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    18 
    19     }
    20 
    21     @Test
    22     public void testFindUserById() throws Exception {
    23 
    24         SqlSession sqlSession = sqlSessionFactory.openSession();
    25         // 创建代理对象
    26         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    27 
    28         User user = userMapper.findUserById(1);
    29 
    30         System.out.println(user);
    31 
    32     }

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

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

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

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

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

    如下:

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

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

     

  • 相关阅读:
    Mongoose使用
    Koa原理和封装
    微信用户授权
    Koa微信公众号开发
    Koa2+mongoose
    NodeJS-API
    jquery下json数组的操作用法实例
    SqlCacheDependency:asp.net SQL缓存依赖
    SqlCacheDependency轮询数据库表的更改情况的频率
    设置浏览器地址栏URL前面显示的图标
  • 原文地址:https://www.cnblogs.com/ilovessf/p/7268201.html
Copyright © 2011-2022 走看看