Mybatis映射原理,动态SQL,log4j
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的更多相关文章
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL
1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...
- Mybatis映射文件动态SQL语句-02
foreach UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...
- MyBatis框架之SQL映射和动态SQL
使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBatis专注于SQL,对于开发人员来说也是极大限度的进行SQL调优,以保证性能.下面是SQ ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
随机推荐
- 了解Java基础原理
Java 是1995年SUN公司推出的一门高级编程语言,是面向互联网的语言,WEB应用程序首选的语言(安卓底层,大数据hadoop框架用java编写,Spark用Scala编写,Scala用java写 ...
- 集群之mysql主从配置(windows和linux版)
起因 由于网站进一步开发运行的需求,要求主机7*24小时运行正常,同时要求能够防止数据库灾难.考虑到后期的开发程度和业务量,准备向高可用系统进行改变,同时通过负载均衡提高网络性能.于是第一步就考虑到了 ...
- 使用JDBC技术连接数据库(附源码)--JAVA的简单应用
一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- 时间标签DateTime
1:DateTime类型初始化: DateTime date=new DateTime(2017,01,19,18,23,00);//此内部对应年,月,日,时,分,秒 Console.WriteLin ...
- pick定理详解
一.概念 假设P的内部有I(P)个格点,边界上有B(P)个格点,则P的面积A(P)为:A(P)=I(P)+B(P)/2-1. 二.说明 Pick定理主要是计算格点多边形(定点全是格点的不自交图形)P的 ...
- JSP和El表达式和JSTL标签库使用
核心标签库: <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...
- struts2相关简单介绍
一 Struts2环境配置 1.准备jar包,核心jar包有: 2.创建Struts2项目并导入jar包 3.在Struts2项目中src下创建Struts.xml配置文件 4.在Web.xml文件中 ...
- 关于Wifi室内定位应用中的一些问题:
公司目前在办公室内布设了一套室内定位的实验环境,用的是华为路由器,采用的算法是基于信号强度的RSSI算法.公司目前希望能使用这套设备得到无线网络覆盖范围下的所有移动设备(对应每个人)的MAC地址,同时 ...
- 安徽省2016“京胜杯”程序设计大赛_F_吃在工大
吃在工大 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 51 Accepted: 15 Description ...