MyBatis学习笔记

MyBatis

原生jdbc存在问题

1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库性能

解决------使用数据库连接池管理数据库连接。

2.将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译Java代码,不利于系统的维护。

解决------将sql语句配置在xml文件中。

3.向preparedStatement(可以防止sql注入)中设置参数,对占位符位置和设置参数值,硬编码,不利于系统维护。

解决------将sql语句配置在xml文件中。

4.从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。

解决------将查询的结果集,自动映射成Java对象。







#{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,#{}中可以写成value或其它名称。

#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。

${}接收输入参数,类型可以是简单类型,pojo、hashmap。

如果接收简单类型,${}中只能写成value。

${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。


mapper代理开发规范

编写mapper.xml映射文件

编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。


mapper接口方法参数只能有一个是否影响系统开发

系统框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。



resultMap 一对一

<resultMap id="OrdersUserResultMap" type="com.exam.examsystem.domain.Orders">

column:订单信息的唯一标识的列

property:订单信息的唯一标识列所映射到Orders中的对应属性-->

    <id column="id" property="id" />

<result column="userid" property="userId" />

<result column="number" property="number" />

association:用于映射关联查询单个对象的信息

javaType:将要关联查询的用户信息映射到Orders中的对应属性-->

    <association property="user" javaType="com.exam.examsystem.domain.User">

column:用户信息的唯一标识的列

property:用户信息的唯一标识列所映射到User中的对应属性-->

        <id column="id" property="id" />

<result column="username" property="userName" />

<result column="sex" property="sex" />

</association>

</resultMap>

resultMap 一对多

<resultMap id="UserRoleResultMap" type="com.exam.examsystem.domain.User">

        <id column="id" property="id" />

        <result column="user_name" property="userName" />

        <result column="sex" property="sex" />

        <!--配置一对多 -->

        <collection property="roles" ofType="com.exam.examsystem.domain.Role">

            <id column="role_id" property="id" />

            <result column="role_name" property="roleName" />

        </collection>

    </resultMap>



resultMap总结

resultType:

作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:

作用:

将关联查询信息映射到一个pojo对象中。

场合:

为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

collection:

作用:

将关联查询信息映射到一个list集合中。

场合:

为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

如果使用resultType无法将查询结果映射到list集合中。



















1.映射文件:xxxMapper.xml

配置sql语句

<mapper namespace="test">        输入                  输出

<select id = "findUserById" parameterType = "int" resultType="类的全限定名">

select * from USER where i =#{id}

</select>

</mapper>

2.SqlMapConfig.xml中加载xxxMapper.xml

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近学习MyBatis这个轻量型持久层框架,感觉入门很简单,但是深层次细节配置很多。本篇笔记从 配置文件->例子入...
    Super超人阅读 3,868评论 0 1
  • 《小吴同学的Mybatis学习之路》点击此处查看完整项目 1.Mybatis_01_HelloWorld接口式编程...
    吴里庆庆阅读 2,688评论 0 0
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,211评论 0 4
  • 《深入浅出MyBatis技术原理与实战》2016年版本 读书笔记 第一章 MyBatis简介 1.ORM模型:对象...
    GunnerAha阅读 3,593评论 0 3
  • 1.1mybatis下载 mybaits 的代码由github.com 管理,地址:https://github....
    暖熊熊阅读 4,350评论 0 5

友情链接更多精彩内容