学习笔记如此详细的mybatis,你不来看看吗?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 学习笔记如此详细的mybatis,你不来看看吗?

1.mybatis的概述

mybatis是一个持久层框架,用java编写的。


它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程 它使用了ORM思想实现了结果集的封装。


ORM:Object Relational Mappging 对象关系映射


简单的说:就是把数据库表和实体类及实体类的属性对应起来 ,让我们可以操作实体类就实现操作数据库表。


2.mybatis入门

2.1mybatis的环境搭建

第一步:创建maven工程并导入坐标 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.itheima</groupId>

   <artifactId>day01_eesy_01mybatis</artifactId>

   <version>1.0-SNAPSHOT</version>

   <packaging>jar</packaging>      <!--此处设置打包方式-->

   <dependencies>

       <dependency>   <!--导入mybatis坐标,这是一个dependency依赖-->

           <groupId>org.mybatis</groupId>

           <artifactId>mybatis</artifactId>

           <version>3.4.5</version>

       </dependency>

       <dependency>    <!--数据库-->

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>8.0.16</version>

       </dependency>

       <dependency>        <!--日志-->

           <groupId>log4j</groupId>

           <artifactId>log4j</artifactId>

           <version>1.2.12</version>

       </dependency>

       <dependency>    <!--进行单元测试-->

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>4.10</version>

       </dependency>

   </dependencies>

</project>



第二步:创建实体类和dao的接口 User.java 与 IUserDao.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 Date birthday;

   private String sex;

   private String address;

   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 Date getBirthday() {

       return birthday;

   }

   public void setBirthday(Date birthday) {

       this.birthday = birthday;

   }

   public String getSex() {

       return sex;

   }

   public void setSex(String sex) {

       this.sex = sex;

   }

   public String getAddress() {

       return address;

   }

   public void setAddress(String address) {

       this.address = address;

   }

   @Override

   public String toString() {

       return "User{" +

               "id=" + id +

               ", username='" + username + '\'' +

               ", birthday=" + birthday +

               ", sex='" + sex + '\'' +

               ", address='" + address + '\'' +

               '}';

   }

}


package com.itheima.dao;

import com.itheima.domain.User;

import java.util.List;

/*

   用户的持久层接口,“操作数据库,基于Dao"

*/

public interface IUserDao {

   //查询所有操作

   List<User> findAll();

}


第三步:创建Mybatis的主配置文件SqlMapConifg.xml


<?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的主配置文件-->

<configuration>

   <!--配置环境-->

   <environments default="mysql"><!--起什么名字没有规定,下面是对这个名字的定义-->

       <!--配置mysql的环境-->

       <environment id="mysql">  <!--与上面的名字起得一样-->

           <transactionManager type="JDBC"></transactionManager>

           <!--配置数据源,也叫连接池  连接池的取值有三个-->

           <dataSource type="POOLED"><!--POOLED使用连接池-->

               <!--配置连接数据库的4个基本信息-->

               <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

               <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>

               <property name="username" value="root"/>

               <property name="password" value="123456"/>

           </dataSource>

       </environment>

   </environments>

   <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->

   <mappers>

       <!--针对IUserDao文件,在resources中写的对应的xml配置文件-->

       <mapper resource="com/itheima/dao/IUserDao.xml"></mapper>

   </mappers>

</configuration>


第四步:创建映射配置文件 IUserDao.xml


<?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属性的取值必须是dao接口的全限定类名-->

<mapper namespace="com.itheima.dao.IUserDao">

   <!--配置查询所有-->

   <!--id是dao接口的方法名称   resultType是返回类型,封装到哪里去-->

   <select id="findAll" resultType="com.itheima.domain.User">

       select * from user  <!--此处分号可写可不写-->

   </select>

</mapper>


附录补充:


1.进行导入sql文件(mybatisdb.sql)

自行在相关文件中修改读取数据库时需要的数据


2.将日志文件log4j.properties放在项目中


2.2环境搭建的注意事项:

1.创建IUserDao.xml 和 IUserDao.java时名称一样。


在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper


所以:IUserDao 和 IUserMapper是一样的


2.在idea中创建目录的时候,它和包是不一样的


包在创建时:com.itheima.dao它是三级结构


目录在创建时:com.itheima.dao是一级目录


3.mybatis的映射配置文件位置必须和dao接口的包结构相同



4.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名


不要忘记在映射配置中告知mybatis要封装到哪个实体类中

告知的方式:指定实体类的全限定类名


5.映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名



3.mybatis入门案例(是在前面操作的基础上的三种案例)

3.1在前面操作的基础上,创建一个MybatisTest.java


package com.itheima.test;

import com.itheima.dao.IUserDao;

import com.itheima.domain.User;

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.InputStream;

import java.util.List;

/*

mybatis的入门案例

*/

public class MybatisTest {

   /*

       入门案例

    */

   public static void main(String[] args) throws Exception{

       //1.读取配置文件(这个案例在连接数据库)

       InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

       //2.创建SqlSessionFactory工厂

               /*SqlSessionFactory是一个接口,接口不可以new,mybatis把建工厂的细节省略了,

               提供了一个SqlSessionFactoryBuilder,这个是可以直接new的,用builder.build()构建工厂,把流传进去 ,而怎么解析配置文件,怎么去封装,与我们无关*/

       SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

       SqlSessionFactory factory = builder.build(in);

       //3.使用工厂生产SqlSession对象

       SqlSession session = factory.openSession();

       //4.使用SqlSession,创建Dao接口的代理对象 (Dao的实现)

       IUserDao userDao = session.getMapper(IUserDao.class);

       //5.使用代理对象执行方法

       List<User> users = userDao.findAll();

       for(User user : users){

           System.out.println(user);

       }

       //6.释放资源

       session.close();

       in.close();

   }

}

