A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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 [url]http://maven.apache.org/xsd/maven-4.0.0[/url]
       [url]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]">
   <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" ?>[/align]<!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查询数据库。



点评

老铁双击666!!!!  发表于 2018-12-6 14:32

评分

参与人数 10黑马币 +38 收起 理由
A180705152 + 1 很给力!
阿木阿木啊 + 5 很给力!
丿小佳 + 5 nxzc
郭天扬 + 5
xujiawu + 5
海森堡 + 5
大叔级别 + 5 很给力!
龙血树 + 1
胡莉娅 + 1 很给力!
夜刀十留香 + 5 很给力!

查看全部评分

28 个回复

倒序浏览
回复 使用道具 举报
双击666,mark一下!!!!
回复 使用道具 举报 1 0
沙发,国哥还是牛
回复 使用道具 举报
老铁 双击 6666
回复 使用道具 举报
收藏一下
回复 使用道具 举报
沙发
回复 使用道具 举报
讲得好
回复 使用道具 举报
对于mybatis中的mapper代理总结的挺不错,挺详细的,不错 赞
回复 使用道具 举报
回复 使用道具 举报
nice,666
回复 使用道具 举报
国哥有点东西的
回复 使用道具 举报
收藏了!!!
回复 使用道具 举报
看西游记后传还是卡啊
回复 使用道具 举报
这谁家的老师写的也忒棒了吧,赞一个
回复 使用道具 举报
讲的好!!!!!
回复 使用道具 举报
我聂旭实名认证国哥天下第一
回复 使用道具 举报
赞, 说的真好, 受教了
回复 使用道具 举报
不吹不黑,老张第一
回复 使用道具 举报
一个人一座城0.0 来自手机 中级黑马 2018-12-6 17:44:04
20#
加油加油
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马