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

mybatis框架-学习笔记Day01

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方法,得到结果

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一修

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值