[mybatis]mybatis笔记

最近在复习mybatis,把一些容易忘记的点记下来,供忘记时查阅。

  • 配置相关
<!-- 
1. 
    开启驼峰命名法映射(在mybatis全局配置文件中配置),
    比如数据库字段是user_name,entity的字段是userName,
    则返回这个entity的实体会被映射上该字段,也可以不配置这个属性,
    在查询时通过给列起别名和bean的属性名保持一致也可达到目的 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

<!-- 
2.
    jdbcType在使用oracle数据时,建议要在mapper文件中指定,如若不指定,
    当数据列插入null数据时,实际上mybatis会使用一个叫OTHER的enum类型,
    而oracle中无法识别这个类型(mysql可以识别),故会报异常,建议指定。
    或是在全局配置文件中配置jdbcTypeForNull属性,达到一劳永逸效果
-->
    <settings>
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
  • 小知识点
/** 
1.
    增删改的返回值,在xml中不能配置,其实Mybatis默认的支持四种增删改时的返回值,
分别为:
    Integer(返回受影响行数)、
    Long、
    Boolean(超过0行受影响行,返回true,否则false)、
    void,可以在dao的接口中直接声明返回值即可。 */
    
    public Integer addUser(User user);

    public Long deleteUserById(Integer id);

    public boolean updateUser(User user);

    public User findUserById(Integer id);
    

/** 
2.
    在一个参数时,mybatis是不会做特殊处理的,也就是说#{随便写},
但如果是多个参数,mybatis是会把param1...paramn做特殊的处理,
即使用这个区间的值封装成map,key就是param1-paramn,value就是传入的值,
所以推荐在声明dao接口时,对接口形参进行命名参数的指定,
即使用@Param("name"),指定参数名映射,此时的key则是使用@Param注解指定的值,而不再是param1-paramn。 */

    public User findUserByIdAndName(@Param("id") Integer id,@Param("name") String name);
    
    // 2.1 比如下面接口取值时则为id===>#{id},name===>#{param2},因为param2没有指定名称。
    public User findUserByIdAndName2(@Param("id") Integer id,@Param("name") String name);


    /** 2.2 如果是Collection(List、Set)类型或是数组,也会特殊处理,哪怕只有一个参数,也会把传入的list或者数组封装在map中。
        key:Collection===>#{collection},List===>#{list},Array===>#{array},故如若取下面接口List中第一个id,则#{list[0]} */

    public User getUserById(List<Integer> ids);

/** 
3.
    在使用POJO作为形参时,要注意POJO的字段是否与mapper文件里的一致,如若不一致,可以使用Map作为参数,在取值时,直接取实参map中传入的key即可。*/

    public findUserByMap(Map<String,Object> map);
/**
4.
    自定义Map的返回key类型,在dao接口上使用@MapKey("属性名")可以实现 */

    @MapKey("name")
    Map<String,User> findUserReturnMap();


  • mapper编写

 

<!--
1.
    查询返回List,则resultType="list中元素对象的类型",
    mybatis会自动封装一条条的记录到一个list里去。 
-->

    <select id="findAllUser" resultType="com.xxx.xxx.User">
        select * from user;
    </select>
    
    <!-- 1.1 则dao接口应声明为如下: -->
    
    List<User> findAllUser();

<!-- 
2.
    在两张表关联查询时,比如User这个实体类有一个字段是dept,
    而dept是一个实体类,dept这个实体类里又有deptName,返回结果该如何映射?
        1.使用resultMap的级联关联,dept.column
        2.使用association标签
-->

    <!-- 2.1示例-->
        <resultMap id="xxx" type="com.xxx.xxx.User">
            <id property="id" column="id" />
            <result property="userName" column="user_name" />
            <result property="dept.deptName" column="dept_name" />
        </resultMap>

    <!-- 2.2示例-->
       <resultMap id="xxx" type="com.xxx.xxx.User">
            <id property="id" column="id" />
            <result property="userName" column="user_name" />
            <association property="dept" javaType="com.xxx.xxx.User.dept">
                <result property="deptName" column="dept_name" />
            </association>
        </resultMap>

<!--
3.
    #{},${}和区别是,前者是在预编译时,后者是拼接字符串,
    例如select * from table where id =#{id},#{xx}只能用在参数后,可以防止sql注入
    而${}可以这样用:select * from ${table} where id=#{id},可以用在参数前,是拼接的字符串,
    有sql注入的风险。
-->

<!--
4.
    增删改时,返回自增主键的值,通过设置useGeneratedKeys="true",
    默认为false,并通过keyProperty="你要把自增主键的值赋给bean中的哪个字段",来实现 -->
    <insert id="xxx" parameterType="xxx.xxx.xxx" useGeneratedKeys="true" keyProperty="xxx">
        insert into xxx values(#{xxx})
    </insert>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值