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. 导入依赖
    在这里插入图片描述
  2. 引入mybatis的配置文件
    加载datasource
    加载映射文件 → 映射文件的名字通常写成: xxxMapper
    在这里插入图片描述
    3. 使用映射文件中的sql语句

a. 获得SqlSession
在这里插入图片描述
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语句写法
在这里插入图片描述
全部代码:
在这里插入图片描述


对代码的提取:

(sqlSession不是线程安全的,就得每次使用的时候都去获取一个新的sqlSession)
在这里插入图片描述


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

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


  1. 新增
    sqlSession.insert
    在这里插入图片描述
    在这里插入图片描述

  1. 修改
    sqlSession.update
    在这里插入图片描述
    在这里插入图片描述

  1. 删除
    sqlSesseion.delete
    在这里插入图片描述
    在这里插入图片描述

小结
使用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. 单项的配置
    在这里插入图片描述
  2. 批量的配置(引入一个properties配置文件)

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


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

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

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

业务:根据id查询user信息

a. 逐个配置
在这里插入图片描述
b. 批量配置
在这里插入图片描述
c. mybatis也提供了一些别名
基本类型、包装类、java.lang目录下的类
在这里插入图片描述


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

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

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


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

开始使用

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

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


日志log4j配置文件的介绍

  1. appender
    在这里插入图片描述
    在这里插入图片描述
    输出的appender有哪些和级别
    在这里插入图片描述

  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
在这里插入图片描述
5. 日志输出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

UserMapper.xml:

<?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">
<!--namespace就是该映射文件的唯一id,映射文件的namespace(命名空间)不能重复-->
<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接口:
在这里插入图片描述
测试:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-玫瑰少年-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值