• Mybatis 点点滴滴


    相比 Hibernate ,Mybatis 实在是学习门槛低多了。

    1 . 类属性和表字段的自动对应

         当向数据库中插入一行数据时,<insert>标签中的占位符#{}中的占位符的值写 model 类的属性名,但是要保证数据库中的字段名和属性名要一致,属性可以多余数据表的字段,但是不能少。这也是约定高于配置。

    <!-- 添加用户 -->
        <insert id="insertUser" parameterType="com.msym.beans.User">
              <!-- 添加用户之前查询到自增主键的最大值,这里 order属性指定的是‘after’,
                   则得到的是这个插入语句的主键 -->
            <selectKey keyProperty="id" resultType="Integer" order="AFTER">
                select LAST_INSERT_ID()
            </selectKey>
            insert into user (username,birthday,address,sex) 
            values (#{username},#{birthday},#{address},#{sex})
        </insert>

    User 类的属性:

    private static final long serialVersionUID = 1L;
        private Integer id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址

    但是当类属性和表字段有不匹配的情况时,就需要使用到 resultMap 属性了,比如将 User 类的 Id 属性修改为 userId,

    private static final long serialVersionUID = 1L;
        private Integer userId;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址

    如果是单表查询,只需要写上不同的就行,其余的属性还是会自动对应上,如果是多表查询,就不能省略了,每个属性都要手动映射,如果没有手动写上映射关系,将得到的是 null 值。

    <resultMap type="User" id="user">
           <result column="id" property="userId"/>
    </resultMap>
        
    <select id="selectUserList" resultMap="user">
           SELECT id, username, sex, birthday, address FROM user 
    </select>

    2 . 自动获取自增主键

          在第一点中,添加用户时,在<insert>标签中还有一个标签<selectKey>标签,这个标签用户获取当前插入数据的主键值,比如 user 表中的主键 id 是自增长的 int 类型,因为采用的数据库是 mysql ,在 mysql 中 int 类型自增主键是先插入数据,然后生成主键,所以在 order 属性中填写的是 after,而不是 before,如果使用的数据库是 oracle ,就得使用 before,因为 oracle 采用的策略是先生成自增主键,然后在插入数据。

    这样配置后,之前添加到数据库中的对象就具有了主键了,可以操作其他关联到的表了。

    3 . 注册 mapper.xml 文件使用到的两个标签

          在使用 Mapper 动态代理实现 Dao 层时,对于注册 XxxMapper.xml 文件有多种方式,也就是在 sqlMapperConfig.xml 文件中在 <mappers>标签中进行注册。一共有如下四种方式注册:

    <!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
        <mappers>
    <!--     第一种:    <mapper resource="sqlmap/UserMapper.xml"/> -->
    <!--     第二种:    <mapper class="com.msym.dao.UserMapper"/> -->
    <!--     第三种:    <mapper url="" /> -->
    <!--     第四种:—> <package name="com.msym.dao"/>
        </mappers>

    第一种:用的比较自由,指出 XxxMapper.xml 资源文件的路径即可,

    第二种:填写的是class属性,指出的是 XxxMapper.xml 对应的XxxMapper.java 文件的包路径

    第三种:需要指出 XxxMapper.xml 资源文件的绝对路径

    第四种:采用包名的形式,注册指出的包下所有的 mapper 接口。

    注意:第二种和第四种有个严格的要求,要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

    最后推荐使用第四种。

    4 . 动态 sql 拼装 (标签:if、where、foreach)

            因为不能确定用户输入参数个数,当进行多条件查询,就需要写多个重载的方法,这时就需要 <if> 标签,进行条件判断,如下代码:

    <!-- 根据多条件查询用户 -->
    <select id="queryUserByWhere" parameterType="user" resultType="user">
        SELECT id, username, birthday, sex, address FROM `user`
        WHERE 1=1 <!-- 这里的 1=1 是为了防止用户没有输入性别,导致 sql 异常 -->
        <if test="sex != null and sex != ''">
            AND sex = #{sex}
        </if>
        <if test="username != null and username != ''">
            AND username LIKE %${username}%'
        </if>
    </select>

          上面的 1=1 会显得比较麻烦,下面代码使用了 <where> 标签,代替了 1=1,并且在没有输入性别参数时,where标签会将 username 前的 AND 去掉,避免了 sql 异常。【如果将 sex 中的 AND写在了后面,就会出问题了,所以一定要写在条件语句的前面】

    <!-- 根据条件查询用户 -->
    <select id="queryUserByWhere" parameterType="user" resultType="user">
        SELECT id, username, birthday, sex, address FROM `user`
    <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
        <where>
            <if test="sex != null">
                AND sex = #{sex}
            </if>
            <if test="username != null and username != ''">
                AND username LIKE
                '%${username}%'
            </if>
        </where>
    </select>

     

    5 . sql 代码片段(减少代码量)

    写的 sql 语句中大部分都是重复的部分, 比如 【select * from XXX】,这时就需要使用 sql 代码片段来减少编码量了。

    <sql id="selectorUser">
        select * from user
    </sql>
    <!-- 通过ID查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="User">
        <include refid="selectorUser"/>
        where id = #{v}
    </select>

    在引入时需要使用到 <include> 标签。

     

    6 .

  • 相关阅读:
    重温 JSP 与 Servlet
    Web/Java Web项目如何模块化?没有正文,别点
    Struts2 In Action笔记_页面到动作的数据流入和流出
    SQL小知识_长期总结
    Java代码工具箱_用Set给List/Vector去重
    Oracle小知识_长期总结
    样式缩写——css技巧(一)
    CSS中强大的EM
    人生苦短,我用python!
    15个超级实用的jQuery插件
  • 原文地址:https://www.cnblogs.com/daimajun/p/7076867.html
Copyright © 2020-2023  润新知