Mybatis代理接口

理清mybatis中的#和$之间的区别:

#{}表示一个预处理对象,参数类型不定,是根据传入的参数类型来设定的。类似于JDBC中的占位符(?)。
特例使用,模糊查询:(针对oracle):
and username like concat(concat('%',#{username}),'%')
concat函数用于将两个字符串连接起来,形成一个单一的字符串。
采取$的方式传入参数,所有采取$的方式传入的参数都只是字符串(无论传入的是什么,都会当成字符串处理),潜在的危险就是SQL注入的问题。
and username like concat(concat('%',${value或字段名}),'%')

  #相当于是JDBC里的占位符(?),传进去的值可以设置其数据类型。会根据传入的数据类型自动加字符串的单引号或者不加单引号。预处理参数。可以防止SQL注入。
  $相当于是我们的JDBC里的字符串拼接。这里就相当于传入的就是一个字符串(不管传入什么样的数据类型,都是字符串)

动态SQL
使用动态SQL的目的,就是在SQL语句中加入对于数据的判断。根据传入的数据来形成SQL语句。
动态SQL语句的示例:
插入部分数据,获取主键值或ID(动态SQL):
要获取刚刚插入的主键列。一般都是针对数据库自增的列(包括通过oracle的序列自增的)。需要在插入的时候设定属性:

    <insert id="insertItem" parameterType="Company" keyColumn="COMPANYID"
        keyProperty="companyid" useGeneratedKeys="true">
        <!-- 动态SQL语句 -->
        <!-- prefix在内容前加上前缀,suffix在内容后加上后缀,prefixOberrides把首部的某些内容覆盖,suffixOverrides把尾部的某些内容覆盖 -->
        <trim prefix="insert into company(companyid," suffixOverrides=",">
            <if test="companyname!=null and companyname!=''">
                companyname,
            </if>
            <if test="address!=null and address!=''">
                address,
            </if>
        </trim>
        <trim prefix=") values(companyask.nextval," suffixOverrides="," suffix=")">
            <if test="companyname!=null and companyname!=''">
                #{companyname},
            </if>
            <if test="address!=null and address!=''">
                #{address},
            </if>
        </trim>
    </insert>

由于mybatis给我们提供了数据的增删改查的接口,把mybatis给我们提供的接口同我们自定义的方法进行整合。
代理模式开发Mapper接口开发,所有的mybatis的开发都是采取的是mapper接口代理。
首先定义一个通用的dao层操作接口:

public interface IDaoHotel<T> {
    int insertItem(T t);
    T getmodel(Object id);
    int updateItem(T t);
    int deleteItem(Object id);
    List<T> getlist(T t);
}

开发实现对于某张表的增删改查的实现接口(Mapper接口):

public interface UserInfoMapper extends IDaoHotel<UserInfo> {}

配置SQL文件,注意namespace,这个namespace必须是同实现的接口的限定名一致:

<?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">
<!--namespace表示这个配置文件代理的是哪个接口 -->
<mapper namespace="com.jinglin.hotelsup.dao.imp.UserInfoMapper">
    <insert id="insertItem" keyColumn="userid" keyProperty="userid" useGeneratedKeys="true"  parameterType="UserInfo">
       insert into userinfo(userid,username,userpwd,card,job)
       values(userseq.nextval,#{username},#{userpwd},#{card},#{job})
    </insert>
</mapper>

编写测试这个mapper代理接口是否成功?

@Test
    public void testit(){
        SqlSession sqlSession = sessionFactory.openSession();
        //代理的接口
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);
        UserInfo userinfo = new UserInfo();
        userinfo.setCard("222");
        userinfo.setJob("softer1");
        userinfo.setUsername("zhangsan51");
        userinfo.setUserpwd("678");
        int result= userInfoMapper.insertItem(userinfo);
        sqlSession.commit();
        sqlSession.close();
        System.out.println("受影响的行数:"+result);
        System.out.println("刚刚插入的主键:"+userinfo.getUserid());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值