1.理清mybatis中的#和$之间的区别?
#{ }:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的。
类似于JDBC中的?
特例使用,模糊查询:(针对oracle):
and username like concat(concat('%',#{username}),'%')
采取的$的方式传入参数,所有采取$的方式传入的参数都只是字符串(无论传入的是什么,都会当成字符串处理),潜在的危险就是SQL注入的问题。
and username like '%${value}%'
注意:$和#之间的区别?
#相当于是在jdbc里的?,传进去的值可以设置其数据类型。会根据传入的数据类型自动加字符串的单引号或者不加单引号。预处理参数。可以防止SQL注入。
$相当于是我们的JDBC里的字符串拼接。这里就相当于传入的就是一个字符串(不管传入什么样的数据类型,都是字符串)
2.插入语句:
要获取刚刚插入的主键列。一般都是针对数据库自增的列(包括通过oracle的序列自增的)。
需要在插入的时候设定属性:
insert into userinfo(userid,username,userpwd,card,job) values(userseq.nextval,#{username},#{userpwd},#{card},#{job})
3.mybatis的原理图:
由于mybatis给我们提供了数据的增删改查的接口,把mybatis给我们提供的接口同我们自定义的方法进行整合。
代理模式开发Mapper接口开发,所有的mybatis的开发都是采取的是mapper接口代理。
首先定义一个通用的dao层操作接口:
package com.jinglin.hotelsup.dao;import java.util.List;public interface IDaoHotel{ int insertItem(T t); T getmodel(Object id); int updateItem(T t); int deleteItem(Object id); List 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{}
配置SQL文件,注意namespace,这个namespace必须是同实现的接口的限定名一致:
insert into userinfo(userid,username,userpwd,card,job) values(userseq.nextval,#{username},#{userpwd},#{card},#{job})
编写测试这个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 into userinfo username, userpwd, card, job, ) #{username}, #{userpwd}, #{card}, #{job},
查询部分数据:
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的存在