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>

Mybatis映射原理,动态SQL,log4j的更多相关文章

  1. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  2. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

  3. Mybatis映射文件动态SQL语句-02

    foreach UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  4. MyBatis框架之SQL映射和动态SQL

    使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...

  5. 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql

    一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...

  6. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  7. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  8. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  9. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

随机推荐

  1. 增强for循环赋值

    增强for循环赋值 代码如下: double[] testList01 = new double[5]; java.util.Scanner sc = new java.util.Scanner(Sy ...

  2. Tomcat启动中的一些问题

    (a)在eclipse中启动tomcat,在控制台加载的配置却是其他项目的,有时候也不是自己工作空间里的? 出现的一个原因是:在我tomcat的webapp目录下,我放了一个其他项目的war包,在to ...

  3. linux下查看jdk路径

    jdk安装后 centos中: 执行 rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac' 命令确定, 执行后会输出一个路径,除去路径末尾的 &qu ...

  4. 将java对象转成json字符串

    如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...

  5. (转)sql通配符

    背景:一次搞清sql查询中的通配符问题. 1 sql通配符 通配符主要以下几种:%._.[].[^] . 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE ...

  6. plsql 数据迁移——导出表结构,表数据,表序号

    场景:项目开发完之后要部署在不同的环境进行测试,这时候就需要将数据库中的表结构,序号,数据进行迁移,这时候就需要能够熟练的使用plsql. 问题: 导出的表结构,在另一个数据库中无法导入 部分表的数据 ...

  7. (转)WebSphere MQ基础命令

    --查看MQ版本-- dspmqver --查看队列状态--dspmq --创建队列管理器--crtmqm -q ECIS_QM --删除队列管理器--dltmqm ECIS_QM --启动队列管理器 ...

  8. vue数据驱动作用域问题

    需求是这样的,如图 点击禁用后,变成启用,但是结果却不让人满意 我们先来看一下错误代码: //conponet控件里的内容 html内容: <div> <button @click. ...

  9. VerilogHDL常用的仿真知识

    在描述完电路之后,我们需要进行对代码进行验证,主要是进行功能验证.现在验证大多是基于UVM平台写的systemverilog,然而我并不会sv,不过我会使用verilog进行简单的验证,其实也就是所谓 ...

  10. 华为软件开发云对比Jenkins-JavaWeb项目持续部署方式

    一.前言:Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成和持续部署变成可能. 本文 ...