返回顶部
首页 > 资讯 > 后端开发 > Python >Java之MyBatis的Dao方式以及Dao动态代理详解
  • 832
分享到

Java之MyBatis的Dao方式以及Dao动态代理详解

Java MyBatisMyBatis的Dao方式MyBatis Dao动态代理 2022-12-21 15:12:34 832人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis传统Dao方式以及Dao动态代理MyBatis传统Dao方式MyBatis之Dao动态代理总结MyBatis简介以及入门参见以下文章 MyBatis简介及入门 1、

MyBatis简介以及入门参见以下文章

MyBatis简介及入门

1、新建一个数据库,以及一张表user

CREATE TABLE `user` (
  `user_id` int(10) NOT NULL COMMENT '用户名ID',
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `email` varchar(80) DEFAULT NULL COMMENT '用户邮箱',
  `age` int(5) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、创建Maven的普通Java工程,加入maven的mybatis坐标,Mysql驱动坐标

其中,pom.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.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany</groupId>
  <artifactId>mybatis-1</artifactId>
  <version>1.0.0</version>
 
  <properties>
    <!-- 项目构建使用的编码,避免中文乱码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 源码编译 jdk 版本 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <!-- 运行代码的 jdk 版本 -->
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
 
  <dependencies>
    <!-- 单元测试依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
 
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
 
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
 
  </dependencies>
 
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>***.xml</include>
        </includes>
        <!-- filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
 
</project>

3、创建Java实体类User--保存表中的一行数据

package com.mycompany.domain;
 
public class User {
    private int userId;
    private String userName;
    private String email;
    private int age;
 
    public int getUserId() {
        return userId;
    }
 
    public void setUserId(int userId) {
        this.userId = userId;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}

4、创建持久层的dao接口,定义操作数据库的方法

package com.mycompany.dao;
 
import com.mycompany.domain.User;
 
import java.util.List;
 
public interface UserDao {
    
    List<User> selectUserList(User user);
 
    
    int insertUser(User user);
}

5、创建一个mybatis使用的配置文件 SQL映射文件

编写SQL语句,一般一个表对应一个SQL映射文件,这个文件就是xml文件

sql映射文件(sql mapper):编写SQL语句,mybatis负责执行这些SQL语句

<?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">
 
<!--
    sql映射文件(sql mapper):编写SQL语句,mybatis负责执行这些SQL语句
    1、指定约束文件
    <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     mybatis-3-mapper.dtd:约束文件名称
    2、约束文件作用:限制,检查当前文件中出现的标签,属性必须符合mybatis的要求
    3、<mapper>:当前文件根标签(必须的)
       namespace:命名空间(唯一值,自定义字符串;要求使用dao接口的全限定名称)
       全限定类名:就是类名全称,带包路径的用点隔开,如: java.lang.String
          即全限定名 = 包名 + 类型
       非限定类名也叫短名,就是我们平时说的类名,不带包的,如:String
    4、数据库增删改查特定标签
       <select>:查询,select语句
       <update>:更新,update语句
       <insert>:插入,insert语句
       <delete>:删除,delete语句
-->
 
<mapper namespace="com.mycompany.dao.UserDao">
 
    <!--
        <select>标签:查询操作
        id:执行SQL语法的唯一标识,mybatis会根据这个id的值来找到要执行的SQL语句
            可以自定义,一般要求使用接口中的方法名称
        resultType:表示结果类型,SQL语句执行后得到ResultSet结果集,遍历这个结果集得到的Java对象类型
            值写Java对象的全限定名称
    -->
    <select id="selectUserList" resultType="com.mycompany.domain.User">
        select user_Id,user_Name,email,age
        from user
        order by user_Id asc
    </select>
 
    <!--插入操作,字段名和Java实体类中字段保持一致-->
    <insert id="insertUser">
        insert into user values(#{userId},#{userName},#{email},#{age})
    </insert>
 
</mapper>

6、创建mybatis的主配置文件 ,一个项目一个主配置文件

主配置文件提供了数据库的连接信息和SQL映射文件的位置信息

<?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">
 
<!--
    mybatis的主配置文件:主要定义了数据库的配置信息,SQL映射文件的位置
    1、约束文件
        <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
        mybatis-3-config.dtd:约束文件名称
    2、configuration:根标签
-->
<configuration>
 
    <!-- settings:mybatis全局行为 -->
    <settings>
        <!-- 设置mybatis输出日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
 
    <!--
        环境配置:数据库的连接信息
            default:必须和某个environment的id值一样
            告诉mybatis使用哪个数据库的连接信息(访问哪个数据库)
    -->
    <environments default="development">
 
        <!--
            environment:一个数据库的配置,环境
            id:一个唯一值(可自定义,表示环境的名称)
         -->
        <environment id="development">
            <!--
                transactionManaer:mybatis的事务类型
                    type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:表示数据源,连接数据库的
                    type:表述数据源的类型,POOLED表示使用连接池
            -->
            <dataSource type="POOLED">
                <!--
                   driver, user, username, passWord 是固定的,不能自定义。
                -->
                <!-- 数据库驱动类名 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- 连接数据库的URL字符串 -->
                <property name="url" value="jdbc:mysql://localhost:3306/SSM"/>
                <!-- 访问数据库的用户名 -->
                <property name="username" value="root"/>
                <!-- 访问数据库的密码 -->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
 
        <!--表示线上的数据库,是项目真实使用的库-->
        <environment id="online">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
 
    </environments>
 
    <!-- sql mapper(SQL映射文件)的位置 -->
    <mappers>
        <!--
            一个mapper标签指定一个文件的位置
                从类路径开始的路径信息(target/classes)类路径
        -->
        <mapper resource="com/mycompany/dao/UserDao.xml"/>
    </mappers>
</configuration>

将SqlSession提取为工具类MyBatisUtil

public class MyBatisUtil {
    public MyBatisUtil() {
    }
 
    public static SqlSession getSqlSession() throws IOException {
        String config = "mybatis-config.xml";
        InputStream ins = Resources.getResourceAsStream(config);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(ins);
        SqlSession sqlSession = factory.openSession();
        return sqlSession;
    }
}

MyBatis传统Dao方式以及Dao动态代理

创建user表以及maven的Java普通工程,Java实体类,dao持久层接口,SQL映射文件以及主配置文件如上步骤

MyBatis传统Dao方式

7、创建类实现UserDao接口

public class UserDaoImpl implements UserDao {
    
    @Override
    public List<User> selectUserList(User user) {
        List<User> userList = null;
        try {
            //获取SqlSession对象
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            String sqlId = "com.mycompany.dao.UserDao.selectUserList";
            userList = sqlSession.selectList(sqlId);
            //关闭
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return userList;
    }
 
    @Override
    public int insertUser(User user) {
        int nums = 0;
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            String sqlId = "com.mycompany.dao.UserDao.insertUser";
            nums = sqlSession.insert(sqlId,user);
 
            //mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务
            sqlSession.commit();
 
            //关闭
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return nums;
    }
}

8、创建测试类 

public class TestMyBatis {
    @Test
    public void testSelectUsers(){
        
        UserDaoImpl userDao = new UserDaoImpl();
        List<User> userList = userDao.selectUserList(null);
        for (User user:userList){
            System.out.println("查询到的用户="+user);
        }
    }
 
    @Test
    public void testInsertUser(){
        UserDaoImpl userDao = new UserDaoImpl();
 
        User user = new User();
        user.setUserId(6);
        user.setUserName("zhaoyunchang");
        user.setEmail("zhaoyunchang@163.com");
        user.setAge(18);
 
        int nums = userDao.insertUser(user);
        System.out.println("添加对象的数量:"+nums);
    }
}

MyBatis之Dao动态代理

使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)

getMapper能获取dao接口对于的实现类对象

public class TestMyBatis {
    @Test
    public void testSelectUsers(){
        try {
            
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //com.sun.proxy.$Proxy2 : jdk的动态代理
            System.out.println("userDao="+userDao.getClass().getName());
 
            //调用dao的方法, 执行数据库的操作
            List<User> userList = userDao.selectUserList(null);
            for(User user: userList){
                System.out.println("用户="+user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testInsertUser(){
        try {
            
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //com.sun.proxy.$Proxy2 : jdk的动态代理
            System.out.println("userDao="+userDao.getClass().getName());
 
            //调用dao的方法, 执行数据库的操作
            User user = new User();
            user.setUserId(7);
            user.setUserName("zhugeliang");
            user.setEmail("zhugeliang@163.com");
            user.setAge(18);
 
            int nums = userDao.insertUser(user);
            sqlSession.commit();
            System.out.println("添加对象的数量:"+nums);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java之MyBatis的Dao方式以及Dao动态代理详解

本文链接: https://lsjlt.com/news/175460.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java之MyBatis的Dao方式以及Dao动态代理详解
    目录MyBatis传统Dao方式以及Dao动态代理MyBatis传统Dao方式MyBatis之Dao动态代理总结MyBatis简介以及入门参见以下文章 MyBatis简介及入门 1、...
    99+
    2022-12-21
    Java MyBatis MyBatis的Dao方式 MyBatis Dao动态代理
  • Java之dao模式详解及代码示例
    什么是dao模式?DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化...
    99+
    2023-05-30
    java dao设计模式 ava
  • MyBatis详细讲解DAO代理的使用
    目录DAO代理实现数据库操作1、去掉Dao接口实现类2、getMapper获取代理对象3、使用 Dao 代理对象方法执行 sql 语句4、深入理解参数parameterType一个简...
    99+
    2024-04-02
  • Java代理模式与动态代理之间的关系以及概念
    目录什么是代理模式静态代理动态代理什么是代理模式 代理模式是开发中常见的一种设计模式,使用代理模式可以很好的对程序进行横向扩展。代理,顾名思义就是一个真实对象会存在一个代理对象,并且...
    99+
    2023-02-20
    Java代理模式与动态代理 Java代理模式 Java动态代理
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件详解分析
    目录Mybatis的Dao层实现传统开发方式代理开发方式MyBatis映射文件深入动态sql语句动态SQL之<if>动态SQL之<foreach>SQL片段抽...
    99+
    2024-04-02
  • mybatis的动态SQL以及连接池详解
    目录mybatis动态SQL及连接池mybatis中的范围查询,in连接池动态sql与多表的连接查询动态sql多表的连接查询小结mybatis动态SQL及连接池 mybatis根据传...
    99+
    2024-04-02
  • 如何理解Java反射以及动态代理
    这篇文章主要介绍“如何理解Java反射以及动态代理”,在日常操作中,相信很多人在如何理解Java反射以及动态代理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java反射以及动态代理”的疑惑有所帮助!...
    99+
    2023-06-16
  • Java动态代理四种实现方式详解
    代理模式也是一种非常常见的设计模式。了解Spring框架的都知道,Spring AOP 使用的就是动态代理模式。今天就来系统的重温一遍代理模式。在现实生活中代理是随处可见的,当事人因某些隐私不方便出面,或者当事人不具备某些相关的专业技能,而...
    99+
    2022-06-07
    Java动态代理 Java代理模式
  • Java基础之动态代理Cglib详解
    目录一、前言二、服务三、代理工厂四、结果一、前言 经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适...
    99+
    2024-04-02
  • JAVA的动态代理详解
    文章目录 前言一、动态是什么?二、使用步骤1.导入相应的包2.定义接口3.定义接口实现类4.实现InvocationHandler接口5.实现代理 三、整体实例四、输出结果总结 前言...
    99+
    2023-08-31
    java 开发语言
  • Java的动态代理和静态代理详解
    目录0、代理模式1、静态代理2、 加深理解3、动态代理动态代理的例子总结0、代理模式 为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】 代...
    99+
    2024-04-02
  • Mybatis的分页方式详解以及Mybatis-plus分页。
    目录:   一、Mybatis 分页        一、LIMIT关键字        二、RowBounds实现分页        三、PageHelper   二、Mybatis-plus分页 一、Mybatis 实现分页 (1)使用...
    99+
    2023-09-20
    mybatis java mysql
  • 详解java 中的动态代理
    这期内容当中小编将会给大家带来有关详解java 中的动态代理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java动态代理相关先来看静态代理模式代码:package test; public inter...
    99+
    2023-05-31
    java 动态代理 ava
  • MyBatis源码剖析之Mapper代理方式详解
    目录源码剖析-getmapper()源码剖析-invoke()具体代码如下: //前三步都相同 InputStream resourceAsStream = Resources.ge...
    99+
    2024-04-02
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2024-04-02
  • Java动态代理的示例详解
    目录定义分类案例需求方案一:jdk动态代理方案二:cglib动态代理分析总结定义 动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在...
    99+
    2024-04-02
  • Java动态代理的方式有哪些
    这篇文章主要介绍“Java动态代理的方式有哪些”,在日常操作中,相信很多人在Java动态代理的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态代理的方式有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-26
  • 详解Java的Proxy动态代理机制
    目录一、Jvm加载对象二、代理模式2.1、基本描述2.2、静动态模式三、静态代理四、动态代理4.1、场景描述4.2、基础API案例4.3、代理类结构4.4、JDK源码五、源代码地址一...
    99+
    2024-04-02
  • 详解Java中的静态代理模式
    目录静态代理模式代理模式静态代理模式的实现要求举例静态代理模式 代理模式 代理人可以替受代理的人完成一些工作,比如:学校与学生之间的关系来说,学生就好比被被代理类,学生只需要负责上课...
    99+
    2022-12-26
    Java静态代理模式 Java静态代理
  • Mybatis详解动态SQL以及单表多表查询的应用
    目录单表查询操作参数占位符#{}和${}SQL 注入like模糊查询多表查询操作一对一多表查询一对多多表查询动态SQL使用if标签trim标签where标签set标签for...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作