什么是MyBatis-程序员宅基地

技术标签: spring  java  Powered by 金山文档  mybatis  数据库  

一、MyBatis概述

1.1 原始的JDBC操作

谈及mybatis,必然需要先了解Java和数据库的连接技术——JDBC(Java DataBase Connectivity)。但是原始JDBC操作中,却存在如下缺点

  1. 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能。

  1. sql语句在代码中硬编译,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变Java代码。

  1. 查询操作时,需要手动将结果集中的数据手动封装到实体中;插入操作时,需要手动将实体的数据设置到sql语句的占位符位置。

如下为原始JDBC操作:

public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
        //定义sql语句
        String sql = "select * from db1.emp";
        //获取执行sql的对象Statement
        Statement stmt = conn.createStatement();
        //执行sql
        ResultSet resultSet = stmt.executeQuery(sql);
        //处理结果
        while(resultSet.next()) {             
            int id = resultSet.getInt(1);                    //获取id
            String name = resultSet.getString("ename");             //获取姓名
            System.out.println("id:" + id + " name:" + name);
        }
        //释放资源
        stmt.close();
        conn.close();
    }
}

1.2 如何克服JDBC固有缺陷

而面对上述缺点,我们的解决方案是:

  1. 使用数据库连接池技术(C3P0或者Druid)初始化连接资源;

  1. 将sql语句抽取到xml配置文件中(解耦合);

  1. 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射(比较困难)。

因此,mybatis应运而生!

1.3 什么是MyBatis

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

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

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

二、MyBatis传统开发步骤

首先,我们可以先访问一下MyBatis官网地址:http://www.mybatis.org/mybatis-3/,这里有完整的mybatis的介绍。

2.1 添加MyBatis的坐标

把mysql和mybatis的坐标引入pom.xml中。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.32</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

2.2 创建一个实体

在项目下创建一个User.java的实体。

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 + '\'' +
                '}';
    }
}

2.3 编写映射文件

在文件夹resources下再创建一个mapper文件夹,再创建映射文件UserMapper.xml。后续我们的sql语句可以全部写到这里。

2.3.1先写一个通用的dtd约束头

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

2.3.2 再配置mapper

这里是select子句,当然也可以时insert、update等等。

<mapper namespace="userMapper">
    <select id="findAll" resultType="user">
        select * from db1.user
    </select>
</mapper>
  • namespace:命名空间。起名可以随意。例如使用时我们可以用userMapper.findAll来使用对应的select语句。

  • resultType:结果类型。从数据库查询到的数据封装到哪个位置。例如我们这里的select子句查询到的结果要封装到User实体集中,但是这里用user而不适用domain.User是因为在接下来的核心配置文件SqlMapConfig.xml中我们通过typeAliases标签将domain.User更名为user。

注意:这里必须先要有一个user数据库表。

2.4 编写核心文件

2.4.1 核心配置文件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"/>
    <!--自定义别名-->
    <typeAliases>
        <typeAlias type="domain.User" alias="user"/>
    </typeAliases>
    <!--数据源环境-->
    <environments default="developement">
        <environment id="developement">
            <transactionManager type="JDBC"/>
            <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="mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  • typeAliases:设置类型别名。比如这里我们使用自己定义的user更换本来的domain.User。所以在UserMapper.xml中我们就可以把sql语句中的resultType字段写成“user”。但是mybatis本身也为我们提供了一些别名来方便简写,如下:

别名

数据类型

string

java.lang.String

long

java.lang.Long

java

java.lang.Integer

double

java.lang.Double

boolean

java.lang.Boolean

而后期我们在执行更新操作时,就可以直接使用parameterType="int" 而不是 parameterType="java.lang.Integer",比如:

<update id="update" parameterType="int">
update user set username=#{username},password=#{password} where id=#{id}
</update>
  • transactionManager:事务管理器。取值有两种,JDBC和MANAGED,这里我们使用JDBC。

  • dataSource:数据源。取值有三种,UNPOOLED、POOLED和JNDI,这里我们使用POOLED,利用“池”的概念将 JDBC 连接对象组织起来。

  • property:配置数据库连接池的属性。这里使用了jdbc.properties来简化书写,当然也可以直接写。

  • mappers:用来加载映射,加载方式有如下几种:

