本篇主要介绍MyBaits的入门使用
目录
一、MyBatis是什么?
MyBatis是一个持久层框架,其目的是为了简化JDBC的使用。持久层的概念和"三层架构"中的"Dao"的含义一样,都是直接用于对数据库的操作,存储和管理数据。
二、MyBatis的使用
MyBatis的使用主要分为三个部分:
- 准备(建表,建实体类)
- 配置环境(引入Mybatis依赖,配置数据库连接信息)
- 编写sql并运行(注解/xml)
下面详细介绍一下这三个部分
准备
准备工作主要是建数据库,建表,建实体类这些操作。例如,在这里先test数据库:
然后在建好的数据库中创建一个userinfo表:
最后再根据userinfo的表结构创建好对应的实体类,准备工作就完成了。
配置环境
使用MyBatis需要引入两个依赖,一个为MyBatis 框架的依赖,另一个则是数据库驱动的依赖。具体如下:
然后我们需要在配置文件里配置数据库的连接信息:
这样一来,MyBatis所需的基本环境就已经配置好了。
ps:我们还可以配置打印MyBatis的日志信息,具体配置为:
配置完打印日志后,每通过MyBatis执行一次sql,都能通过日志
编写sql
在MyBatis中有两种编写sql的方式,一种是使用注解,一种是使用xml。
注解方式
查询操作
使用注解写sql的方式非常简单,直接在注解中编写即可。持久层代码通常在Mapper包下编写,因此我们先创建一个Mapper包,然后在包中创建一个接口,并在接口上加上@Mapper(MyBatis会自动创建一个该接口的实现类(代理对象)并将该对象交给Spring容器管理),这里我们创建UserInfoMapper接口,在接口中定义操作数据库的方法,然后在这个方法上加上Mybatis提供的注解,这里以@Select为例,这个注解可以让我们执行查询操作,然后再往注解里写具体sql即可,具体如下:
通过这个方法就可以执行查询操作,并且会把查询的每一行数据封装到一个UserInfo对象中(字段对应对象中的属性来进行赋值),然后再将这个对象放到一个依据返回值类型创建的集合里(这里是List),然后返回这个集合。
接下来我们测试一下这个方法,直接右键要测试的方法所在类,然后点击生成,点击Test
在这里勾选要测试的方法。
在这里编写测试代码即可
具体测试代码如下:
然后我们来执行一下selectUser(这里事先添加了一条数据)
我事先添加的数据已经被查询到了 。
ps:我们还可以配置打印MyBatis的日志信息,具体配置为:
配置完打印日志后,每通过MyBatis执行一次sql,都能通过日志 看到sql的具体执行情况。
配置完后的日志信息具体如下:
通过日志信息可以发现,配置完后多了具体执行的sql,字段名称及其数值,查到数据行数等信息。
前面我们写的sql是不用参数的,如果我们要写有参数的sql怎么办呢?
下面我们来写一个根据id查询用户的方法:
在MyBatis中sql通过#{}的方式来获取方法中传来的参数 ,如果需要传的参数只有一个,#{}里包含的通常是方法中参数的名称,如果有多个,第一个参数只能通过#{param1}来获得,第二个参数则只能通过#{param2}来获得,以此内推。我们也可以对参数起别名,起完别名后则只能通过#{别名}来获得。起别名的方式是加@Param注解。具体如下:
插入操作
接下来我们再来看一下如何写执行插入操作的方法。通过@Select我们不难推测出,执行什么操作就使用该操作关键字的注解,因此,要执行插入操作,就得加@Insert。但要注意的是,插入的时候我们要往sql语句中传很多字段的值,这样写起来太麻烦了,因此我们可以将方法的参数设置为对象,然后sql再根据#{对象属性名}的方式去获得数值,具体如下:
这里的返回值为insert操作影响的行数。
下面我们来测试一下addUser():
通过mysql可以查到这里新建的用户已经被成功添加了。
并且通过打印的日志信息也可以发现,影响的行数也已经成功获取到了
在插入数据时,id通常是由数据库自动生成的(自增主键) ,我们要去获得这个新插入的数据的id就得去数据库里重新查,这样就会显得十分麻烦。下面介绍一种方法,通过这种方法可以直接将自动生成的id赋值给方法的对象参数。具体如下:
在加了@Insert的方法上再添加@Options注解,然后将useGeneratedKeys设为true(是否获取主键id),然后再将keyProperty设置成要接收主键id的属性。具体代码如下:
然后我们测试一下:
通过日志可以发现主键被成功获得了
剩下的修改和删除操作也和这里介绍的操作一样,只要在方法上加上关键字对应的注解即可。如果要往sql里传参数,也和这里介绍的方式一样,这里不再过多介绍了。
xml方式
创建xml文件
使用xml方式来编写sql会sql相对麻烦一点,使用xml需要添加一个配置,并且创建xml文件。添加的配置具体如下:
其含义为xml文件的存放发位置以及xml文件的名称格式。
在创建xml文件必须严格按照配置的路径和名称格式,不然xml文件无法被MyBatis识别,从而不能发挥作用。
xml文件需在Resource目录下,然后根据配置的信息创建,具体如下:
创建mapper文件
创建xml文件,这里创建UserInfoMapper.xml。创建好的xml文件需要引入一段代码进行初始化,具体如下
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="com.example.demo.Mapper.UserInfoMapper">
</mapper>
其中namespace表示命名空间,即加了@Mapper的接口的位置,这里为前面定义的UserInfoMapper所在位置(必须为全限定名称,即包含全包名,类名)。
查询操作
如果我们要编写查询的sql,只需添加select标签,具体如下:
其中id表示 要执行sql的方法的名称(代表接口中的方法的具体实现),resultType为返回类型(实体类)
标签里为具体要执行的sql。
下面我们来测试一下。(注意测试前需要删掉前面所写的注解,不然两种编写sql的方式来实现同一个方法会冲突报错,另外要注意的是注解和xml能够共存,前提是实现不同方法)
通过日志可以发现通过xml编写sql的方式也能成功执行。
如果要往sql里传参数,使用注解和使用xml是一样的,都是使用#{},并且针对不同类型,不同数量的参数获取方式也是一样的。因此直接将前面注解里编写的sql复制到xml中也是可以执行的。
例如,编写一下前面的selectUserById方法
sql是直接复制的,注解已经删除。
接着测试一下,通过日志可以发现 成功执行了
插入操作
在xml中也可以在执行插入操作时获取自增主键,只需要将前面写在注解里的两个参数写在对应的标签里即可:
测试一下可以发现获取主键的插入操作和前面使用注解的方式一样都能执行成功
xml中的修改和删除操作就不再过多介绍了,和在注解里一样,只需修改sql,并将标签名改为对应的标签名即可。