14:40:00

继续补充上次mybatis

UserMapper 接口

package cn.ttx.dao;

import cn.ttx.pojo.User;

import java.util.List;

public interface UserMapper {
    //    查询所有
    List<User> findAll();
}

使用xml 注解(我使用插件自动)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.ttx.dao.UserMapper">
    <select id="findAll" resultType="cn.ttx.pojo.User">
        select * from t_user
    </select>
</mapper>

当实体类的字段名跟数据库字段名不一样的时候,你需要用到resultMap 或者重新定义字段名(个人建议:能一样尽量一样)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ttx.dao.UserMapper">
    <!--
    定义映射
        id:映射的名字
        type:实体类
    -->
    <resultMap id="userResn.ttxultMap" type="User">
        <!--
        定义字段映射,id和result标签分别表示主键字段映射和非主键字段映射
            property    实体类中的属性名
            column      SQL返回结果的列名
            如果property和cloumn的值相同,可以省略
        -->
<!--        <id property="id" column="id"/>-->
        <result property="userName" column="user_name"/>
<!--        <result property="birthday" column="birthday"/>-->
<!--        <result property="sex" column="sex"/>-->
        <result property="homeAddress" column="home_address"/>
    </resultMap>
    <select id="selectAll" resultMap="userResultMap">
        select * from t_user
    </select>
</mapper>

关于自增主键

    <!--####################插入后获取ID方案一-->
    <insert id="insert01">
        <!--
        resultType:主键的类型
        keyProperty:实体类中的主键字段
        order: AFTER表示SQL操作完成以后获取ID
        -->
        <selectKey resultType="int" keyProperty="id" order="AFTER" >
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO t_user(id,user_name,birthday, sex,home_address)
        VALUES (null, #{userName}, #{birthday}, #{sex}, #{homeAddress})
    </insert>
    
    <!--####################插入后获取ID方案二-->
    <!--
        useGeneratedKeys:自动生成主键ID
        keyProperty: 实体类中主键的属性名
    -->
    <insert id="insert02" useGeneratedKeys="true" keyProperty="id" >
        INSERT INTO t_user(id,user_name,birthday, sex,home_address)
        VALUES (null, #{userName}, #{birthday}, #{sex}, #{homeAddress})
    </insert>

关于 #{}, ${} 的区别

1.使用#传入参数是,sql语句解析变量时候将添加""包裹变量,当成字符串来解析,$则不会用""包裹;
2.#能使用PreparedStatement语句提高一定的效率;
3.#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的;
4.如果要做动态的排序,动态查询某个字段比如 order by column,这个时候务必要用${},select * from table order by 'name' ,这样是没用
5.从安全角度出发,能用#就不要用$;

 

动态SQL

<!-- 
参考https://mybatis.org/mybatis-3/dynamic-sql.html
if/where标签
if/set标签
foreach标签
sql/include标签
-->

 

关于复杂映射

1. 一对一, association标签
2. 一对多, collection标签

注意: resultMap和association都需要指定所有字段的映射,不能省略
     SQL查询的结果集中不能有重复的字段,如果有重复字段,则映射过程中只有第一个字段可以取到正确的值,所以需要给名称重复的字段使用别名。

关于级联查询

association或者collection 标签里面有select 属性,select  子查询,
一个select标签的id column指定参数传递,格式(我知道的)为'参数名=传值给子查询字段'

关于注解开发(对于一些简单的查询,可以使用注解,但是稍微复杂点的,建议还是xml)

@Select(value="select * from t_user where id = #{id}")
User selectById(@Param("id") Integer id);

 

目前个人整理的mybatis 资料就这些,哈哈,如果面试需要,请百度搜索mybatis 面试题目

 

版权声明:本文为gary-ttx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gary-ttx/p/14357957.html