第三章 Mybatis的Dao实现方式

目录

一、传统的Dao层调用实现方式

[1.1. 工程结构](#1.1. 工程结构)

[1.2. sqlMapConfig.xml](#1.2. sqlMapConfig.xml)

[1.3. properties](#1.3. properties)

[1.4. UserMapper.xml](#1.4. UserMapper.xml)

[1.5. UserMapper](#1.5. UserMapper)

[1.6. UserMapperImpl](#1.6. UserMapperImpl)

[1.7. UserService](#1.7. UserService)

[1.8. User实体类](#1.8. User实体类)

二、代理方式(主流)

[2.1. 概述](#2.1. 概述)

[​2.2. 基于传统方式上调整的代码](#2.2. 基于传统方式上调整的代码)

[2.2.1. Dao接口](#2.2.1. Dao接口)

[2.2.2. UserService](#2.2.2. UserService)

[2.2.3. UserMapper.xml](#2.2.3. UserMapper.xml)


一、传统的Dao层调用实现方式

  1. 编写Dao接口

  2. 编写接口实现

  3. 编写业务Service调用

1.1. 工程结构

1.2. sqlMapConfig.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 加载外部properties -->
    <properties resource="jdbc.properties"></properties>

    <typeAliases>
        <typeAlias type="com.example.domain.User" alias="user"></typeAlias>
    </typeAliases>

    <!-- 数据源环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

1.3. properties

XML 复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=Wangzhexiao

1.4. UserMapper.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userMapper">

    <!-- 查询操作 -->
    <select id="findAll" resultType="user">
        select * from User
    </select>
</mapper>

1.5. UserMapper

java 复制代码
package com.example.mapper;

import com.example.domain.User;
import java.io.IOException;
import java.util.List;

public interface UserMapper {
    List<User> findAll() throws IOException;
}

1.6. UserMapperImpl

java 复制代码
package com.example.mapper.impl;

import com.example.domain.User;
import com.example.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserMapperImpl implements UserMapper {
    @Override
    public List<User> findAll() throws IOException {
        // 获得核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获得Session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获得Session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行操作 参数:namespace+id
        return sqlSession.selectList("userMapper.findAll");
    }
}

1.7. UserService

java 复制代码
package com.example.service;

import com.example.domain.User;
import com.example.mapper.UserMapper;
import com.example.mapper.impl.UserMapperImpl;
import java.io.IOException;
import java.util.List;

public class UserService {
    public static void main(String[] args) throws IOException {
        // 创建dao对象
        UserMapper userMapper = new UserMapperImpl();
        List<User> list = userMapper.findAll();
        System.out.println(list);
    }
}

1.8. User实体类

java 复制代码
package com.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private int id;
    private String username;
    private String password;
}

二、代理方式(主流)

2.1. 概述

采用 Mybatis 的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流。
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao 接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper 接口开发需要遵循以下规范:

  1. Mapper.xml文件中的namespace与mapper接口的全限定名相同
  2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType类型相同
  4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

2.2. 基于传统方式上调整的代码

2.2.1. Dao接口

java 复制代码
package com.example.mapper;

import com.example.domain.User;
import java.io.IOException;
import java.util.List;

public interface UserMapper {
    List<User> findAll() throws IOException;

    User findById(Integer id) throws IOException;
}

2.2.2. UserService

java 复制代码
package com.example.service;

import com.example.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class UserService {
    public static void main(String[] args) throws IOException {
        // 获得核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获得Session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获得Session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取Dao代理对象,Mybatis内部已经帮我们完成了实现(与我们传统方式代码中的实现类相似)
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        System.out.println(mapper.findAll());
        System.out.println(mapper.findById(1));
    }
}

2.2.3. UserMapper.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

    <!-- 查询操作 -->
    <select id="findAll" resultType="user">
        select * from User
    </select>

    <!-- 查询操作 -->
    <select id="findById" parameterType="java.lang.Integer" resultType="user">
        select * from User where id = #{id}
    </select>
</mapper>
相关推荐
ELI_He9993 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361111 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10619 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
ProtonBase22 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61723 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v29 分钟前
leetCode43.字符串相乘
java·数据结构·算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3053 小时前
11.vector的介绍及模拟实现
开发语言·c++