MyBatis(一、快速入门)

发布于:2023-01-28 ⋅ 阅读:(738) ⋅ 点赞:(0)

作者:大三的土狗

专栏:SSM 框架
在这里插入图片描述


1、MyBatis的简介

1)什么是 MyBatis?

​ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

​ mybatis 是一个优秀的基于java的持久层框架,它内部封装了 jdbc,使开发者只需要关注sql语句本身,而不需要花费精力 去处理加载驱动、创建连接、创建statement等繁杂的过程。

​ mybatis通过xml或注解的方式将要执行的各种 statement配 置起来,并通过java对象和statement中sql的动态参数进行 映射生成最终执行的sql语句。

​ 最后mybatis框架执行sql并将结果映射为java对象并返回。采 用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了 封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

​ mybatis官网:https://mybatis.org/mybatis-3/zh/index.html

在这里插入图片描述

2)原始jdbc操作

  • 查询数据
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
Connection connection = DriverManger.getConnection("jdbc:mysql:///test,"root","root");
//获得statement
PreparedStatement statement = connection.prepareStatement("select * from user");
//执行查询
ResultSet resultSet = statement.executeQuery();
//遍历结果集
while(resultSet.next()){
	//封装实体
	User user = new User();
	user.setId(resultSet.getInt("id"));
	user.setUsername(resultSet.getString("username"));
	user.serPasswords(resultSet.getString("passwords"));
	//user实体封装完毕
	System.out.printLn(user);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
  • 插入数据
//模拟实体对象
User user = new User();
user.setId(2);
user.setUsername("tom");
user,setPasswords("123");

//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///test","root","root");
//获得statement
PreparedStatement statement = connection.prepareStatement("insert into user(id,username,passwords)values(?,?,?)");
//设置占位符参数
statement.setInt(1,user.getId());
statement.setString(2,user.getUsername());
statement.setString(3,user.getPasswords());

//执行更新操作
statement.executeUpdate();

//释放资源
statement.close();
connection.close();

3)存在的问题及解决方案

原始jdbc开发存在的问题如下:

  • 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
  • sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
  • 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位 符位置

应对上述问题给出的解决方案:

  • 使用数据库连接池初始化连接资源
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

2、 MyBatis的快速入门

MyBatis开发步骤:

① 添加MyBatis的坐标

将下面的依赖代码置于 pom.xml 文件中:

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

mysql坐标:

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

② 创建user数据表

在这里插入图片描述

③ 编写User实体类

public class User {

    private int id;
    private String username;
    private String passwords;

    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 getPasswords() {
        return passwords;
    }

    public void setPasswords(String passwords) {
        this.passwords = passwords;
    }

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

④ 编写映射文件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">
<mapper namespace="userMapper">

    <!--查询操作-->
    <select id="findAll" resultType="user">
        select * from user
    </select>
    
</mapper>

⑤ 编写核心文件SqlMapConfig.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>

    <!--通过properties标签加载外部properties文件-->
    <properties resource="jdbc.properties"></properties>

    <!--自定义别名-->
    <typeAliases>
        <typeAlias type="com.xmp.domain.User" alias="user"></typeAlias>
    </typeAliases>

    <!--数据源环境-->
    <environments default="developement">
        <environment id="developement">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="passwords" value="${jdbc.passwords}"/>
            </dataSource>
        </environment>
    </environments>
    

    <!--加载映射文件-->
    <mappers>
        <mapper resource="com/xmp/mapper/UserMapper.xml"></mapper>
    </mappers>

</configuration>

⑥ 编写测试类

 @Test
    //查询操作
    public void test1() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session回话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作  参数:namespace+id
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        //打印数据
        System.out.println(userList);
        //释放资源
        sqlSession.close();
    }

在这里插入图片描述

3、MyBatis的映射文件概述

在这里插入图片描述

4、MyBatis的增删改查操作

4.1 插入数据操作

	<!--插入操作-->
    <insert id="save" parameterType="com.xmp.domain.User">
        insert into user values(#{id},#{username},#{passwords})
    </insert>
@Test
    //插入操作
    public void test2() throws IOException {

        //模拟user对象
        User user = new User();
        user.setUsername("xxx");
        user.setPasswords("abc");

        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session回话对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //执行操作  参数:namespace+id
        sqlSession.insert("userMapper.save",user);

        //mybatis执行更新操作  提交事务
        //sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

4.2 删除数据操作

 	<!--删除操作-->
    <delete id="delete" parameterType="int">
        delete from user where id=#{abc}
    </delete>
   @Test
    //删除操作
    public void test4() throws IOException {

        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session回话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作  参数:namespace+id
        sqlSession.delete("userMapper.delete",8);

        //mybatis执行更新操作  提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

4.3 修改数据操作

	<!--修改操作-->
    <update id="update" parameterType="com.xmp.domain.User">
        update user set username=#{username},passwords=#{passwords} where id=#{id}
    </update>
@Test
    //修改操作
    public void test3() throws IOException {

        //模拟user对象
        User user = new User();
        user.setId(7);
        user.setUsername("lucy");
        user.setPasswords("123");

        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session回话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作  参数:namespace+id
        sqlSession.update("userMapper.update",user);

        //mybatis执行更新操作  提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

4.4 查询数据操作

	<!--根据id进行查询-->
    <select id="findById" resultType="user" parameterType="int">
        select * from user where id=#{id}
    </select>
 @Test
    //查询一个对象
    public void test5() throws IOException {
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session回话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行操作  参数:namespace+id
        User user = sqlSession.selectOne("userMapper.findById", 1);
        //打印数据
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

5、MyBatis核心配置文件概述

1)核心配置文件层级关系

configuration配置

  • ​ properties 属性

  • ​ srttings 设置

  • ​ typeAliases 类型别名

  • ​ typeHandlers 类型处理器

  • ​ objectFactory 对象工厂

  • ​ plugins 插件

  • ​ environments 环境

    • environment 环境变量

      ​ transactionManager 事务管理器

    ​ dataSource 数据源

  • ​ databaseldProvider 数据库厂商表识

  • ​ mappers 映射器

2)常用配置解析

1、environments标签

​ 数据库环境的配置,支持多环境配置

在这里插入图片描述

2、 mapper标签

​ 该标签的作用是加载映射的,加载方式有如下几种:

  • 使用相对于类路径的资源引用,例如: < mapper resource=“org/mybatis/builder/AuthorMapper.xml”/ >
  • 使用完全限定资源定位符(URL),例如: < mapper url=“file:///var/mappers/AuthorMapper.xml”/ >
  • 使用映射器接口实现类的完全限定类名,例如:< mapper class=“org.mybatis.builder.AuthorMapper”/ >
  • 将包内的映射器接口实现全部注册为映射器,例如:< package name=“org.mybatis.builder”/ >

3、Properties标签

​ 实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.passwords=root
   	<!--通过properties标签加载外部properties文件-->
    <properties resource="jdbc.properties"></properties>
   	
   	<!--数据源环境-->
    <environments default="developement">
        <environment id="developement">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

网站公告

今日签到

点亮在社区的每一天
去签到