day01 mybatis

本文详细介绍MyBatis框架的基本概念及使用方法,包括环境搭建、配置文件解析、基本CRUD操作实现等,帮助读者快速掌握MyBatis的核心功能。

day01 mybatis

Mybatis介绍

它是基于Java编写的持久层框架,使开发者不必关心传统jdbc的api,只关心sql语句本身。

采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

传统JDBC的缺点

1 每次都需要获取链接,然后关闭链接,导致影响性能

2 直接写死了SQL语句,导致硬编码

3 执行完成SQL语句之后,还需要自己封装javabean对象

mybatis的优点

1 直接使用数据库连接池

2 mybatis是直接把SQL语句写到配置文件,会更加灵活

3 mybatis框架执行CRUD的时候,会自动封装javabean

入门案例

首先配置maven仓库,配置两个setting,两个setting里面的maven必须配置一模一样

在这里插入图片描述

在这里插入图片描述

创建项目名称 day43MyBatis

添加pom的文件,下载相关包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>day43Mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

<!--    导入坐标-->
    <dependencies>
<!--        导入mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

<!--        导入MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

<!--        导入测试框架-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

<!--        导入日志框架-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

创建数据库mybatis

create database mybatis;

创建表user

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '名称',
  `password` varchar(32) NOT NULL COMMENT '密码',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建实体类User

package com.atguigu.pojo;

public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

在资源文件文件夹下面,新建一个核心配置文件, 文件的名字随意

在这里插入图片描述

<?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">

<!--
核心配置文件
表示dtd的约束文件
约束文件的意思:所有的配置都需要放到configuration里面 这个里面需要设置各种属性
大概有十个属性,每个属性是由先后顺序 不能随意放置
所以它的名字叫约束文件
-->
<configuration>
<!--
    数据源 事务管理器
    环境配置变量
    environments:表示设置环境变量,但是环境变量可以设置多个
    environment:表示环境变量
    id:表示唯一标识符,随便取名字,叫什么都可以
    default:表示默认选中哪个环境变量,注意:必须跟下面的id保持一致
    transactionManager:表示事务管理器
    type="JDBC":表示使用JDBC的事务管理器mybatis实际上是对JDBC的封装
    dataSource:表示数据源
    type="POOLED":表示数据库的连接池
    数据源里面需要设置四个参数
    驱动 url地址 用户名 密码
    -->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
<!--                当前的版本 8.0以上 需要设置cj 如果是8.0以下 去掉cj-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
             <!--
                设置url地址
                ///:这个是主机和端口的缩写
                localhost:3306
                需要设置时区
                北京:东八区,每15度一个区,一个区间隔一个小时
                北回归线:广东 广西 云南
                时区必须得写,其他的参数可写可不写
                useUnicode=true:使用编码格式
                characterEncoding=UTF-8: 编码格式是UTF-8
                &amp:连接符 转义字符 &
                serverTimezone=Asia/Shanghai; 使用亚洲上海时区
                不要使用UTC
                allowPublicKeyRetrieval=true: 使用密钥 使用公钥 只有mysql8.0以上才有
                -->
                <property name="url" value="jdbc:mysql:///mybatis?userSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>
            </dataSource>
        </environment>
    </environments>

<!--    配置映射器 作用:是用来写SQL语句
        resource: 表示映射文件存放在什么位置
        -->

    <mappers>
<!--        表示使用配置文件的方式加载CRUD-->
        <mapper resource="com/atguigu/dao/UserDao.xml"></mapper>
<!--        使用全注解的方式实现CRUD-->

    </mappers>
</configuration>

创建dao

package com.atguigu.dao;
import com.atguigu.pojo.User;
import java.util.List;

public interface UserDao {

    /**
     * 查询所有
     */
    List<User> findAll();
}

配置sql的映射文件

<?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.dao.UserDao 设置全限定名 实际上就是dao的完整路径
-->

<mapper namespace="com.atguigu.dao.UserDao">

<!--    id:表示唯一标识符 这个标识符需要跟类里面的方法名保持一致-->
<!--    resultType:叫做返回值的类型 返回值的类型 如果是集合 写的是集合封装的对象-->
    <select id="findAll" resultType="com.atguigu.pojo.User">
        select * from user
    </select>
</mapper>

测试代码

package com.atguigu;

import com.atguigu.dao.UserDao;
import com.atguigu.pojo.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.Test;

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

public class MybatisTest {

    @Test
    public void testFindAll() throws IOException {
        // 1.读取配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 2.根据配置文件构建会话工厂
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.读取配置文件里面的io流
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 5.通过会话工厂 获取userDao对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 6.调用userDao里面的findall方法
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);

        }
    }
}

