zoukankan      html  css  js  c++  java
  • mybatis_01简介

    1.1 MyBatis

      MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

      MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

      对jdbc的封装框架有哪些:Hibernate,dbutils,jdbcTemplate[spring],mybatis

      原理:Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

    1.2 MyBatis的框架核心

    1、  mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的 信息。

    2、  mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory即会话工厂。

    3、  通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。

    4、  SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)

    5、  Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括HashMap集合对象、POJO对象类型

    1.3mybatis使用步骤:

      1、  创建PO(model)类,根据需求创建;

      2、  创建全局配置文件SqlMapConfig.xml;

      3、  编写映射文件;

      4、  加载映射文件,在SqlMapConfig.xml中进行加载;

      5、  编写测试程序,即编写Java代码,连接并操作数据库。

               思路:

          a)         读取配置文件;

          b)         通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

          c)         通过SqlSessionFactory创建SqlSession。

          d)         调用SqlSession的操作数据库方法。

          e)         关闭SqlSession。

    1.4需要的jar包

        asm-3.3.1.jar

        cglib-2.2.2.jar

        commons-logging-1.1.1.jar

        javassist-3.17.1-GA.jar

        log4j-1.2.17.jar

        log4j-api-2.0-rc1.jar

        log4j-core-2.0-rc1.jar

        mybatis-3.2.7.jar

        mysql-connector-java-5.1.7-bin.jar

        slf4j-api-1.7.5.jar

        slf4j-log4j12-1.7.5.jar

    1.5个人小结

      通过学习,科普了一下SQL注入是怎么回事

      SQL注入:

      所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

    1.6 案例

      创建完成项目后会导入文件log4j.properties,这是和jar包相对应的日志文件

      

      Mybatis使用的日志包是log4j的,所以需要添加log4j.properties。

      在classpath下创建log4j.properties如下:   

    # Global logging configuration
    
    log4j.rootLogger=DEBUG, stdout
    
    # Console output...
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

      映射文件User.xml,命名和实体类一样

    <?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:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离
       注意:使用mapper代理开发时,namespace有特殊且重要的作用
     -->
    <mapper namespace="User">
        <!--
            [id]:statement的id,要求在命名空间内唯一
            [parameterType]:入参的java类型
            [resultType]:查询出的单条结果集对应的java类型
            [#{}]: 表示一个占位符?
            [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义
         -->
        <select id="findUserById" parameterType="int" resultType="com.ahd.model.User">
            SELECT * FROM USER WHERE id = #{id}
        </select>
    
        <!--模糊查询
        [${}]:表示拼接SQL字符串
          [${value}]:表示要拼接的是简单类型参数。
           注意:
          1、如果参数为简单类型时,${}里面的参数名称必须为value,string内有getValue方法
          2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
        -->
        <select id="findUserByName" parameterType="String" resultType="com.ahd.model.User">
            SELECT * FROM USER WHERE username LIKE '%${value}%'
        </select>
    
        <!--插入-->
        <insert id="insertUser" parameterType="com.ahd.model.User" >
            INSERT INTO user (username,sex,birthday,address)
            VALUE (#{username},#{sex},#{birthday},#{address})
        </insert>
    
        <!--更新-->
        <update id="updateUser" parameterType="com.ahd.model.User">
            UPDATE  user SET  sex=#{sex},address=#{address}
            WHERE  username=#{username}
        </update>
    
        <!--删除-->
        <delete id="deleteUserbyID" parameterType="int" >
            DELETE  FROM user
            WHERE  id=#{id}
        </delete>
    
        </mapper>

       src目录下配置文件SqlMapConfig.xml,将User.xml配置进来

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
            <!-- 配置mybatis的环境信息 -->
        <environments default="development">
            <environment id="development">
    
                <!-- 配置JDBC事务控制,由mybatis进行管理 -->
                <transactionManager type="JDBC"></transactionManager>
                <!-- 配置数据源,采用dbcp连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
                    <property name="username" value="${name}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--<mapper resource="com/gyf/sqlmap/User.xml"></mapper>-->
    
            <!--第一种:写映射文件的名字-->
            <mapper resource="com/ahd/sqlmap/User.xml"></mapper>
            <!--第二种:写类名,一定要有个映射文件与之对应
            如果没有,那么在UserMapper要声明注解-->
            <!--<mapper class="com.gyf.mapper.UserMapper"></mapper>-->
    
            <!--第三种:可以写包名-->
            <!--<package name="com.gyf.mapper"></package>-->
        </mappers>
    </configuration>

      实体类User

      User.java

      测试文件:Demo01

    package com.ahd.Test;
    
    import com.ahd.model.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class Demo01 {
        @Test
        public void test() throws IOException {
    //        a)   读取配置文件;
            InputStream is= Resources.getResourceAsStream("SqlMapConfig.xml");
    //        b)   通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。
            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
    //        c)   通过SqlSessionFactory创建SqlSession。
            SqlSession sqlSession= ssf.openSession();
    //        d)   调用SqlSession的操作数据库方法。
    //        User user= sqlSession.selectOne("findUserById",10);
    //        System.out.println(user);
            List<User> list=sqlSession.selectList("findUserByName","张");
            for(User user:list){
                System.out.println(user);
            }
    //        e)   关闭SqlSession。
            sqlSession.commit();
        }
    }

       

  • 相关阅读:
    建模时选择SVM还是LR?
    decision_function详解
    HIVE SQL与SQL的区别
    数据不平衡如何处理
    Spring Boot 两步集成 日志收集ELK与分布式系统监控CAT
    Web Application Integrate with Box
    字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)
    SharePoint Client Api Search user 几种方法
    C#,反射和直接调用的效率差别
    System.Data.SqlClient.SqlConnectionStringBuilder 链接字符串的问题
  • 原文地址:https://www.cnblogs.com/aihuadung/p/10457471.html
Copyright © 2011-2022 走看看