MyBatis_02_(搭建Mybatis)

搭建MyBatis

1-开发环境

2-创建Maven工程

  • 2.1- 打包方式

  • 2.2 导入依赖

<!--    打包方式jar-->
    <packaging>jar</packaging>

    <dependencies>
        <!-- MyBatis核心-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <!-- junit测试-->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <!-- mysql驱动-->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.13</version>
        </dependency>

    </dependencies>

3-创建Mybatis核心配置文件 ----> (连接"数据库")

  • 核心配置文件"主要"用于:1-配置廉价数据库的环境 、2-MyBatis全局配置信息

  • 核心配置文件"主要"放置:src / main / resources 目录下面

  • 映射文件"主要"用于:写SQL语句

3.1-配置mybatis的核心文件:

  • 3.1.1 :1-放置路径、2-文件名称"mybatis-config.xml"

  • 3.1.2:核心文件的内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!--    配置链接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>  <!--事务管理器-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/> <!--驱动名称-->
                <property name="url" value="jdbc:mysql://localhost:3306/learn_mybatis"/> <!--连接地址-->
                <property name="username" value="root"/> <!--用户名-->
                <property name="password" value="${password}"/> <!--用户密码-->
            </dataSource>
        </environment>
    </environments>
 

<!--    引入映射文件-->
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

4-创建Mapper接口

  • Mapper接口的解析:MyBatis的 "Mapper接口" 等于 "以前的Dao接口"

  • 但是区别:Mapper只是接口,我们不需要提供"实现类" --->(需要和"SpringJpa"区别开来)

  • 4.1-首先我们需要创建一个数据库:

  • 4.2-创建t_user表对应的实体类:

  • 4.3-创建操作"User实体类"的"UserMapper"

5-创建Mapper的映射文件:

ORM : 对象 关系 映射

  • 对象:java的‘实体类’对象

  • 关系;关系型数据库

  • 映射:二者之间的对应关系

  • 5.1-加深"对应关系"的理解:

  • 5.2-映射文件的"命名规则"

  • 5.3-映射文件的"书写路径" ---> (选择"表",进行CRUD)

  • //一个"提供接口",一个"实现sql语句操作数据库"

  • 5.4-细节:MyBatis面向接口编程的"两个一致"(2点)

  • 第一点:

5.4.1- 细节: 1-映射文件的 "namespace" 要和 "mapper接口的全类名” 保持一致

全类名:拿5.3的"UserMapper"来举例子:他的全类名是:com.guigu.mapper.UserMapper(java包下开始算起)

所以:

  • 第二点:

5.4.2- 细节: 2-映射文件中的 "SQL语句的id" 要和 "mapper接口中的方法名" 一致

所以:

  • 5.5-在"核心文件中‘配置’映射文件"

resource文件下的"资源" ---(图中的是“核心配置文件”)

6-测试写的mapper是否可以

  • 在test里面写一个"UserMapperTests"

package com.atguigu.mapper;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class UserMapperTests {


    @Test
     public void UserMapper() throws IOException {
        //配置核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取sqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        System.err.println(mapper);
        //测试功能
        Integer result = mapper.insertUser();
        System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
        // 7. 提交事务,事务是不会自动提交的,需要手动提交事务
        sqlSession.commit();
        // 8. 关闭 sqlSession,最后一定要记得关闭会话
        sqlSession.close();

    }
}

细节(替换):

openSession() 获得 SqlSession默认是不会自动提交事务,因此需要自己手动提交。

openSession(true) 获得 SqlSession默认会自动提交事务

7-添加日志功能

  • 7.1-导入依赖

<!-- log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

  • 7.2-添加log的资源文件

  • 路径:resources包 下的 log4j.xml 文件

  • 7.3-log4j.xml代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5d %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
        </layout>
    </appender>

    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis" >
        <level value="info"/>
    </logger>

    <!-- 默认配置,级别为debug 且根据name为log.console和 log.file两个appender输出-->
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

8-附加篇;对"Mybatis"来实现对"数据库"的CEUD的细节分析:

  • 8.1-有的配置;

解析:
1-"实体类”  用来对  “数据库的字段”(对应)

2-“核心配置”(用来连接Mysql的库)

3-“接口”(用来给Service层调用方法)
但是,真正用 “sql语句” 来对 “数据库” 进行操作的是 ---> “映射文件”

//所以,“接口”  和  “映射文件”的  “两个一致”  格外重要!!!(如果不懂两个一致,翻看上面的-5.4)
  • 8.2:疑问:

那  “接口”  和  “映射文件”   就可以进行对数据的操作,  那"User实体类"的作用是什么?

