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. java基础系列--Exception异常处理

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...

  2. es6的模块化编程

    es6的模块化编程 基本用法 es6 中新增了两个命令 export 和 import , export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能. 一个模块就是一个独 ...

  3. Memcached的安装与使用

    这一段折腾了下Memcached,有所收获吧,记录一下. 1.什么是Memcached memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memca ...

  4. 怎么在linux ubuntu 上的nginx 绑定域名

    前一篇介绍了,如果在ubuntu上运行nodejs,毕竟访问的时候都是用ip地址+端口号,但是上production 环境都需要域名的,IP地址当然不行 读过上一篇的朋友知道了,如果在upstart ...

  5. python中的模块,以及包的导入的总结

    模块导入的方式: 模块的概念:一个.py文件就称为一个模块 导入模块中函数的方式: 方式一:import  模块名 使用时:模块名.函数名() 方式二 :from 模块名 import  函数名 使用 ...

  6. 如何更换git托管

    有时候会遇到需要更换代码托管平台,从github,gitlab或者Bitbucket迁移到其它平台,过程中可能遇到不少问题,本文从是否保留历史提交记录两种需求出发,介绍一下基于git托管平台的迁移方法 ...

  7. matlab图片清晰度调整

    打开.fig文件后: 1.首先设置窗口中的文字大小和相关的图例 2.然后将窗口缩小到要在word中或者ppt中展示图片的大小(避免图片缩小减少清晰度) 3.调整横纵坐标说明,使得布局合理 4.点击Ei ...

  8. phpMyAdmin安装部署

    phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库.通过phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等.如果使用合适的工具, ...

  9. Java之IO流概述和File基本操作

    IO流图解 IO(in / out)流的分类 流向: 输入流  读取数据 输出流  写出数据 数据类型: 字节流 一个字节占8位, 以一个字节为单位读数据 八大数据类型所占字节数: byte(1), ...

  10. NlpirParser智能挖掘平台词性标注新算法

    词性标注是自然语言浅层理解的一个重要环节,它可帮助系统自动判定词语所属的语法范畴,为进一步处理提供更高层面的支持.词性标注主要任务是消除词性兼类歧义,对于新信息检测来说,它的实际意义还在于: (1)能 ...