Mybatis代理接口

来源:互联网 发布:js 短路求值 编辑:程序博客网 时间:2024/06/06 03:53

理清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 mapperPUBLIC "-//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());    }
原创粉丝点击