Day14(1)Mybatis入门

一、Mybatis介绍

1、Mybatis是什么?

MyBatis 本是apache的一个开源项目iBatis,是一个基于Java的持久层框架,用来写dao

2、Mybatis有什么特点?

(1)最简单安装只要两个jar文件+配置几个sql映射文件,自带连接池
(2)sql写在xml里,便于统一管理和优化
(3)sql和代码的分离,提高了可维护性
(4)提供映射标签,支持对象与数据库的orm字段关系映射
(5)提供对象关系映射标签,支持对象关系组建维护
(6)提供xml标签,支持编写动态sql

3、Mybatis架构

在这里插入图片描述

二、Mybatis环境搭建

1、mybatis下载

mybaits的代码由github.com管理
下载地址:https://github.com/mybatis/mybatis-3/releases

2、导入jar包

测试相关的包: junit hamcrest
日志相关的包:log4j-1.2.16 slf4-api slf4j-log4j12
数据库相关jar包: mysql-connector
Mybatis先关jar包: mybaits-3.4.5

  • 在maven工程pom.xml中导入相关依赖
<dependencies>
    <!-- junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <!-- MySql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
    <!-- Mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!--日志包-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

3、导入jar包log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

三、Mybatis的操作步骤

1、mybatis开发流程

(1)加载SqlMapConfig.xml配置文件
(2)创建SqlSessionFactoryBuilder对象
(3)创建SqlSessionFactory对象
(4)创建SqlSession对象
(5)执行SqlSession对象执行删除
(6)提交事务
(7)释放资源

2、Mybatis的入门案例(根据id删除)

(1)核心配置文件:编写 SqlMapConfig.xml 配置文件
src\main\resources\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">
<!--dtd是对xml配置标签与属性的约束-->
<configuration>
    <!--配置mybatis的开发环境,该目录下可以有多个environment,
    	和spring整合后 environments配置将废除-->
    <environments default="mysql"><!--当前默认选择的是mysql环境-->
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型:jdbc事务管理-->
            <transactionManager type="JDBC"/>
            <!--配置连接数据库的信息:用的是数据源(连接池)-->
            <dataSource type="POOLED">
                <!--四大配置信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis01?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <!--配置多个映射文件,告知mybatis映射配置的位置-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

(2)映射文件:在用户的映射配置文件中配置,然后在 SqlMapConfig.xml 中的 mappers 标签中添加此映射。
src\main\resources\UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--mapper的约束文件-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间,用于隔离sql
    当我们有多个UserMapper.xml时,为了区分不同的文件,则需要指定namespace,这个值必须唯一。
    需要取一个名字来辨别,可以随便取,但一般是用对应的实体类包名-->
<mapper namespace="cn.cyl.bean.User">
    <!--id:Mybatis是将sql语句写在xml文件中,
        以后sqlSession对象根据namespace.id的格式来获取sql语句-->
    <!--parameterType:用于指定传入参数的类-->
    <delete id="deleteById" parameterType="int">
        <!--sql 语句中使用#{}字符:
        	它代表占位符,相当于原来 jdbc 部分所学的 ?,都是用于执行语句时替换实际的数据。    
        	具体的数据是由#{}里面的内容决定的。  
           #{}中内容的写法:   
        	由于数据类型是基本类型,所以此处可以随意写。 -->
        delete from user where id = #{id}
    </delete>
</mapper>

(3)在测试类添加测试
src\test\java\cn\cyl\pack01\Test01Mybatis.java

public class Test01Mybatis {
    
    
    @Test
    public void test01(){
    
    
        //1.使用类加载器 读取SqlMapConfig.xml配置文件
        InputStream inputStream = Test01Mybatis.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //2.创建构建者对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.创建SqlSessionFactory工厂对象; 加载核心配置文件,参1:输入流
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //4.创建SqlSession对象
        SqlSession sqlSession = sessionFactory.openSession();
        //5.执行SqlSession对象执行删除
        //sql语句:delete from user where id = ?
        //执行删除 参1:namespace.id的格式    参2:参数值
        sqlSession.delete("cn.cyl.bean.User.deleteById",24);
        //6.提交事务
        //mybatis的sqlSession不会自动提交,需要手动提交,不然不会执行sql语句
        //只有增删改需要提交,查询不需要(因为查询只有读操作,没有写操作)
        sqlSession.commit();
        //7.释放资源
        sqlSession.close();
    }
}

3、封装 MySessionUtil

(1)SqlSession工具类
src\main\java\cn\cyl\util\MySessionUtils.java

public class MySessionUtils {
    
    
    //定义为成员变量
    private static SqlSessionFactory sessionFactory;

    //static 静态代码,在类加载的时候执行一次,且只执行一次
    static {
    
    
        //1.使用类加载器 读取SqlMapConfig.xml配置文件
        InputStream inputStream = MySessionUtils.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //2.创建构建者对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.创建SqlSessionFactory工厂对象
        sessionFactory = sqlSessionFactoryBuilder.build(inputStream);//加载核心配置文件,参1:输入流
    }

    public static SqlSession getSession(){
    
    
        //4.创建SqlSession对象
        SqlSession sqlSession = sessionFactory.openSession();
        return sqlSession;
    }
}

(2)测试类测试
src\test\java\cn\cyl\pack01\Test02Mybatis.java`

public class Test02Mybatis {
    
    
    @Test
    public void test01(){
    
    
        //4.创建SqlSession对象
        SqlSession sqlSession = MySessionUtils.getSession();
        //5.执行SqlSession对象执行删除
        //sql语句:delete from user where id = ?
        sqlSession.delete("cn.cyl.bean.User.deleteById",24);//执行删除 参1:namespace.id的格式    参2:参数值
        //6.提交事务
        //只有增删改需要提交,查询不需要(因为查询只有读操作,没有写操作)
        //mybatis的sqlSession不会自动提交,需要手动提交,不然不会执行sql语句
        sqlSession.commit();
        //7.释放资源
        sqlSession.close();
    }
}

四、关键类分析

  1. SqlSession的使用范围
    SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。
    SqlSession通过SqlSessionFactory创建。
    SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。
  2. SqlSessionFactoryBuilder
    SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
  3. SqlSessionFactory
    SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

猜你喜欢

转载自blog.csdn.net/qq_43639081/article/details/108812439
今日推荐