第三章 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>
相关推荐
better_liang17 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题
niucloud-admin17 小时前
java服务端——controller控制器
java·开发语言
To Be Clean Coder17 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
Fortunate Chen17 小时前
类与对象(下)
java·javascript·jvm
程序员水自流17 小时前
【AI大模型第9集】Function Calling,让AI大模型连接外部世界
java·人工智能·llm
‿hhh17 小时前
综合交通运行协调与应急指挥平台项目说明
java·ajax·npm·json·需求分析·个人开发·规格说明书
小徐Chao努力17 小时前
【Langchain4j-Java AI开发】06-工具与函数调用
java·人工智能·python
无心水17 小时前
【神经风格迁移:全链路压测】33、全链路监控与性能优化最佳实践:Java+Python+AI系统稳定性保障的终极武器
java·python·性能优化
萧曵 丶18 小时前
Synchronized 详解及 JDK 版本优化
java·多线程·synchronized
夏幻灵18 小时前
JAVA基础:基本数据类型和引用数据类型
java·开发语言