欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

01.【MyBatis框架】

程序员文章站 2024-03-14 19:59:11
...

1. 前提

什么是框架

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

三层架构

  • 表现层:是用于展示数据的
  • 业务层:是处理业务需求
  • 持久层:是和数据库交互的
    01.【MyBatis框架】

持久层技术解决方案

  • JDBC技术:ConnectionPreparedStatementResultSet

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

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

01.【MyBatis框架】

以上这些都不是框架

  • JDBC是规范

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

2. mybatis的概述

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

四大部分组成

01.【MyBatis框架】

mybatis的分析

01.【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中的方法
第六步:释放资源

目录结构

01.【MyBatis框架】

注意事项

  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();
    }
}

01.【MyBatis框架】

结果:

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='沈阳'}
相关标签: MyBatis mybatis