• 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>
  • 相关阅读:
    寒假生活
    VS2010调试时修改代码 调试时源文件与模块生成时的文件不同
    如何在VS VC 中DLL使用CString类
    SVChost执行原理学习
    error LNK2001: unresolved external symbol __imp__PathFileExistsA@4
    visual studio 2010 遇到了异常,可能是由某个扩展导致的...
    C++运算各版本学习
    寒江独钓-键盘过滤学习2修改IDT + IOAPIC重定位表截获PS2键盘中断
    寒江独钓-键盘过滤学习1传统型的键盘过滤
    ObReferenceObjectByName 函数解析
  • 原文地址:https://www.cnblogs.com/ljljava/p/7440647.html
Copyright © 2020-2023  润新知