使用注解的方式

1 需要删除配置文件

在这里插入图片描述

2 修改mybatis的核心配置文件

<mappers>
        <!--表示使用配置文件的方式加载CRUD-->
        <!--<mapper resource="com/atguigu/dao/UserDao.xml"></mapper>-->
        <!--使用全注解的方式实现CRUD-->
        <mapper class="com.atguigu.dao.UserDao"></mapper>
    </mappers>

3 在userdao这个类身上添加我们需要的注解

public interface UserDao {
    /**
     * 查询所有
     */
    @Select("select * from user")
    List<User> findAll();
}

插入数据

UserDao

    /**
     * 添加数据
     */
    void insert(User user);
<?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.dao.UserDao 设置全限定名 实际上就是dao的完整路径
-->

<mapper namespace="com.atguigu.dao.UserDao">
    <!--配置添加操作后 获取插入数据的id
    新增用户后,同时还要返回当前新增用户的id值, 因为id是由数据库的自动增长来实现的
    所以就相当于我们要在新增后将自动增长 auto_increment的值返回-->
    <!--        实现方式一 在 标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。-->
<!--    <insert id="insert" parameterType="com.atguigu.pojo.User" useGeneratedKeys="true" keyProperty="id">-->

<!--            insert into user(username,password) values(#{username}, #{password});-->
<!--    </insert>-->

    <!--        第二种实现方式:
            selectKey: 表示查询主键
            keyProperty="id":表示类的属性id
            keyColumn="id": 表示主键id
            resultType="int":主键的返回值类型是int
            order="AFTER": 表示执行顺序
            select last_insert_id(): 固定的语法 插入之后 查询id-->
            <insert id="insert" parameterType="com.atguigu.pojo.User">
                <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
                    select last_insert_id()
                </selectKey>
                insert into user(username, password) values(#{username}, #{password})
            </insert>


<!--   id:表示唯一标识符 这个标识符需要跟类里面的方法名保持一致-->
<!--    resultType:叫做返回值的类型 返回值的类型 如果是集合 写的是集合封装的对象-->
    <select id="findAll" resultType="com.atguigu.pojo.User">
        select * from user
    </select>
</mapper>

测试代码

package com.atguigu;

import com.atguigu.dao.UserDao;
import com.atguigu.pojo.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.Test;

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

public class MybatisTest {

//    ctrl + alt + f:抽取成员变量
    private SqlSession sqlSession;
    private UserDao userDao;
    private InputStream is;

    // 用于在测试方法执行之前执行
    @Before
    public void before() throws IOException {
        // 1.读取配置文件
        is = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 2.根据配置文件构建会话工厂
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.读取配置文件里面的io流
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取会话对象
        sqlSession = sqlSessionFactory.openSession();
        // 5.通过会话工厂 获取userDao对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    // 测试保存操作
    // 对MySQL数据库进行增、删、改操作需要提交事务 才能生效
    // 用于在测试方法执行之后执行
    @After
    public void after() throws IOException {
        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();
        is.close();

    }

    @Test
    public void testInsert(){
        // 添加数据
        User user = new User();
        user.setUsername("王安石");
        user.setPassword("123123");
        System.out.println("保存操作之前:" + user);  // 保存操作之前:User{id=null, username='王安石', password='123123'}
        userDao.insert(user);
        System.out.println("保存操作之后:" + user);  // 保存操作之后:User{id=53, username='王安石', password='123123'}


    }

    @Test
    public void testFindAll() throws IOException {
        // 1.读取配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 2.根据配置文件构建会话工厂
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.读取配置文件里面的io流
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 5.通过会话工厂 获取userDao对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 6.调用userDao里面的findall方法
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);

        }
    }
}

更新数据

UserDao

    /**
     * 更新数据
     */
    void update(User user);

UserDao.xml

 <update id="update" parameterType="com.atguigu.pojo.User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>

测试代码

	@Test
    public void testUpdate(){
        // 修改数据
        User user = new User();
        user.setId(42);
        user.setUsername("李清照");
        user.setPassword("111111");
        // 调用userDao的方法进行更新数据
        userDao.update(user);

    }

删除数据

UserDao

    /**
     * 删除数据
     */
    void delete(Integer userId);

UserDao.xml

    <delete id="delete" parameterType="com.atguigu.pojo.User">
        delete from user where id = #{id}
    </delete>

测试代码

    @Test
    public void testDelete(){
        // 调用userDao的方法根据id进行删除
        userDao.delete(45);
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值