Blog of CodeJELLOW’S ENGINEERING NOTES
← 返回文章

Mybatis基于动态代理实现CRUD

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

本文目录 ⌄

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

    注:讲解写在代码里了

    配置文件

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

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

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

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

    项目结构

    PersonMapper.xml配置

    图片暂不可用。

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

    手动映射:

    比如,我们有一个User类:

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

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

    TEXT
    <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。

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

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

    TEXT
    <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

    就两句话

    TEXT
    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文件

    通过 RSS 订阅更新 →