• 使用相对于类路径的资源引用,例如:

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

2.4.2 配置文件jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.username=root
jdbc.password=root

2.5 测试

2.5.1 编写测试代码

/**
 * 查询
 * @throws IOException
 */
@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();
}
  • SqlSessionFactoryBuilder :工厂构建器。通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象 。

  • SqlSessionFactory:工厂对象 ,用来创建sql会话。openSession( )会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提 交该事务,更新操作数据才会持久化到数据库中 。如果里面传一个参数为true,那么不需要手动提交事务(更新操作中sqlSession.commit()方法就不需要写了)。

  • SqlSession :会话对象。执行接下来的增删改查操作。

2.5.2 代码要点

这里我们可以看到,查询数据的一段java代码为:

List<User> userList = sqlSession.selectList("userMapper.findAll");

而这句代码中sqlSession.selectList的参数即我们刚才在UserMapper.xml 中写的代码:

<mapper namespace="userMapper">
    <select id="findAll" resultType="user">
        select * from db1.user
    </select>
</mapper>

同理,我们也可以同样得到添加数据、修改数据和删除数据类似的代码:

  • 添加数据:

sqlSession.insert("userMapper.add", user);
<insert id="add" parameterType="快速入门.User">
insert into user values(#{id},#{username},#{password})
</insert>
  • 修改数据

sqlSession.update("userMapper.update", user);
<update id="update" parameterType="快速入门.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
  • 删除数据

sqlSession.delete("userMapper.delete",3);
<delete id="delete" parameterType="快速入门.User">
delete from user where id=#{id}
</delete>

2.5.3 输出结果

执行编写好的代码,可以看到输出结果:

上面被选中的输出语句为:

[User{id=1, username='zhangsan', password='123'}, User{id=2, username='lisi', password='234'}, User{id=5, username='wangwu', password='abc'}, User{id=6, username='ray', password='111'}]

而我们再看一下数据库当中的数据,判断是否输出正常:

这里我们可以看到,一共4条数据,数据库中的数据已经被我们成功查找到。

三、总结

原来直接使用JDBC的sql代码被我们写入到了映射文件UserMapper.xml中,后续一些动态sql的加入更加简化了xml中代码量的书写。

而在Java代码中,我们只需要新建一些SqlSession对象便可以将xml中的sql语句直接使用。耦合度大大降低

但是我们也不难发现,这样的配置还是相对复杂的,因此就有了后来的MyBatisPlus来更加简化我们的代码书写。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51418964/article/details/128696139

智能推荐

R语言使用rnbinom函数生成符合负二项分布的随机数、使用plot函数可视化符合负二项分布的随机数(Negative binomial distribution)_r语言中怎么生成服从负二项分布的随机数-程序员宅基地

文章浏览阅读1.2k次,点赞12次,收藏11次。R语言使用rnbinom函数生成符合负二项分布的随机数、使用plot函数可视化符合负二项分布的随机数(Negative binomial distribution)_r语言中怎么生成服从负二项分布的随机数

基于Arduino的foc控制1——开环速度控制——有事随缘更新中_arduino foc-程序员宅基地

文章浏览阅读348次。【代码】Arduino编写foc控制。_arduino foc

android移动开发软件安装,android studio 开发的安卓软件怎么安装到手机上-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏16次。android studio 开发中如何让运用运行在真机中。大体实现方式有3种:分别是:真机通过usb插到电脑上进行开发。android studio 上面编写程序进行编译apk版本,通过其他助手或者adb命令推送到手机中运行。通过wifi连接android studio把编写好的程序运行到真机上。【原理】让运用运行到真机中,需要usb数据线,安装android sdk,一个手机,所有的方案都是通..._android studio怎么样让app出现在手机傻瓜

Mybatis Plus的@TableId标签_mybatisplus tableid-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏21次。这个注释主要用于对应数据库表的实体类中的主键属性。写法:@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)例如:@TableId(value=“user_id”,type = IdType.AUTO )IdType的六种类型类型解释AUTO数据库自增IDNONE数据库未设置主键类型(将会跟随全局)INPUT用户输入ID(该类型可以通过自己注册自动填充插件进行填充)ID_WORKER默认的全局唯一ID (idWor_mybatisplus tableid

JavaScript中的map()和sort()方法_js map sort-程序员宅基地

文章浏览阅读2.1k次。JavaScript中的map()和sort()方法_js map sort

小目标检测文章阅读_小目标检测模型-程序员宅基地

文章浏览阅读1.4k次。无人机上目标检测的特点:1、图像特点 在多数情况下,无人机的拍摄视野很大,包含丰富的视觉内容,虽然它提供了更全面的场景信息。缺点: 1)但是待检测的目标对象通常在图像中占比较小,且没有足够的检测细节; 2)目标的外观和结构质量都很差,容易与噪声混淆(大视场、小目标引起); 学术论文,主要内容为遥感图像飞机检测。 难点:由于遥感图像的成像时段以及环境条件不一,可见光遥感平台的分辨率、相机F数、飞行高度、视角等参量各有不同,待检测的飞机目标型_小目标检测模型

