理清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());
}