欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mybatis_01简介

程序员文章站 2022-04-28 11:37:24
1.1 MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 MyBatis是一个优秀的持久层 ......

 

1.1 mybatis

  mybatis 本是的一个开源项目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

  mybatis_01简介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();
    }
}