随便推点

Android 11 selinux 权限设置_android sepolicy private public-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏19次。快速阅读框架SELinux介绍看Android怎么写?如何确认是SELinux 约束引起?怎么抓取SELinux Log?修改之后,怎么快速验证?怎么从log中提取有效信息?重点介绍参考文档架构从上层到驱动层的调用流程,但是我们重点关注sContext:注:file_contexts //系统中所有file_contexts安全上下文seapp_contexts //app安全上下文property_contexts //属_android sepolicy private public

常见的文件格式有哪些_常见文件格式类型-程序员宅基地

文章浏览阅读9.3k次,点赞14次,收藏36次。AAAC:MPGE-4高级音频编码ACC:苹果设备的专属音乐格式ACE:Ace压缩档案格式ACT:Microsoft office助手文件AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式ANI:Windows系统中的动画光标APK:AndroidPackage /Android(安卓)安装包,APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装APS_常见文件格式类型

大数据之Hadoop图解概述-程序员宅基地

文章浏览阅读2w次,点赞72次,收藏263次。文章目录1 Hadoop是什么2 Hadoop 发展历史(了解)3 Hadoop 三大发行版本(了解)3.1 Apache Hadoop(常用)3.2 Cloudera Hadoop3.3 Hortonworks Hadoop4 Hadoop 优势(4 高)5 Hadoop 组成(面试重点)5.1 HDFS 架构概述5.2 YARN 架构概述5.3 MapReduce 架构概述5.4 HDFS、YARN、MapReduce 三者关系6 大数据技术生态体系7 推荐系统框架图1 Hadoop是什么1)Had_hadoop

sts(myeclipse)引入外部项目后无法启动项目_下载了sts工具后,我其他项目运行不了是什么原因啊?-程序员宅基地

文章浏览阅读2.1k次。 今天遇到一个问题,在使用dubbo服务调用多个注册中心的方法时一直启动不了项目,报错日志无限刷其中引用了两个dubbo注册中心,报错本以为是因为引用的错误,最终排查发现只有项目引入不能直接使用其中的接口还需要在Deployment Assembly中引入该项目为jar包才行..._下载了sts工具后,我其他项目运行不了是什么原因啊?

【Resnet最强变体】ResNeSt学习笔记 --- ResNeSt: Split-Attention Networks_变体resnest-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏76次。代码:https://github.com/zhanghang1989/ResNeSt论文:https://hangzhang.org/files/resnest.pdf尽管图像分类模型最近不断发展,但是由于其简单而模块化的结构,大多数下游应用程序(例如目标检测和语义分割)仍将ResNet变体用作backbone。ResNeSt展示了一个简单的模块:Split-Attention,该块可实现跨..._变体resnest

html让spry菜单栏居中,Float 菜单水平居中简单方法-程序员宅基地

文章浏览阅读937次。body{font-family:Verdana,Arial,sans-serif;font-size:12px;margin:120px auto;text-align:center;}ul{margin:0;padding:0;list-style:none;}#navigation{display:inline-block;padding:20px;border:solid 1px red;..._怎么让spry导航条居中

推荐文章

热门文章

相关标签