写点什么

MyBatis(一、快速入门)

作者:
  • 2022 年 8 月 13 日
    河南
  • 本文字数:5607 字

    阅读完需:约 18 分钟

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");//获得statementPreparedStatement 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.serPassword(resultSet.getString("password"));  //user实体封装完毕  System.out.printLn(user);}//释放资源resultSet.close();statement.close();connection.close();
复制代码


  • 插入数据


//模拟实体对象User user = new User();user.setId(2);user.setUsername("tom");user,setPassword("123");
//注册驱动Class.forName("com.mysql.jdbc.Driver");//获得连接Connection connection = DriverManager.getConnection("jdbc:mysql:///test","root","root");//获得statementPreparedStatement statement = connection.prepareStatement("insert into user(id,username,password)values(?,?,?)");//设置占位符参数statement.setInt(1,user.getId());statement.setString(2,user.getUsername());statement.setString(3,user.getPassword());
//执行更新操作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 password;
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 getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
@Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; }}
复制代码


④ 编写映射文件 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="password" value="${jdbc.password}"/> </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},#{password})    </insert>
复制代码


@Test    //插入操作    public void test2() throws IOException {
//模拟user对象 User user = new User(); user.setUsername("xxx"); user.setPassword("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},password=#{password} where id=#{id}    </update>
复制代码


@Test    //修改操作    public void test3() throws IOException {
//模拟user对象 User user = new User(); user.setId(7); user.setUsername("lucy"); user.setPassword("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.Driverjdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=xmpkj
复制代码


     <!--通过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>
复制代码

6、MyBatis 相应 API

发布于: 刚刚阅读数: 3
用户头像

关注

在校大三学生一枚 2022.08.02 加入

喜欢学习编程,擅长技术栈JAVA

评论

发布
暂无评论
MyBatis(一、快速入门)_开源_斯_InfoQ写作社区