黑马程序员技术交流社区

标题: Mybatis入门案例(二)之Mapper代理开发模式 [打印本页]

作者: z_sir    时间: 2018-12-6 13:09
标题: Mybatis入门案例(二)之Mapper代理开发模式
本帖最后由 z_sir 于 2018-12-6 13:15 编辑

Mybatis入门案例(二)之Mapper代理开发模式1.前言
  上以章节我们讲了传统DAO开发模式,即dao接口、daoImpl接口实现类,这种开发模式需要我们对接口实现,使用SqlSession提供的增删改查等方法对数据库操作,而Mybatis官方也提供了另外一种开发模式,即Mapper代理开发模式,此种模式与传统DAO开发模式相比,省去了接口实现层,而且开发效率提高了,接下来我们具体来看下Mapper代理开发模式的实现方式。

2.Mapper代理实现方式2.1 环境准备
JDK环境:jdk1.8
                开发工具:IntelliJ IDEA
                数据库环境:mysql5.1
                Mybatis:3.4.5

2.2 mysql建表
[SQL] 纯文本查看 复制代码

CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(20) ,
    `password` varchar(20) ,
  `age` int(11) ,
    PRIMARY KEY (`id`)
)


2.3 Maven坐标
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0
       http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.itcast</groupId>
   <artifactId>Itcast_Mybatis</artifactId>
   <version>1.0-SNAPSHOT</version>

   <dependencies>
       <!--mybatis核心坐标-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.4.5</version>
       </dependency>
       <!--mysql连接包-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.1.6</version>
       </dependency>
       <!--日志包-->
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.17</version>
       </dependency>
       <!--junit-->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
       </dependency>
   </dependencies>
</project>


2.4 目录结构图

注意:红色标框的两个地方必须结构相同

2.5 核心配置文件sqlConfig.xml注意:红色标框的两个地方必须结构相同

[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>
   <!--配置环境-->
   <environments default="mysql">
       <environment id="mysql">
           <!--配置事务-->
           <transactionManager type="JDBC"/>
           <!--配置数据库连接池-->
           <dataSource type="POOLED">
               <property name="driver" value="org.gjt.mm.mysql.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis08"/>
               <property name="username" value="root"/>
               <property name="password" value="123456"/>
           </dataSource>
       </environment>
   </environments>
   <!--指定映射文件的位置-->
   <mappers>
       <mapper resource="com/itheima/dao/UserMapper.xml"></mapper>
   </mappers>
</configuration>

2.6 创建实体类User.java
[Java] 纯文本查看 复制代码
package com.itheima.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
   private Integer id;
   private String username;
   private String password;
   private Integer age;
   public Integer getId() {
       return id;
  }
   public void setId(Integer id) {
       this.id = id;
  }
   public String getUsername() {
       return username;
  }
   public void setUsername(String username) {
       this.username = username;
  }
   public String getPassword() {
       return password;
  }
   public void setPassword(String password) {
       this.password = password;
  }
   public Integer getAge() {
       return age;
  }
   public void setAge(Integer age) {
       this.age = age;
  }
}


2.7 创建UserMapper.java接口
[Java] 纯文本查看 复制代码
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface UserMapper {
   //查询全部用户
   public List<User> findAllUsers();
   //根据ID查询
   public User findUserById(Integer id);
   //根据ID删除信息
   public void deleteUserById(Integer id);
   //根据ID修改User
   public void updateUserById(User user);
   //保存User
   public void saveUser(User user);
   
}

注意:此时无需再创建接口实现层

