Mybatis入门实践

一、简介:

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回

二、框架原理:

 

框架介绍

1、 mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

三、入门:

3.1 引入maven依赖:

<dependency> 
<groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
  <version>3.4.5</version> 
  </dependency>

3.2 编写pojo user实体类:

import java.sql.Timestamp;
import java.util.Date;
public class UserTest  {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    private String time;
    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "UserTest [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}

3.2 sql表demo 设计:

创建表:

CREATE TABLE user (
id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
username varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
sex varchar(1023) NOT NULL DEFAULT '' COMMENT '性别',
birthday date NOT NULL,
address varchar(1023) NOT NULL DEFAULT '',
time datetime(6) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=681 DEFAULT CHARSET=utf8 COMMENT='用户demo'

插入数据:

INSERT INTO user VALUES (1,'ming','男','1995-02-02','四川成都','2022-05-10 08:00:02.509511'),(2,'ming2','女','1992-02-02','四川',NULL),(3,'小强','2','2023-03-07','sadfsafsafs',NULL),(678,'小小','1','2023-03-07','西安市',NULL),(679,'小强','2','2023-03-07','sadfsafsafs',NULL),(680,'小强','男','2023-03-07','四川',NULL);

3.4编写配置文件:

在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml。它是mybatis核心配置文件,配置文件内容为数据源、事务管理。

配置环境:

  • 配置mysql的环境:

  • 配置事务的类型

  • 配置连接池:

  • 配置连接数据库的4个基本信息

  • 指定映射配置文件的位置

 

<?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>
    <!--   配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"/>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/case_manager?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

3.5 编写映射文件 UserDao.xml 

  此文件是映射步骤3 mapper resourece中的配置路径

<?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:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <!-- 通过Id查询一个用户   -->
    <select id="findUserById" parameterType="Integer" resultType="UserTest">
        select * from user where id = #{v}
    </select>
    <select id="findUserByUsername" parameterType="String" resultType="UserTest">
        select * from user where username like #{username}
    </select>
    <select id="findUserByTime" parameterType="Object" resultType="UserTest">
        select * from user where time = #{v}
    </select>
    <!--  添加用户  -->
    <insert id="insertUser" parameterType="UserTest">
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user (username,birthday,address,sex) values(#{username},#{birthday},#{address},#{sex})
    </insert>
    <!-- 更新用户 -->
    <update id="updateUserById" parameterType="UserTest">
        update user set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}
        where id = #{id}
    </update>
    <!-- 删除用户   -->
    <delete id="deleteUserById" parameterType="Integer">
        delete from user
        where id = #{vvvvv}
    </delete>
</mapper>

3.6.编写测试类

  1. 加载核心配置文件SqlMapConfig.xml

  2. 创建SqlSessionFactoryBuilder对象

  3. 创建SqlSessionFactory对象

  4. 创建SqlSession对象

  5. 执行SqlSession对象执行查询,获取结果User

  6. 打印结果

  7. 释放资源

示例代码如下:

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.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

public class MybatisTest {
    //通过Id查询一个用户
    @Test(enabled = false)
    public void testSearchById()  {
        //1.读取配置文件
        InputStream in = null;
        SqlSession session = null;
        try {
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.创建SqlSessionFactory工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            //3.使用工厂生产SqlSession对象
             session = sqlSessionFactory.openSession();
            //4.执行Sql语句
            UserTest user = session.selectOne("test.findUserById", 1);
            //5. 打印结果
            System.out.println(user.getUsername());
            //6.释放资源
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            assert session != null;
            session.close();
            assert in!=null;
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //根据用户名模糊查询用户列表
    @Test()
    public void testFindUserByUsername() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行Sql语句
//        List<UserTest> list = session.selectList("test.findUserByUsername", "王");
        UserTest user  = session.selectOne("test.findUserById",1);
        System.out.println(user.getTime());
        //5. 打印结果
//        for (UserTest user:list) {
//            System.out.println(user);
//        }
        //6.释放资源
        session.close();
        in.close();
    }

    //添加用户
    @Test(enabled = false)
    public void testInsertUser() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        UserTest user = new UserTest();
        user.setUsername("小强");
        user.setBirthday(new Date());
        user.setAddress("四川");
        user.setSex("男");
        sqlSession.insert("test.insertUser", user);
        sqlSession.commit();
        //5. 打印结果
        // 刚保存用户,此时用户ID需要返回。执行完上面insert程序后,此时就能知道用户的ID是多少
        // 需要在User.xml文件中配置
        System.out.println("插入id:"+ user.getId());//插入id:30
        //6.释放资源
        sqlSession.close();
        in.close();
    }
    //更新用户
    @Test()
    public void testUpdateUserById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        UserTest user = new UserTest();
        user.setId(678);
        user.setUsername("小小");
        user.setBirthday(new Date());
        user.setAddress("西安市");
        user.setSex("1");
        int i = sqlSession.insert("test.updateUserById", user);
        sqlSession.commit();
        //5. 打印结果
        System.out.println(user.getId());
        //6.释放资源
        sqlSession.close();
        in.close();
    }
    //删除用户
    @Test(enabled =false)
    public void testDeleteUserById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        int i = sqlSession.insert("test.deleteUserById", 32);
        sqlSession.commit();
        //5. 打印结果
        System.out.println(i);
        //6.释放资源
        sqlSession.close();
        in.close();
    }
}

四、详解参数

  • namespace  :用来区别不同的类的名字

  • id:标识映射文件中的sql,称为statement的id将sql语句封装到mappedStatement对象中,所以将id称为statement的id

  • parameterType :指定输入参数的类型

  • resultType :指定输出结果类型。mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中

  • #{}: 一个占位符。preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

  • ${}:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

使用 JDBC 意味着需要更多的代码来提取结果并将它们映射到对象实例中,而这就是 MyBatis 节省你时间的地方.

  • namespace  :用来区别不同的类的名字

  • id:标识映射文件中的sql,称为statement的id将sql语句封装到mappedStatement对象中,所以将id称为statement的id

  • parameterType :指定输入参数的类型

  • resultType :指定输出结果类型。mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中

  • #{}: 一个占位符。preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

  • ${}:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

使用 JDBC 意味着需要更多的代码来提取结果并将它们映射到对象实例中,而这就是 MyBatis 节省你时间的地方.

执行插入操作时,保存成功,但是id=0,需要解决id返回不正常的问题。如果刚保存用户,此时用户ID需要返回。执行完上面insert程序后,此时就能知道用户的ID是多少,需要在插入之前补充语句:

  • <selectKey keyProperty="id" resultType="Integer" order="AFTER"> 
    select LAST_INSERT_ID()   
    </selectKey>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值