mybatis-day1

一、MyBatis概述

1.1 框架的概念

  • 在文档中framework的意思就是框架

  • Java的常用框架:

    • SSM三大框架:Spring+SpringMVC+MyBatis

    • SpingBoot

    • SpringCloud等等...

  • 框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率。

  • 架构一般都以jar包的形式存在。(jar包中有class文件以及各种配置文件等。)

  • 通俗的讲框架就好比是一个毛胚房,就等着我们根据自己的需求去调用方法装修

1.2:三层架构

mybatis:持久层框架(做数据库连接操作)        数据访问层

spring 应用层框架(业务逻辑处理)                业务逻辑层

spriing MVC 基于Spring框架的Web应用程序开发框架        表示层

1.3JDBC的不足

例如:

示例一:

/*
*查询
*/


List<Flower> list = new ArrayList<>();
//SQL语句写死在Java程序中
String sql = "select * from flower";
ResultSet rs = executeQuery(sql, null);
try {
    while (rs.next()) {
        Flower flower = new Flower();
        flower.setId(rs.getInt(1));
        flower.setName(rs.getString(2));
        flower.setAnothername(rs.getString(3));
        flower.setProperty(rs.getString(4));
        flower.setPrice(rs.getFloat(5));
        flower.setProduction(rs.getString(6));
        list.add(flower);
    }
} catch (SQLException throwables) {
    throwables.printStackTrace();
} finally {
    super.closeAll(rs, super.pstmt, super.con);
}

示例二:

/*
*添加
*/

//......
//SQL语句写死在Java程序中
String sql = "INSERT INTO `ketai`.`flower`( `name`, `anothername`, `property`, `price`, `production`) VALUES (?,?,?,?,?);";
//繁琐的赋值
Object[] params = {flower.getName(),
flower.getAnothername(),
flower.getProperty(),
lower.getPrice(),
flower.getProduction()};
int count = executeUpdate(sql, params);
//.....

1.4 了解MyBatis

MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD(增删改查)

MyBatis在三层架构中负责持久层,属于持久层架构

MyBatis的发展历程:

MyBatis本是apache的一个开源项目IBatis,2010年这个项目有apache software foundation(简称asf:(apache软件基金会)) 迁移到Google code,并且改名为MyBatis。2023年11月迁移到Github。

iBatis一词源于"internet"和"abatis"的组合,是一个基于Java的持久层架构。iBatis提供的持久层架构包括SQL Map和Data Axxess Objects (DAOs)。

  • 打开mybatis代码可以看到它的包结构中包含ibatis

ORM:对象关系映射

O(Object):Java虚拟机中的Java对象

R(Relational):关系型数据库

M(Mapping):将Java虚拟机中的Java对象映射到数据库表中一行记录,或是将数据库表中一行记录映射成Java虚拟机中的一个Java对象

MyBatis框架就是一个半自动的ORM框架

  • 因为MyBatis框架中的SQL需要程序员自己编写

MyBatis可以干啥? Java对象<---->数据库中的一条记录 这个相互转换的过程叫做 映射:(Mapping)

关系图:

ORM图示

  • MyBatis架构特点:

    • 支持定制化SQL、存储过程、基本映射以及高级映射

    • 避免了几乎所有的JDBC代码中手动设置参数以及获取结果集

    • 支持XML开发、也支持注解式开发。【为了保证sql语句灵活,所有mybatis大部分是采用XML方式开发】

    • 将接口和Java的POJs(Plain Ordinary Java Object,简单普通的Java对象映射成数据库中的记录)

    • 体积小好学:两个jar包,两个XML配置文件。

    • 完全做到sql低耦合。

    • 提供了基本映射标签。

    • 提供了高级映射标签。

    • 提供了XML标签,支持动态SQL的编写。

二、下载

1.maven

首先到maven远程仓库https://mvnrepository.com/中搜索mybatis

 点击第一个

 选择你要使用的版本

 比如说我使用的是3.5.13版的就选中第一个,点进去

之后选择下面这个,他是点击之后默认会全选 

 然后复制粘贴到maven项目中的pom.xml文件中的dependencies标签中刷新之后依赖项中出现了就可以了

 2.普通项目

首先到mybatis的官网中点击mybatis-3

 然后点击releases打开发行版

 选择你要使用的版本

 

 三、配置文件

1.mybatis-config.xml文件

