码迷,mamicode.com
首页 > 数据库 > 详细

Mybatis映射原理,动态SQL,log4j

时间:2017-08-27 17:04:41      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:问题   9.png   动态sql   set   app   pac   pattern   erp   一个   

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

标签:问题   9.png   动态sql   set   app   pac   pattern   erp   一个   

原文地址:http://www.cnblogs.com/ljljava/p/7440647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!