热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatis保姆级理解与使用专业学习eclipse版

1. MyBatis简介1.1MyBatis的特点    1.2MyBatis简介 MyBatis是一个半自动化的持久化层的ORM框架。所谓的持久化层就是dao。ORM:(Obje

1. MyBatis简介

1.1 MyBatis的特点

 

 

 

 


1.2 MyBatis简介

 

MyBatis是一个半自动化的持久化层的ORM框架。

所谓的持久化层就是dao

ORM:(Object Relation Mapping) 对象关系映射

Java中的对象Bean 与数据库中的表建立映射关系。表中建立关系是通过外键->主键

优势:只需要配置好配置文件,那么久可以通过操作Java中的对象就能影响数据库表中的数据。

 

半自动化:

全自动化Hibernate:无需手写SQL,自动生成sql语句,自动生成的SQL,性能太低。无法优化SQL语句。当然Hibernate也支持原生手写SQL,但是还是写的太麻烦了。

MyBatis是半自动化,需要手写SQL,但是SQL可以做自动的拼接。

 

ibatis

 


1.3 MyBatis中文网

https://mybatis.net.cn/

 


什么是 MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

 

 

 

 

 

 


2. 搭建Mybaits框架

导入jar

编写配置文件

使用核心类库

 


2.1 通过maven下载mybaits

 

 

 

 

 








    org.mybatis

    mybatis

    3.5.6


 


2.2 建立maven工程&编写pom文件


2.2.1 新建mavenweb项目

 

 

 

 

 


2.2.2 mybaits需要的pom文件内容








"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">

4.0.0

com.hy

springmvc006

0.0.1

war

 

UTF-8

UTF-8

UTF-8

 

ch.qos.logback

logback-classic

1.2.3

 

org.projectlombok

lombok

1.18.20

 

 

com.alibaba

druid

1.2.9

 

mybaits的核心jar-->

    org.mybatis

    mybatis

    3.5.6

mybaits的核心jar-->

junit

junit

4.12

test

 

mysql

mysql-connector-java

5.1.49

 

 

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

UTF-8


 

 

 

 

 

mybaits的核心就这一个jar包,所以是轻量级的。


2.3 准备工作


2.3.1 建立数据库mybaitsdb01,建表,插入数据

 

 

 

 

 

 








create table sys_emp(

emp_id bigint auto_increment,

emp_name varchar(20),

emp_pwd varchar(20),

emp_gender enum('m','f'),

emp_salary double(10,5),

primary key(emp_id)

);

 

INSERT INTO `sys_emp` VALUES (null, '范冰冰', 'fbb', 'f', 100.5);

INSERT INTO `sys_emp` VALUES (null, '李冰冰', 'lbb', 'f', 300);

INSERT INTO `sys_emp` VALUES (null, '张彬彬', 'zbb', 'm', 599);

INSERT INTO `sys_emp` VALUES (null, '万茜', 'wq', 'm', 4000);

INSERT INTO `sys_emp` VALUES (null, '李若彤', 'lrt', 'm', 5000.8);

 

select * from `sys_emp`;


 


2.3.2 编写实体bean








package com.hy.bean;

 

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

 

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Emp {

private Long empId;

private String empName;

private String empPwd;

private String empGender;

private Double empSalary;

 

//构造方法(ID)

public Emp(String empName, String empPwd, String empGender, Double empSalary) {

super();

this.empName = empName;

this.empPwd = empPwd;

this.empGender = empGender;

this.empSalary = empSalary;

}

}


 


2.3.2 编写mapper接口(dao接口)

EmpMapper

 








package com.hy.mapper;

 

import java.util.List;

import java.util.Map;

 

import org.apache.ibatis.annotations.Param;

 

import com.hy.bean.Emp;

 

/**

 * 声明这个接口是为了方便上层代码调用Mybatis的具体功能

 * Mapper配置文件的namespace属性要和接口的全类名一致,这样才能通过接口找到Mapper配置

 * 接口中的方法名要和Mapper配置文件中SQL语句标签的id属性一致,这样才能通过方法名找到具体SQL语句

 * 又因为在Mapper配置文件中id属性的值是不能重复的,所以当前接口中方名也不能重复——当前接口中的方法不能重载

 */

public interface EmpMapper {

    /**

     * 通过这个方法对应Mapper配置文件中的SQL语句

     * @param empId 当前方法的参数对应SQL语句中#{empId}声明的参数

     * @return 当前方法的返回值类型和resultType属性指定的类型一致

     */

    abstract public Emp selectEmpById(Long empId);

 

    /**

     * 执行插入操作

     * @param emp

     * @return 受影响的行数

     */

    abstract public int insertEmp(Emp emp);

 

    /**

     * 执行删除操作

     * @param empId

     * @return 受影响的行数

     */

    abstract public int deleteById(long empId);

 

    /**

     * 执行更新操作

     * @param harry

     * Mybatis返回的受影响行数也可以不使用

     */

    abstract public void updateEmp(Emp harry);

 

    /**

     * 模糊查询,根据员工姓名片段查询对应数据

     * @param 查询条件

     * @return 查询结果

     */

    abstract public Emp selectEmpByName(String empName);

 

    // 使用@Param注解给方法形参命名,具体用法参照Mapper配置文件

    abstract public void updateSalaryById(@Param("empId") Long empId, @Param("empSalary") Double salary);

 

    abstract public void updateByMap(Map paramMap);

 

    abstract public Integer selectCount();

 

    abstract public Map selectForMap(int empId);

 

    abstract public List selectAll();

 

    // 执行插入数据操作,自增主键会放入实体类对象的id属性

    // 方法返回值还是受影响行数

    abstract public int insertWithKey(Emp emp);

 

    abstract public List selectWithResultMap();

}

 


 

这里我们换成了EmpMapper,新名字我们就适应新的写法,去掉前面的I,当然也可以不去掉叫IEmpMapper

 

 

 

 

 


2.4 编写配置文件

Mybaits比较特殊有两个配置文件,一是,核心(全局)配置文件,二是,映射文件(编写sql语句的映射文件)

 


2.4.1 如何编写核心(全局)配置文件[mybatis-config.xml]

位置:resources目录下,只有一个

名称:核心配置名字推荐使用:mybaits-config.xml。

这里,我们习惯上命名为mybaits-config.xml,这个文件名只是建议,并非强制要求的。将来和Spring整合之后,这个配置文件可以省略。目前大家操作时,可以直接复制,粘贴。

 

将来mybaitsSpring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。

 


2.4.2 编写核心配置文件

核心配置模板,直接从官网拷贝。

 

 

 

 

 

 








"1.0" encoding="UTF-8" ?>

 

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

"development">

"development">

"JDBC" />

"POOLED">

"driver" value="${driver}" />

"url" value="${url}" />

"username" value="${username}" />

"password" value="${password}" />

"org/mybatis/example/BlogMapper.xml" />


 

将黄色的地方改写

 








"1.0" encoding="UTF-8" ?>

 

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

"development">

"development">

"JDBC" />

"POOLED">

"driver" value="com.mysql.jdbc.Driver" />

"url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb01?characterEncoding=UTF8" />

"username" value="root" />

"password" value="root" />

"org/mybatis/example/BlogMapper.xml" />

 

 


在实际的工作中,一般都有是哪个环境,开发,测试,部署,设置连接的数据库都可以不一样简单的说就是,可以连接不同的数据库,比如:连接Oracle的环境。

 

"development"> 可以设置不同的环境

 


2.4.2.1 重点总结:

事务管理器和数据源以后都是在spring中进行配置的,spring在它的声明式事务里面, Spring给我们提供了事务管理器,Spring帮我们做事务的管理,包括开启事务,提交事务或是回滚事务,包括释放数据库的连接,管理数据源,这些都是Spring帮我们去管理。所以这一部分配置以后都要移植到Spring的配置文件中的。

 

现在暂时在这里面配置好,帮助我们去学习,操作就行了。

 

 


2.4.3 如何编写SQL语句的映射文件

 

映射文件位置:resources/mapper => 相当于dao

映射文件名称:XxxMapper <=>接口名Mapper,比如EmpMapper ,DeptMapper

 

将来mybaitsSpring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置

 

但是XxxMapper映射文件必须保留。

 

 


2.4.3.1 ORM相关概念

 

 

 

 


2.4.4 设置相关映射文件


2.4.4.1 resources目录下设置mappers目录

 

 

 


2.4.4.2 拷贝xml文件里的内容

从官网拷贝:https://mybatis.net.cn/getting-started.html

 








  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  


 

 

 

 

 

注意:以前我们叫dao,现在叫mapper,本质上都是持久化层的类,只是命名习惯的区别而已。

注意:EmpMapper.xml所在的目录要和mybatis-config.xml中使用的mapper标签配置的一致。

 


2.4.4.3 编写SQL语句








"1.0" encoding="UTF-8" ?>

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

"com.hy.mapper.EmpMapper">

 

 

"selectEmpById" resultType="com.hy.bean.Emp">

select emp_id empId,emp_name empName,emp_pwd empPwd,emp_gender empGender , emp_salary empSalary

 from sys_emp where emp_id = #{empId}

 


 

 

 

 

 

这里是符合SQL语句的命名标准,但是不符合JavaBean的命名习惯,所以要加别名。

 


2.4.4.4 注册XxxMapper.xml映射文件

所谓的注册Mapper:就是指定Mybaits映射文件的具体位置。

mybatis-config.xml全局配置文件中,通过mapper标签,配置一个具体的XxxMapper.xml映射文件。

resource属性:指定Mapper映射文件的实际存储位置,对于maven工程的目录结构来说,Maven工程的目录结构来说,resources目录下的内容会直接放入类路径

所以,这里我们以resources目录为基准 ,不加/的相对路径,就是相对resources目录 。

 

 

 


2.5 Junit中编写测试类


2.5.1 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

 

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

 

 


2.5.2 具体操作








package com.hy.mybatis.test;

 

import java.io.IOException;

import java.io.InputStream;

 

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 org.junit.Test;

 

import com.hy.bean.Emp;

import com.hy.mapper.EmpMapper;

 

public class TestEmpMapper {

@Test

public void testSelectEmpById() throws IOException {

//1. 使用MybaitsResources类来读取Mybatis全局配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

 

//2. 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

 

//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式)

SqlSessionFactory sessionFactory = builder.build(inputStream);

 

//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话

SqlSession sqlSession = sessionFactory.openSession();

 

//5. 通过sqlSession对象找到Mapper映射文件中可以执行的SQL语句,并执行 namespace

Object obj = sqlSession.selectOne("com.hy.mapper.EmpMapper.selectEmpById",1);

 

//6. 打印结果

System.out.println(obj);

 

//7. 提交事务

sqlSession.commit();

 

//8. 关闭sqlSession

sqlSession.close();

}

 

@Test

public void testSelectEmpById2() throws IOException {

//1. 使用MybaitsResources类来读取Mybatis全局配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

 

//2. 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

 

//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式)

SqlSessionFactory sessionFactory = builder.build(inputStream);

 

//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话

SqlSession sqlSession = sessionFactory.openSession();

 

//5. 通过sqlSession对象通过反射机制,直接生成一个EmpMapper接口的匿名类的对象

EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

 

 

//6. 执行语句,打印结果

Emp emp = empMapper.selectEmpById(2L);

System.out.println(emp);

 

//7. 提交事务

sqlSession.commit();

 

//8. 关闭sqlSession

sqlSession.close();

}

}

 


 

1,23,4,7,8都是暂时写的,等和Spring整合后,代码就非常简单了。我们这里已经可以看出,不用写EmpMapper的实现类了。只写接口即可。

 



推荐阅读
  • Spring框架的核心组件与架构解析 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 基于试题数据的智能化管理平台采用Java语言进行面向对象编程,旨在构建一个高效的试题信息管理系统。该系统在JDK 6.0和MyEclipse 10.6环境下开发,通过优化试题数据管理和处理流程,提升系统的稳定性和用户体验。平台支持多用户操作,具备强大的数据处理能力和灵活的扩展性,适用于各类教育机构和考试组织。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 在实际开发中,连接池是最常使用的数据库管理技术之一。连接池通过创建和管理一组预初始化的数据库连接,使得这些连接可以被多个线程复用,从而显著提高应用程序的性能和资源利用率。本文将详细介绍如何从零开始构建一个自定义的 MySQL 连接池,并将其与 Spring Data 进行集成,以实现高效、可靠的数据库操作。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
author-avatar
banli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有