注意: 第一:这个文件名不是必须叫做mybatis-config.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">

<configuration>
    <!--引入database.properties文件-->
    <!--1.导入属性文件-->
    <properties resource="database.properties"/>
    <!--3.环境配置-->
    <environments default="development">
        <environment id="development">
            <!--配置事务管理 采用JDBC的事务管理 mybatis其实就是对JDBC的封装 -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <mapper resource="映射的mapper文件"/>
    </mappers>
</configuration>

  具体配置可以查看MyBatis中文网

database.peperties里面放的是

driver =com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
username=root
password=root

 配置完成后出现下图所示就表示可以了

2.编写XxxxxMapper.xml文件

跟上面一样的步骤

在这个配置文件当中编写SQL语句。 ​ 这个文件名也不是固定的,放的位置也不是固定

 namespace的值为你要实现的接口

!!!记得在mybatis-config.xml文件中添加

    <mappers>
        <mapper resource="XxxxxxMapper.xml文件的路径"/>
    </mappers>
<?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="mapper.SysUserMapper">
<!--
namespace的值是你的XxxxxMapper.xml文件的路径,将/改为.。后缀xml去掉

增删改查的代码 id一般是接口中的方法名
 resultType的值为返回的类型- 我这里是查询所有就返回他的实体类
-->

    <delete id="deleteUser">
        delete
        from t_sysuser
        where id = #{id}
    </delete>

    <select id="getUserById" resultType="pojo.SysUser">
        select *
        from t_sysuser
        where id = #{id}
    </select>
</mapper>

四、测试

1.先创建一个实体类

 实体类中的值

package pojo;

import java.sql.Date;
import java.time.LocalDate;

public class SysUser {

  private Integer id;
  private String account;
  private String realName;
  private String password;
  private Integer sex;
  private Date birthday;
  private String phone;
  private String address;
  private Integer roleId;
  private Integer createdUserId;
  private LocalDate caretedTime;
  private Integer updatedUserId;
  private LocalDate updatedTime;


  public SysUser() {
  }


  public SysUser(Integer id, String account, String realName, String password, Integer sex, Date birthday, String phone, String address, Integer roleId, Integer createdUserId, LocalDate caretedTime, Integer updatedUserId, LocalDate updatedTime) {
    this.id = id;
    this.account = account;
    this.realName = realName;
    this.password = password;
    this.sex = sex;
    this.birthday = birthday;
    this.phone = phone;
    this.address = address;
    this.roleId = roleId;
    this.createdUserId = createdUserId;
    this.caretedTime = caretedTime;
    this.updatedUserId = updatedUserId;
    this.updatedTime = updatedTime;
  }

  /**
   * 获取
   * @return id
   */
  public Integer getId() {
    return id;
  }

  /**
   * 设置
   * @param id
   */
  public void setId(Integer id) {
    this.id = id;
  }

  /**
   * 获取
   * @return account
   */
  public String getAccount() {
    return account;
  }

  /**
   * 设置
   * @param account
   */
  public void setAccount(String account) {
    this.account = account;
  }

  /**
   * 获取
   * @return realName
   */
  public String getRealName() {
    return realName;
  }

  /**
   * 设置
   * @param realName
   */
  public void setRealName(String realName) {
    this.realName = realName;
  }

  /**
   * 获取
   * @return password
   */
  public String getPassword() {
    return password;
  }

  /**
   * 设置
   * @param password
   */
  public void setPassword(String password) {
    this.password = password;
  }

  /**
   * 获取
   * @return sex
   */
  public Integer getSex() {
    return sex;
  }

  /**
   * 设置
   * @param sex
   */
  public void setSex(Integer sex) {
    this.sex = sex;
  }

  /**
   * 获取
   * @return birthday
   */
  public Date getBirthday() {
    return birthday;
  }