解答:
          1- 增、删、改 ->  这三个的"返回值是Integer"  受影响的行数,不需要"User实体类"

          2- 但是,"查",需要查到数据,"用User实体类" 来"接收"查到的数据 ,这时候User就有用处啦!

           接下来,用"代码8.3"来展示,"User实体类"的 "用处"
  • 8.3 - 用"按id查询"来体现出 "User实体类" 的作用

  • 1-首先,先写"UserMapper接口"

 /**
     * 用id查询单条数据
     */
    User FindUserById();

    /**
     * 用id查询多条数据(多条)
     */
    List<User> FindAllUser();
  • 2-再写,"UserMapper的映射文件"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="com.atguigu.mapper.UserMapper">    //这个是  "映射文件"  去映射  "Mapper接口"

    

    <!--   mapper的接口:  User FindUserById();
     细节:映射文件中的  "SQL语句的id" 要和  "mapper接口中的方法名" 一致
     -->

    <!--
    查询功能必须有:resultType或者resultMap

    1-resultType:默认的映射关系(大白话:"表的字段"和"实体类的属性"一致)

    2-resultMap:自定义映射关系(大白话:"表的字段"和"实体类的属性"不一致,需要"额外的步骤")
    或者"一对多、多对一"的情况也使用-resultMap
    -->
    <select id="FindUserById" resultType="com.atguigu.pojo.User">
        select * from t_user where id=5;
    </select>


    <!--    List<User> FindAllUser();-->
    <select id="FindAllUser" resultType="com.atguigu.pojo.User">
        select * from t_user where FIND_IN_SET(id,'2,3,5');
    </select>

</mapper>
  • 解析:

1-"查询功能"必须有:"resultType"或者"resultMap" //用来,可以让"查询到的数据,有一个实体类容器装起来"



2-当然,那"resultType"或者"resultMap" 的使用时需要细节的:

     1-resultType:默认的映射关系(大白话:"表的字段"和"实体类的属性"一致)

     2-resultMap:自定义映射关系(大白话:"表的字段"和"实体类的属性"不一致,需要"额外的步骤")
eg:“数据库

     2.1或者"一对多、多对一"的情况也使用-resultMap
    //百度搜索:resultMap的用法

8.4-测试:

package com.atguigu.mapper;

import com.atguigu.pojo.User;
import org.junit.Test;

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

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class UserMapperTests {


    @Test
     public void UserMapper() throws IOException {
        //配置核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取sqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //测试功能
        Integer result = mapper.UpdateUser();
        System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
        // 7. 提交事务,事务是不会自动提交的,需要手动提交事务 (用---> sqlSessionFactory.openSession(true); 替换)
        //sqlSession.commit();
        // 8. 关闭 sqlSession,最后一定要记得关闭会话
        sqlSession.close();

    }

    @Test //删除
    public void DeleteUserMapper() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Integer result = mapper.DeleteUser();
        System.out.println("Result --> "+ result); //查看受影响的'行数',如果等于1,表示正常
        sqlSession.close();

    }

    @Test //查询id
    public void FindUserById() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User result = mapper.FindUserById();
        System.err.println("Result --> "+ result);
        sqlSession.close();

    }

    @Test //查询All
    public void FindAllUser() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.FindAllUser();
        System.err.println("Result --> "+ users);
        sqlSession.close();

    }

}

附加篇:@Test每次都要写这么多,肯定不方便呀。

所以我们把“sqlSession”封装成一个“工具类”

  • 1-工具类路径:

  • 封装sqlSession内容:

  • 细节:"工具类”,一般设置为static静态的,方便调用

package com.atguigu.mybatis.utils;

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.IOException;
import java.io.InputStream;

/**
 * 封装了sqlSession方法;
 */
public class SqlSessionUtils {
    public static SqlSession getSession() {

        SqlSession sqlSession = null;
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sqlSession;
    }
}

  • 在test尝试 -- "Session的封装方法"

//优化后的@Test,代码模块

package com.atguigu.mapper;

import com.atguigu.mybatis.mapper.ParameterMapper;
import com.atguigu.mybatis.pojo.User;
import com.atguigu.mybatis.utils.SqlSessionUtils;
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 org.junit.Test;

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

public class ParameterMapperTests {
    @Test //查询All
    public void FindAllUser() throws IOException {

        SqlSession sqlSession = SqlSessionUtils.getSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        List<User> users = mapper.FindAllUser();
        System.err.println("Result --> "+ users);
        sqlSession.close();

    }
}

posted on 2023-02-12 22:44  陈嘻嘻-  阅读(17)  评论(0编辑  收藏  举报

导航