美文网首页
MyBatis学习笔记

MyBatis学习笔记

作者: KlingelModerat | 来源:发表于2019-04-12 16:59 被阅读0次

    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

    相关文章

      网友评论

          本文标题:MyBatis学习笔记

          本文链接:https://www.haomeiwen.com/subject/pokduqtx.html