week16_day05_Mybatis01

mybatis介绍

持久层框架(其实所有数据库的框架都是持久层框架)
orm框架 → Object relationship mapping 对象关系映射
对象 → javabean
关系 → 关系表
映射 → 一个javabean对象就可以对应一条关系表中的记录

定制Sql:手写sql语句 → 灵活的框架
高级映射:输入映射和输出映射

输入映射:对象 → 关系表 → 为预编译的sql提供参数
输出映射:关系表 → 对象 → 查询结果的封装

动态sql:根据你的参数的不同可以动态的更改执行的sql语句

将sql语句和java代码做一个解耦 → sql集中管理起来 → 映射文件 → 不同模块的sql放到不同的映射文件下。
比如user相关的模块就映射到user对应的映射文件下。


mybatis入门案例一

将sql语句集中管理到映射文件中,然后去调用映射文件中的sql

  1. 导入依赖
    week16_day05_Mybatis01_第1张图片
  2. 引入mybatis的配置文件
    加载datasource
    加载映射文件 → 映射文件的名字通常写成: xxxMapper
    week16_day05_Mybatis01_第2张图片
    3. 使用映射文件中的sql语句

a. 获得SqlSession
week16_day05_Mybatis01_第3张图片
sqlSession和JDBC的Connection很类似,sqlSession其实就是在底层封装了connection。
sqlSession要通过sqlSessionFactory来获取。
sqlSessionFactory又是通过SqlSessionFactoryBuilder创建出来的。
build中传入mybatis.xml的inputStream,来加载mybatis.xml。
获取mybatis.xml的inputStream:Resources.getResourceAsStream(“mybatis.xml”);

b. 获取sqlId
在这里插入图片描述
c. sqlsession执行对应sql
在这里插入图片描述
在这里插入图片描述
d. 映射文件中的sql语句写法
week16_day05_Mybatis01_第4张图片
全部代码:
week16_day05_Mybatis01_第5张图片


对代码的提取:

(sqlSession不是线程安全的,就得每次使用的时候都去获取一个新的sqlSession)
week16_day05_Mybatis01_第6张图片


其他的crud操作:sqlSession来调用对应的sql

1. 查询list
sqlSession.selectList
在这里插入图片描述
业务场景:将所有的username都查询出来
week16_day05_Mybatis01_第7张图片
week16_day05_Mybatis01_第8张图片


  1. 新增
    sqlSession.insert
    在这里插入图片描述
    week16_day05_Mybatis01_第9张图片

  1. 修改
    sqlSession.update
    在这里插入图片描述
    week16_day05_Mybatis01_第10张图片

  1. 删除
    sqlSesseion.delete
    在这里插入图片描述
    week16_day05_Mybatis01_第11张图片

小结
使用sqlSession的方法,找到对应要执行的sql语句 → namespace.id
1、做查询一定要写resultType,而增删改不需要也写不了
2、调用sqlSession的方法的两个参数
字符串:namespace.id
object:为sql语句提供参数,决定了sql语句中#{}中的值要怎样写
基本类型、String、包装类:#{}中任意写
javabean或map:#{}中写javabean的成员变量名或map的key


入门案例2
mybatis配置文件相关
入门案例1中只做了 datasource和mappers的配置(必需的配置)→ 青春版(丐版)

一、properties(参数)
给mybatis中的配置项提供参,也就收给mybatis.xml中的某些值提供参数。

  1. 单项的配置
    week16_day05_Mybatis01_第12张图片
  2. 批量的配置(引入一个properties配置文件)

db.driver方便区分我们做的事情是什么(数据库相关操作),同时又可以避免我们引用到系统变量。
week16_day05_Mybatis01_第13张图片
3. settings(后面讲)
在这里插入图片描述
在这里插入图片描述


  1. typeAliases(类型别名)
    在映射文件中使用 → 当使用到resultType 或 type的时候,可以使用别名。

张松 → 松哥
李艮隶 → 小白龙 → 隶哥
张帅 → 帅哥
lanzhao→ 钊哥

有个类 com.cskaoyan.bean.User → user,在resultType 中就可以直接使用别名user
有个类 com.cskaoyan.bean.Order → order

业务:根据id查询user信息

a. 逐个配置
week16_day05_Mybatis01_第14张图片
b. 批量配置
week16_day05_Mybatis01_第15张图片
c. mybatis也提供了一些别名
基本类型、包装类、java.lang目录下的类
week16_day05_Mybatis01_第16张图片


  1. typehandlers
    类型转换:输入映射和输出映射过程中
    暂时讲不了:

  1. mappers
    (1). 逐项配置
    a. resource
    在这里插入图片描述
    b. url
    在这里插入图片描述
    c. class(非常重要)
    week16_day05_Mybatis01_第17张图片
    week16_day05_Mybatis01_第18张图片