3.2.mybatis基于注解的入门案列

1.移除IUserDao.xml文件,在dao接口的方法上使用@Select注解,并指定Sql语句

2.在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名


3.3mybatis不使用XML和注解配置,自己写dao实现类

我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。

不管使用XML还是注解配置。

但是Mybatis它是支持写dao实现类的。

1.创建UserDaoImpl.java

package com.itheima.dao.impl;

import com.itheima.dao.IUserDao;

import com.itheima.domain.User;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class UserDaoImpl implements IUserDao {

   //定义一个可以拿到session对象的变量

   private SqlSessionFactory factory;

   //在创建时传值,保证factory有值

   //把默认构造函数覆盖,相当于没有默认构造函数,所以在用的时候,一定会传一个工厂进来

   public UserDaoImpl(SqlSessionFactory factory){

       this.factory = factory;

   }

   @Override //实现类

   public List<User> findAll() {

       //1.使用工厂创建SqlSession对象,

       SqlSession session = factory.openSession();

       //2.使用session执行查询所有方法

       //填入的是xml配置文件中的对应的namespace.id

       List<User> users =  session.selectList("com.itheima.dao.IUserDao.findAll");

       session.close();  //用完后关闭

       //3.返回查询结果

       return users;

   }

}

2.修改MybatisTest.java

3.4“查询所有”功能的分析


4.自定义mybatis框架(主要目的是了解mybatis中执行细节)

4.1自定义Mybatis分析



4.2自定义mybatis(有xml和注解两种自定义配置)

4.2.0删除pom.xml中mybatis的配置(删除图中部分)


4.2.1删除后,根据 MybatisTest测试类 中缺的 进行 创造类和接口


1.Resources.java



2.SqlSession.java



3.SqlSessionFactory.java



4.SqlSessionFactoryBuilder.java



4.2.2对于SqlSessionFactoryBuilder.java的build进行操作

1.创建utils下工具类XMLConfigBuilder用于解析配置文件 XMLConfigBuilder.java


2.在pom.xml中导入dom4j和jaxen的坐标---------->用于解析配置文件的技术dom4j和xpath


<dependency>

<groupId>dom4j</groupId>

<artifactId>dom4j</artifactId>

<version>1.6.1</version>

</dependency>

<dependency>

<groupId>jaxen</groupId>

<artifactId>jaxen</artifactId>

<version>1.1.6</version>

</dependency>


3.对应的为XMLConfigBuilder.java中出现错误的地方创建该有的类


Configuration.java

Mapper.java ,

Select.java


前面两个文件是xml配置,后面一个是注解配置,可以先把XMLConfigBuilder.java中关于注解配置的代码先注释掉,先进行学习xml配置,然后再学注解配置,不然两个一起学,容易混


4.在前面的操作完成后,XMLConfigBuilder.java中没有错误,


此时,对SqlSessionFactoryBuilder.java的build进行操作



5.有了config,还是没有工厂,而现在工厂现在是接口,所以创建工厂接口的实现类



6.工厂有了,则每个session就有了



上面的操作:


SqlSessionFactoryBuilder有了构建者,


DefaultSqlSessionFactory(cfg)构建者就构建出了工厂


DefaultSqlSession(cfg)工厂就生产了一个SqlSession


7.在session方法里,实现创建代理对象和查询所有的操作


需要添加的文件:


MapperProxy.java

DataSourcesUtil.java

Executor.java


完成上面的操作,运行MybatisTest.java的main方法,得到结果



大白话解释

❶.我们需要最后实现查询所有,而查询所有的功能在工具类里面,最后就是调用这个工具类,


❷. 那么什么时候调用呢?在创建Dao实现类增强的时候,


❸.那什么时候增强呢?在创建代理对象时进行创建Dao实现类(MapperProxy的调用),


invoke用于对方法进行增强的,我们的增强其实就是selectList方法,


MapperProxy找到要执行的语句和封装的结果


为什么要找执行的语句和封装的结果?


①从setMappers的内容就可以看出来getMappers的结果


②从方法 MapperProxy(Map<String,Mapper> mappers,Connection conn)


的第一个参数也可以有所察觉


❹.从哪里找?从配置文件中找,


❺.怎么读取配置文件?读取配置文件由XMLConfigBuilder进行,读取完了之后,需要存起来,


如何存起来?就用到了Configuration对象


当前的项目结构【其中,图中的Select.java是注解配置,在此之前的4.2.2讲的是xml配置,所以还没有涉及Select.java】

需要的文件:


MapperProxy.java

DataSourcesUtil.java

Executor.java


8.之前4.2.2已经完成1~7部分内容,就是xml配置部分,接下来将其改为注解配置,需要修改三个地方


SQLMapConfig.xml文件中,修改为注解配置



IUserDao.java文件修改



进行添加Select.java文件,如果前面添加过,即不需要再次添加 Select.java



完成上面的操作,运行MybatisTest.java的main方法,得到结果

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
501 0
|
SQL Java 关系型数据库
|
SQL Java 关系型数据库
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
36 0
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
59 0
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
111 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
312 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个