Mybatis基于动态代理实现CRUD

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

注:讲解写在代码里了

配置文件

<?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>
    <typeAliases>
        <package name="com.cztcode.mybatis"/> 
 <!--在包中寻找所需的类,Mapper中不用写全称-->
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--  mysql的驱动,这里注意JDK1.6以上使用cj版本的驱动-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!-- schema_person是模式名,cj版本的驱动必须提前设置好时区-->
                <property name="url" value="jdbc:mysql://localhost:3306/schema_person?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1qazxsw2"/>
            </dataSource>
        </environment>
    </environments>
<!--   在mapper文件中寻找语句映射-->
    <mappers>
        <mapper resource="PersonMapper.xml"/>
    </mappers>
</configuration>

这里定义一下对象类包的别名

 <typeAliases>
        <package name="com.cztcode.mybatis"/> 
 <!--在包中寻找所需的类,Mapper中不用写全称-->
    </typeAliases>

这里映射文件是PersonMapper.xml,与配置文件在同一目录下。注意如果是IDEA放在recourses文件夹下

项目结构

PersonMapper.xml配置

MyBatis有自动映射的功能,会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。但也可以手动映射。

手动映射:

比如,我们有一个User类:

@Data
public class User {
    private String id;
    private String username;
    private String password;
    private String address;
    private String email;
}

如果数据库中表的字段与User类的属性名称一致,我们就可以使用resultType来返回。

<select id="getUsers" resultType="User">
	SELECT
		u.id,
		u.username,
		u.password,
		u.address,
		u.email
	FROM
		USER u
</select>

当然,这是理想状态下,属性和字段名都完全一致的情况。但事实上,不一致的情况是有的,这时候我们的resultMap就要登场了。

如果User类保持不变,但SQL语句发生了变化,将id改成了uid

<select id="getUsers" resultType="User">
	SELECT
		u.id as uid,
		u.username,
		u.password,
		u.address,
		u.email
	FROM
		USER u
</select>

那么,在结果集中,我们将会丢失id数据。这时候我们就可以定义一个resultMap,来映射不一样的字段。

<resultMap id="getUserByIdMap" type="User">
	<result property="id" column="uid"></result>
</resultMap>

然后,我们把上面的select语句中的resultType修改为resultMap="getUserByIdMap"

这里面column对应的是数据库的列名或别名;property对应的是结果集的字段或属性。

定义Mapper接口类

这种方式和用全限定名调用 Java 对象的方法类似。这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。不费吹灰之力地在对应的映射器接口调用方法。

使用Mapper接口映射有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果IDEA插件有代码补全功能,那么代码补全可以帮你快速选择到映射好的 SQL 语句。

正确的顺序为,先写出Mapper的接口类。通过插件自动生成xml文件,超级方便!除此之外还可以实现快速跳转。

调用映射接口实现数据库查询

生成一个mapper,这里使用Reader读取字符文件或者InPutStream读取字节文件都可以,毕竟xml文件是一个文本文件。

我们需要得到一个session(事务),通过事务的提交来完成数据库的更改。

数据库信息

在数据库里先定义两条信息

用动态代理的方式很方便,直接使用mapper.方法 即可实现对数据库的操作

通过ID查询Person

就两句话

Person person=mapper.queryPersonById(1);
System.out.println(person.toString());

输出结果

不要忘记我们之前定义的查询语句

是不是很简洁!!

查询全部Person

这里需要注意,返回值都是单个对象。如果查询到多个结果需要保存在List中。但是ResultType还是单个对象(数据库表名也是Person)

接口返回值是List类型

查询方式和结果

添加对象

不要忘记commit

执行结果

注意的问题

如果mybatis字段和mysql关键字冲突,在mybatis中操作时需要加上反引号-就是键盘Esc键下面的的那个。

mybatis的parameterType可以不写

不但是可以不写,而且不推荐写(虽然上面的例子里我写了)。

为什么不写parameterType也可以运行成功? 因为mybatis能自动识别,但返回值类型不能不写,插件自动生成的xml文件也不包括parameterType。

MyBatis传入多个参数

Mybatis是可以传入多个参数的,这里我使用@param注解的方式。可以由IDEA自动生成。注意要是传入多个参数必须添加注解,否则mybatis会报错。

传入两个参数

xml文件

发表评论