批量配置package(非常重要)
批量配置是和上面的class这种配置是相关
配置的是接口所在的包目录,也就是加载该包目录下的全部接口
week16_day05_Mybatis01_第19张图片


mybatis的代码中已经写了输出日志的代码,但是需要一个机会(log4j)输出。
Log4j
mybatis本身支持了log4j,可以直接使用

开始使用

  1. 导包
    week16_day05_Mybatis01_第20张图片
  2. 4.1.2复制配置文件
    直接复制到classpath目录
    在这里插入图片描述

控制台中输出了一些日志
mybatis代码中就是写了这些输出内容的代码,log4j依赖和配置引进的时候, 输出内容的代码就执行到了,就输出出来了
主要看这些内容
在这里插入图片描述


日志log4j配置文件的介绍

  1. appender
    week16_day05_Mybatis01_第21张图片
    week16_day05_Mybatis01_第22张图片
    输出的appender有哪些和级别
    week16_day05_Mybatis01_第23张图片

  2. layout
    含义是日志输出内容的格式
    在这里插入图片描述
    我们主要使用的就是pattern-layout

  3. pattern-layout中的格式
    在这里插入图片描述
    %d:日期信息
    %d{ABSOLUTE}:ABSOLUTE代表的是日期的格式
    %5p:p日志级别 5代表占用5字符
    %c: category类 → 输出日志的代码是属于哪一个类的
    %c{1}: 数字代表类输出几个层级,从后先前数的,表示几级目录
    %L:输入日志的代码的行号
    %m:message 日志中输出的消息
    %n: 换行

  4. 日志级别
    debug → info → warn → error → fatal
    由低到高输出的内容量是递减:输出当前级别以及更高级别的内容
    debug级别下, info、warn、error、fatal这些级别的内容都会输出。
    info级别下,info、warn、error、fatal这些级别的内容会输出。

通常项目中日志级别是info
week16_day05_Mybatis01_第24张图片
5. 日志输出
week16_day05_Mybatis01_第25张图片
week16_day05_Mybatis01_第26张图片
week16_day05_Mybatis01_第27张图片


作业1:执行查询
创建一张用户表和user类
通过sqlSession直接调用api的形式
1、selectOne查询:根据用户名和密码查询对应的user(列名和成员变量名一致)
2、通过insert新增单条用户记录

UserMapper.xml:




<mapper namespace="userMapper">
    <select id="selectUserByUsernameAndPassword" resultType="com.cskaoyan.bean.User">
        select id, username, password, age, gender from j22_user_t where username = #{username} and password = #{password}
    select>

    <insert id="insertUser">
        insert into j22_user_t (id,username,password,age,gender) value
        (#{id},#{username},#{password},#{age},#{gender})
    insert>
mapper>

测试类:

package com.cskaoyan;

import com.cskaoyan.bean.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 org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

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

public class MyBatisTest {
     
    static SqlSessionFactory sqlSessionFactory;
    SqlSession sqlSession = null;

    @BeforeClass
    //在单元测试类最开始的时候执行一次
    //不需要每次都去初始化sqlSessionFactory
    public static void beforeClass() throws IOException {
     
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        sqlSessionFactory = builder.build(inputStream);
    }

    @Before//每一个@Test方法执行之前都会执行的方法
    public void init() {
     
        sqlSession = sqlSessionFactory.openSession();
    }

    @After //每一个@Test方法执行之前都会执行的方法
    //手动提交sqlSession
    //也可以在新建的时候传入参数true:sqlSession = sqlSessionFactory.openSession(true);
    public void commit() {
     
        if (sqlSession != null) {
     
            sqlSession.commit();
            sqlSession.close();
        }
    }

    @Test
    public void mytest1() {
     
        String sqlId = "userMapper" + "." + "selectUserByUsernameAndPassword";
        User user = new User("shihao", "lsh1998");
        User u = sqlSession.selectOne(sqlId, user);
    }


    /**
     * insert
     */
    @Test
    public void mytest2() throws IOException {
     
        User user = new User(4, "shuaige", "shuai", 20, "male");
        int insert = sqlSession.insert("userMapper.insertUser", user);
        System.out.println("insert = " + insert);
    }
}

作业2: 使用delete删除数据
使用或者在下配置这种配置;
定义一个接口,并在接口中定义一个delete方法,能够根据id删除一条数据库中的数据;
并且测试你写的代码

UserMapper.xml:
在这里插入图片描述
UserMapper接口:
week16_day05_Mybatis01_第28张图片
测试:
week16_day05_Mybatis01_第29张图片

你可能感兴趣的:(Spring)