博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis映射原理,动态SQL,log4j
阅读量:4947 次
发布时间:2019-06-11

本文共 4066 字,大约阅读时间需要 13 分钟。

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的存在

 

 

转载于:https://www.cnblogs.com/ljljava/p/7440647.html

你可能感兴趣的文章
iOS中的#import和class区别
查看>>
节约内存,请使用标签页管理工具:onetab、better onetab
查看>>
jQuery中的事件与动画
查看>>
页面加载骨架
查看>>
关于android系统不关屏设置
查看>>
SONY VPCS138EC降级安装XP
查看>>
[luogu4201][bzoj1063]设计路线【树形DP】
查看>>
手机抓包-手机劫持域名到指定服务器
查看>>
被放逐的皇后 金建云
查看>>
Javascript 有用参考函数
查看>>
点群的判别(三)
查看>>
GNSS 使用DFT算法 能量损耗仿真
查看>>
网页抓取 总结
查看>>
【vue】vue中v-charts的使用
查看>>
【转】Simulink模型架构指导
查看>>
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
arm:启动代码判断是从nand启动还是从norflash启动,拷贝程序到内存的过程
查看>>