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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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方法,得到结果

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
650 0
|
SQL Java 关系型数据库
|
SQL Java 关系型数据库
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
131 0
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
162 0
|
4月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
639 1
Spring boot 使用mybatis generator 自动生成代码插件
|
7月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
552 0
|
9月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
325 2