01.【MyBatis框架】

1. 前提

什么是框架

它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。

三层架构

  • 表现层:是用于展示数据的
  • 业务层:是处理业务需求
  • 持久层:是和数据库交互的
    在这里插入图片描述

持久层技术解决方案

  • JDBC技术:ConnectionPreparedStatementResultSet

  • Spring的JdbcTemplate:Spring中对jdbc的简单封装

  • Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

在这里插入图片描述

以上这些都不是框架

  • JDBC是规范

  • Spring的JdbcTemplate和Apache的DBUtils都只是工具类

2. mybatis的概述

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

四大部分组成

在这里插入图片描述

mybatis的分析

在这里插入图片描述

ORM:对象关系映射

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

	user			User
	id				userId
	user_name		userName

今天我们需要做到,,实体类中的属性和数据库表的字段名称保持一致。

	user			User
	id				id
	user_name		user_name

3. 入门

环境搭建

  1. 创建maven工程并导入坐标
  2. 创建实体类和dao的接口
  3. 创建Mybatis的主配置文件:SqlMapConifg.xml
  4. 创建映射配置文件:IUserDao.xml

测试类步骤

第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession
第四步:创建Dao接口的代理对象
第五步:执行dao中的方法
第六步:释放资源

目录结构

在这里插入图片描述

注意事项

  1. 创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。

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

    所以:IUserDao 和 IUserMapper是一样的

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

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

    目录在创建时:com.itheima.dao是一级目录 (不能一起创建!)

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

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

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

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

    配置的方式:指定实体类的全限定类名

当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。

基础代码

  1. 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.luis</groupId>
    <artifactId>day01_01mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--打包方式-->
    <packaging>jar</packaging>

    <dependencies>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <!--Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--只在测试时起作用-->
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--jdk编译插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.9</source>
                    <target>1.9</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. domain包
package cn.luis.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * @ClassName User
 * @Description TODO
 * @Author L
 * @Date 2020.02.28 17:24
 * @Version 1.0
 * @Remark TODO
 **/
public class User implements Serializable {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

	// 省略...
    }
}
  1. dao包
package cn.luis.dao;

import cn.luis.domain.User;

import java.util.List;

/**
 * @InterfaceName IUserDao
 * @Description 用户的持久层接口
 * @Author L
 * @Date 2020.02.28 18:54
 * @Version 1.0
 * @Remark TODO
 **/
public interface IUserDao {
    
    /**
     * @Description 查询所有操作
     * @Author Luis
     * @Date 2020.02.28 18:56
     * @Param []
     * @Return java.util.List<cn.luis.domain.User>
    **/
    List<User> findAll();
}
  1. SqlMapConfig.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">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="cn/luis/dao/IUserDao.xml"/>
    </mappers>
</configuration>
  1. IUserDao.xml
  • 【namespace】用于绑定Dao接口的,即面向接口编程

    它的好处在于当使用了namespace之后就可以不用写接口实现类,
    业务逻辑会直接通过这个绑定寻找到相对应的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">
<mapper namespace="cn.luis.dao.IUserDao">
    <!--配置查询所有  id:方法名称  resultType:把结果集封装到哪里去-->
    <select id="findAll" resultType="cn.luis.domain.User">
        /*sql语句*/
        select * from user
    </select>
</mapper>
  1. 测试类

代码:

package cn.luis.test;

import java.io.InputStream;
import java.util.List;

import cn.luis.dao.IUserDao;
import cn.luis.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;

/**
 * @ClassName MyBatisTest
 * @Description mybatis入门案例
 * @Author L
 * @Date 2020.02.28 20:00
 * @Version 1.0
 * @Remark TODO
 **/
public class MyBatisTest {
    /**
     * @Description 入门案例
     * @Author Luis
     * @Date 2020.02.28 20:01
     * @Param [args]
     * @Return void
    **/
    public static void main(String[] args) throws Exception {
        //1.读取配置文件 (读取连接数据库的信息)
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 2.创建SqlSessionFactory工厂 (工厂生产操作对象)
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);

        // 3.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        // 4.使用SqlSession创建Dao接口的代理对象 (session根据字节码文件生成代理对象)
        IUserDao dao = session.getMapper(IUserDao.class);
        // 5.使用代理对象执行方法
        List<User> users = dao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        // 6.释放资源
        session.close();
        in.close();
    }
}

在这里插入图片描述

结果:

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龙'}
User{id=45, username='mybatis updateuser', birthday=Sun Mar 01 01:14:18 CST 2020, sex='女', address='沈阳'}
User{id=46, username='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex='男', address='北京'}
User{id=48, username='小马宝莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex='女', address='北京修正'}
User{id=50, username='mybatis last insertid', birthday=Sun Mar 01 02:18:02 CST 2020, sex='男', address='沈阳'}
User{id=51, username='mybatis last insertid', birthday=Sun Mar 01 21:21:08 CST 2020, sex='男', address='沈阳'}
发布了36 篇原创文章 · 获赞 14 · 访问量 3586

猜你喜欢

转载自blog.csdn.net/qq_39720594/article/details/105222774
01.