  /**
   * 设置
   * @param birthday
   */
  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }

  /**
   * 获取
   * @return phone
   */
  public String getPhone() {
    return phone;
  }

  /**
   * 设置
   * @param phone
   */
  public void setPhone(String phone) {
    this.phone = phone;
  }

  /**
   * 获取
   * @return address
   */
  public String getAddress() {
    return address;
  }

  /**
   * 设置
   * @param address
   */
  public void setAddress(String address) {
    this.address = address;
  }

  /**
   * 获取
   * @return roleId
   */
  public Integer getRoleId() {
    return roleId;
  }

  /**
   * 设置
   * @param roleId
   */
  public void setRoleId(Integer roleId) {
    this.roleId = roleId;
  }

  /**
   * 获取
   * @return createdUserId
   */
  public Integer getCreatedUserId() {
    return createdUserId;
  }

  /**
   * 设置
   * @param createdUserId
   */
  public void setCreatedUserId(Integer createdUserId) {
    this.createdUserId = createdUserId;
  }

  /**
   * 获取
   * @return caretedTime
   */
  public LocalDate getCaretedTime() {
    return caretedTime;
  }

  /**
   * 设置
   * @param caretedTime
   */
  public void setCaretedTime(LocalDate caretedTime) {
    this.caretedTime = caretedTime;
  }

  /**
   * 获取
   * @return updatedUserId
   */
  public Integer getUpdatedUserId() {
    return updatedUserId;
  }

  /**
   * 设置
   * @param updatedUserId
   */
  public void setUpdatedUserId(Integer updatedUserId) {
    this.updatedUserId = updatedUserId;
  }

  /**
   * 获取
   * @return updatedTime
   */
  public LocalDate getUpdatedTime() {
    return updatedTime;
  }

  /**
   * 设置
   * @param updatedTime
   */
  public void setUpdatedTime(LocalDate updatedTime) {
    this.updatedTime = updatedTime;
  }

  public String toString() {
    return "SysUser{id = " + id + ", account = " + account + ", realName = " + realName + ", password = " + password + ", sex = " + sex + ", birthday = " + birthday + ", phone = " + phone + ", address = " + address + ", roleId = " + roleId + ", createdUserId = " + createdUserId + ", caretedTime = " + caretedTime + ", updatedUserId = " + updatedUserId + ", updatedTime = " + updatedTime + "}";
  }
}

 2.创建接口

package mapper;

import java.util.List;


public interface SysUserMapper {

    /**
     * 添加用户
     * @param sysUser
     * @return
     */
    Integer insertUser(SysUserMapper sysUser);

    /**
     * 删除用户
     * @param id
     * @return
     */
    Integer deleteUser(Integer id);

    /**
     * 修改用户信息
     * @param sysUser
     * @return
     */
    Integer updateUser(SysUserMapper sysUser);

    /**
     * 查询所有用户信息
     * @return
     */
    List<SysUserMapper> getAllUser();

    /**
     * 根据id查找用户信息
     * @param id
     * @return
     */
    SysUserMapper getUserById(Integer id);

}

3.创建mapper文件执行sql语句

在resource根目录下创建一个mapper文件夹来存放XxxxxMapper.xml文件(也可以放到别的路径)

