MyBatis学习笔记

2019-04-12  本文已影响0人  KlingelModerat

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

上一篇下一篇

猜你喜欢

热点阅读