1.理清mybatis中的#和$之间的区别?
#{ }:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的。
类似于JDBC中的?
特例使用,模糊查询:(针对oracle):
and username like concat(concat(‘%‘,#{username}),‘%‘)
采取的$的方式传入参数,所有采取$的方式传入的参数都只是字符串(无论传入的是什么,都会当成字符串处理),潜在的危险就是SQL注入的问题。
and username like ‘%${value}%‘
注意:$和#之间的区别?
#相当于是在jdbc里的?,传进去的值可以设置其数据类型。会根据传入的数据类型自动加字符串的单引号或者不加单引号。预处理参数。可以防止SQL注入。
$相当于是我们的JDBC里的字符串拼接。这里就相当于传入的就是一个字符串(不管传入什么样的数据类型,都是字符串)
2.插入语句:
要获取刚刚插入的主键列。一般都是针对数据库自增的列(包括通过oracle的序列自增的)。
需要在插入的时候设定属性:
<insert id="insertItem" keyColumn="userid" keyProperty="userid" useGeneratedKeys="true" parameterType="com.jinglin.hotelsup.model.UserInfo"> insert into userinfo(userid,username,userpwd,card,job) values(userseq.nextval,#{username},#{userpwd},#{card},#{job}) </insert>
3.mybatis的原理图:
由于mybatis给我们提供了数据的增删改查的接口,把mybatis给我们提供的接口同我们自定义的方法进行整合。
代理模式开发Mapper接口开发,所有的mybatis的开发都是采取的是mapper接口代理。
首先定义一个通用的dao层操作接口:
package com.jinglin.hotelsup.dao; import java.util.List; 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接口):
package com.jinglin.hotelsup.dao.imp; import com.jinglin.hotelsup.dao.IDaoHotel; import com.jinglin.hotelsup.model.UserInfo; 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()); }
4.动态SQL
使用动态SQL的目的,就是在SQL语句中加入对于数据的判断。根据传入的数据来形成SQL语句。
动态SQL语句的示例:插入部分数据:
<insert id="insertItem" keyColumn="userid" keyProperty="userid" useGeneratedKeys="true" parameterType="UserInfo"> insert into userinfo <trim prefix="(userid," suffixOverrides=","> <if test="username!=null"> username, </if> <if test="userpwd!=null"> userpwd, </if> <if test="card!=null"> card, </if> <if test="job!=null"> job, </if> </trim> <trim prefix=")values(userseq.nextval," suffixOverrides=","> <if test="username!=null"> #{username}, </if> <if test="userpwd!=null"> #{userpwd}, </if> <if test="card!=null"> #{card}, </if> <if test="job!=null"> #{job}, </if> </trim> ) </insert>
查询部分数据:
<select id="getlist" parameterType="UserInfo" resultType="UserInfo"> select * from userinfo where del=‘N‘ <if test="username!=null and username!=‘‘"> and username =#{username} </if> <if test="userpwd!=null and userpwd!=‘‘"> and userpwd =#{userpwd} </if> <if test="card!=null and card!=‘‘"> and card=#{card} </if> <if test="job!=null and job!=‘‘"> and job=#{job} </if> </select>
5.如何在控制台输出mybatis所执行的SQL语句:
配置log4j.properties:
将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句
log4j.rootLogger=debug,stdout,logfile
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 把日志信息输出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=D:/test.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
###显示SQL语句部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
需要在mybatis-config.xml里做一个配置,要让mybatis知道有log4j的存在
<settings> <!-- 通过日志记录显示mybatis的执行过程 --> <setting name="logImpl" value="LOG4J"/> </settings>