2.8 创建UserMapper.xml映射配置文件
[HTML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
   namespace:命名空间,SQL区域块
       如果使用传统DAO开发模式的话,则没有特殊要求(只要保证唯一即可)
       如果是Mapper代理模式的话,则必须是接口的全限定名
此次式Mapper代理开发模式,所有namespace必须是接口的全限定类名
-->
<mapper namespace="com.itcast.dao.UserMapper">
   <!--查询全部用户-->
   <!--
       id:唯一的标识
       resultType:结果类型(输出类型)
       parameterType:输入类型
       #{}占位符
   -->
   <select id="findAllUsers" resultType="com.itheima.domain.User">
      SELECT * FROM user
   </select>
   <!--根据ID查询-->
   <select id="findUserById" parameterType="int" resultType="com.itheima.domain.User">
      SELECT * FROM user WHERE id=#{uid}
   </select>
   <!--根据ID删除信息-->
   <delete id="deleteUserById" parameterType="java.lang.Integer">
      DELETE FROM user where id=#{uid}
   </delete>
   <!--根据ID修改User-->
   <update id="updateUserById" parameterType="com.itheima.domain.User">
      UPDATE user SET username=#{username},password=#{password},age=#{age} WHERE id=#{id}
   </update>
   <!--保存User-->
   <insert id="saveUser" parameterType="com.itheima.domain.User">
      INSERT INTO user VALUES (id,#{username},#{paasword},#{age});
   </insert>
</mapper>


3.Mapper代理开发模式需遵循的规范:
注意:因为是Mapper代理开发模式,所有习惯性接口名使用mapper结尾,例如:UserMapper.java

1.接口名与映射配置文件名一致
2.在IDEA开发工具中:接口的全限定类名与映射配置文件目录结构保持一致,如:结构图中所标示
3.映射配置文件中的namespace必须是对应接口的全限定类名
4.接口的方法名与映射文件中的statement对象ID一致
5.接口方法的返回值类型与映射文件中resultType类型一致
6.接口方法参数类型与映射文件中parameterType类型一致

注意:statement对象即映射配置文件中的每一个执行操作,比如:
<select id="findAllUsers" resultType="com.itheima.enity.User">
    SELECT * FROM user
</select>等。

4.编写测试类Demo02.java
[Java] 纯文本查看 复制代码
package com.demo;
import com.itheima.dao.UserMapper;
import com.itheima.enity.User;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class Demo01 {
   private  UserMapper userMapper;
   private InputStream is;
   private SqlSession session;
   @Before
   public void init(){
      //1.核心配置文件
       String resource="sqlConfig.xml";
       //2.读取核心配置文件
       is= Resources.getResourceAsStream(resource);
       /*3.创建SqlSessionFactory对象:SqlSessionFactory是接口,
        * 所以使用SqlSessionFactoryBuilder对象build()构建SqlSessionFactory对象
        */
       SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
       SqlSessionFactory factory=builder.build(is);
       //4.通过SqlSessionFactory对象获取SqlSession对象
       session=factory.openSession();
       //5.获取Mapper代理对象
       userMapper=session.getMapper(UserMapper.class);
  }
   @After
   public void destroy(){
       //提交事务
       session.commit();
       //关闭is
       is.close();
       //关闭session
       session.close();
  }
   
   //1.测试遍历用户
   @Test
   public void testFindAll() throws IOException {
       List<User> list=userMapper.findAllUsers();
       for (User u:list) {
           System.out.println(u);
      }
  }
   //2.测试根据ID查询
   public void testFindUserById() throws IOException {
       User user=userMapper.findUserById(1);
       System.out.println(user);
  }
   //3.测试根据ID删除信息
   public void testDeleteUserById() throws IOException {
       userMapper.deleteUserById(2);
  }
   //4.测试根据ID修改User
   public void testUpdateUserById() throws IOException {
       User user=new User();
       user.setId(1);
       user.setUsername("itcast");
       user.setPassword("123456");
       user.setAge(18);
       userMapper.updateUserById(user);
  }
   //5.测试保存用户
   public void testSaveUser() throws IOException {
       User user=new User();
       user.setId(3);
       user.setUsername("itcast6");
       user.setPassword("123456");
       user.setAge(18);
       userMapper.saveUser(user);
  }
}


至此,一套完整的Mapper代理开发模式已经初步完成,我们从中可以很明显的看出比传统的DAO模式简单。
两种开发模式各自有自己的有点:
传统DAO,结构清晰明了,有dao,有具体的dao实现类
Mapper,采取代理的方式,省去了dao实现类的编写,提高了开发效率,Mapper代理开发模式也是官方推荐使用的,而且我们后期开发也是采取Mapper代理模式
5.小结
代理对象内部调用selectOne或selectList
 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。




作者: 龙血树    时间: 2018-12-6 14:31

作者: 大叔级别    时间: 2018-12-6 14:31
双击666,mark一下!!!!
作者: 咕咕叫    时间: 2018-12-6 14:31
沙发,国哥还是牛
作者: 北方的南先生    时间: 2018-12-6 14:32
老铁 双击 6666
作者: 嘿嘿嘿滴    时间: 2018-12-6 14:32
收藏一下
作者: 龙血树    时间: 2018-12-6 14:32
沙发
作者: zhangwenfei    时间: 2018-12-6 14:32
讲得好
作者: DreamYao    时间: 2018-12-6 14:32
对于mybatis中的mapper代理总结的挺不错,挺详细的,不错 赞
作者: 超神传说    时间: 2018-12-6 14:32

作者: zhangzhuang    时间: 2018-12-6 14:32
nice,666
作者: shuxiaosheng    时间: 2018-12-6 14:33
国哥有点东西的
作者: 海森堡    时间: 2018-12-6 14:33
收藏了!!!
作者: 五彩斑斓的黑    时间: 2018-12-6 14:33
看西游记后传还是卡啊
作者: 魏家好    时间: 2018-12-6 14:33
这谁家的老师写的也忒棒了吧,赞一个
作者: xujiawu    时间: 2018-12-6 14:34
讲的好!!!!!
作者: 聂旭辉    时间: 2018-12-6 14:34
我聂旭实名认证国哥天下第一
作者: 阿木阿木啊    时间: 2018-12-6 14:34
赞, 说的真好, 受教了
作者: A180705152    时间: 2018-12-6 14:38
不吹不黑,老张第一
作者: 一个人一座城0.0    时间: 2018-12-6 17:44
加油加油
作者: 我开心你随意    时间: 2018-12-6 17:45

作者: 项老师    时间: 2018-12-6 17:54
好文,mark了
作者: TomGe    时间: 2018-12-6 17:57
干货,赶紧收藏
作者: 项老师    时间: 2018-12-6 18:14
加油加油
作者: xiezilong    时间: 2018-12-6 18:24
干货,都是干货呀
作者: 天亮1    时间: 2018-12-6 21:04
大牛
作者: 一个人一座城0.0    时间: 2018-12-7 08:09
到此一观
作者: 一个人一座城0.0    时间: 2018-12-8 12:05
厉害厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2