下面是我的SysUserMapper.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">
<mapper namespace="mapper.SysUserMapper">

    <insert id="insertUser">
        INSERT INTO `t_sysuser` (`account`, `realName`, `password`, `sex`, `birthday`, `phone`, `address`,
                                 `roleId`, `createdUserId`, `caretedTime`, `updatedUserId`, `updatedTime`)
        VALUES (#{account}, #{realName}, #{password}, #{sex}, #{birthday}, #{phone}, #{address}, #{roleId},
                #{createdUserId}, #{caretedTime}, #{updatedUserId}, #{updatedTime});

    </insert>

    <delete id="deleteUser">
        delete
        from t_sysuser
        where id = #{id}
    </delete>

    <update id="updateUser">
        UPDATE `yyds`.`t_sysuser`
        SET `account`       = #{account},
            `realName`      = #{realName},
            `password`      = #{password},
            `sex`           = #{sex},
            `birthday`      = #{birthday},
            `phone`         = #{phone},
            `address`       = #{address},
            `roleId`        = #{roleId},
            `createdUserId` = #{createdUserId},
            `caretedTime`   = #{caretedTime},
            `updatedUserId` = #{updatedUserId},
            `updatedTime`   = #{updatedTime}
        WHERE `id` = #{id};

    </update>

    <select id="getAllUser" resultType="pojo.SysUser">
        select *
        from t_sysuser
    </select>

    <select id="getUserById" resultType="pojo.SysUser">
        select *
        from t_sysuser
        where id = #{id}
    </select>
</mapper>

4.创建测试类

类名最好是见名知意 

 下面是添加的代码        !!!(注意,我这里是添加了mysql驱动和junit依赖的)

 @Test
    public void testInsertOne() throws IOException {
        String btd = "2004-06-06";
        Date birthday = Date.valueOf(btd);
        String a = "2023-08-01 19:52:20";
        String b = "2023-08-02 23:12:15";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDate caretedTime = LocalDate.parse(a, formatter);
        LocalDate updatedTime = LocalDate.parse(b, formatter);
        SysUser sysUser = new SysUser(null, "admin", "张三", "123456", 1, birthday, "fewafewafew", "湖南长沙", 2, 2, caretedTime, 2, updatedTime);
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        //获取SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //Resources.getResourceAsStream默认就是从类的根路径下开始查找资源

        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//一般情况下都是一个数据库对应一个SqlSessionFactory对象

        //获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();//如果使用的事务管理器是JDBC的话,底层实际上会执行: conn.setAutoCommit(false);
        //这种方式实际上是不建议的 因为没有开启事务
        //SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //执行sql语句       方法中是XxxxMapper.xml文件中insert标签中的id
        int insert = sqlSession.insert("insertUser",sysUser);
        System.out.println(insert);
        //手动提交
        sqlSession.commit();//如果使用的事务管理器是JDBC的话,底层实际上还是会执行conn.commit();
        //关闭
        sqlSession.close();
    }

5.工具类

是不是觉得上面的代码太过于繁琐了呢,简单,我们直接将他封装起来

 下面是封装的代码

package util;

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;

/**
 * mybatis工具类
 * @BelongsProject: mybatis
 * @BelongsPackage: utils
 * @Author: Th
 * @CreateTime: 2023-07-18  11:28 周二
 * @Description: TODO
 * @Version: 1.0
 */
public class SqlSessionUtil {
    //工具类的构造方法一般都是私有化的。
    //工具类中的所有方法都是静态的,直接采用类名即可调用。不需要new对象。
    //为了防止new对象,构造方法私有化。
    private SqlSessionUtil(){}

    private static SqlSessionFactory sqlSessionFactory;

    //类加载时执行
    //SqlSessionUtil工具类在进行第一次加载的时候,解析mybatis-config.xml文件。创建SqlSessionFactory对象。
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取会话对象
     * @return 会话对象
     */
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }
}

然后我们就可以简化测试类中的方法了

下面是完整的一套增删改查

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.SysUser;
import util.SqlSessionUtil;
import java.sql.Date;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * @BelongsProject: mybatis_day1
 * @BelongsPackage: PACKAGE_NAME
 * @Author: Th
 * @CreateTime: 2023-08-04  19:30 周五
 * @Description: TODO
 * @Version: 1.0
 */
public class TestUser {
    @Test
    public void testInsert() {
        String btd = "2004-06-06";
        Date birthday = Date.valueOf(btd);
        String a = "2023-08-01 19:52:20";
        String b = "2023-08-02 23:12:15";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDate caretedTime = LocalDate.parse(a, formatter);
        LocalDate updatedTime = LocalDate.parse(b, formatter);
        SysUser sysUser = new SysUser(null, "admin", "周锦鹏", "123456", 1, birthday, "13838383838", "湖南长沙", 2, 2, caretedTime, 2, updatedTime);
        SqlSession sqlSession = SqlSessionUtil.openSession();
        int insert = sqlSession.insert("insertUser", sysUser);
        System.out.println(insert);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDelete() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        int delete = sqlSession.delete("deleteUser", 1);
        System.out.println(delete);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testUpdate() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        String btd = "2004-06-06";
        Date birthday = Date.valueOf(btd);
        String a = "2023-08-01 19:52:20";
        String b = "2023-08-04 20:12:15";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDate caretedTime = LocalDate.parse(a, formatter);
        LocalDate updatedTime = LocalDate.parse(b, formatter);
        SysUser sysUser = new SysUser(2, "sb", "杨俊豪", "yjhssb", 2, birthday, "13838389438", "湖南醴陵", 3, 3, caretedTime, 3, updatedTime);
        int update = sqlSession.update("updateUser", sysUser);
        System.out.println(update);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testGetAll() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        List<SysUser> list = sqlSession.selectList("getAllUser");
        list.forEach(user -> System.out.println(user));
        sqlSession.close();
    }

    @Test
    public void testGetUser() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        SysUser user = sqlSession.selectOne("getUserById", 2);
        System.out.println(user);
        sqlSession.close();
    }
}

以上就是简单的一套mybatis的增删改查

关注博主不迷路,拜拜!😊😊😊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值