Mybatis

作者: 金石_832e | 来源:发表于2019-05-23 18:01 被阅读0次

    Mybatis是SSM框架中的M。操作持久层,代替dao,hibernate。提供半自动数据查询。


    一.MyBatis的框架原理(掌握)

    Mybatis是一个持久层的架构,是apache下的顶级项目。

    Mybatis原先是托管在googlecode下,再后来是托管在Github上。

    Mybatis让程序员将主要的精力放在sql上,通过Mybatis提供的映射方式,自由灵活生成(半自动,大部分需要程序员编写sql)满足需要sql语句。

    Mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活的映射成java对象。(输出映射)


    二.Mybatis框架

    mybatis架构图.jpg

    三.Mybatis简单应用(IDE:idea intellij)

    完成对数据库emp表的查询(查询一条,查询全部,条件查询)

    1.准备jar包(maven上自选版本)

    mybatis-3.4.6.jar(核心依赖)
    commons-logging-1.2.jar(日志)
    log4j-1.2.17.jar(日志)

    2.web-inf下创建lib文件夹,标记为resource root,将项目所需的依赖粘贴进去,并标记为library

    3.在工作空间下创建一个统一存放为配置的文件夹resources,并标记为resource root。

    ①.在resources建立一个连接数据库的db.properties

    jdbc.driverClassName = oracle.jdbc.driver.OracleDriver
    jdbc.url= jdbc:oracle:thin:@127.0.0.1:1521:orcl
    jdbc.username =  scott
    jdbc.password =  tiger
    
    

    ②.在resources建立一个log4j.properties文件,配置开发时运行日志相关内容,必须要知道有这个文件,但是文件内容对于小白来说可以不知道。

    # Global logging configuration
    #在开发环境日志级别要设置为DEBUG、生产环境要设置为INFO或者ERROR
    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
    

    ③在resources建立SqlMapConfig.xml文件,文件名称虽然随意,但是约定熟成,用mybatis操作数据库配置的文件名称都是这个。

    <?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>
        <!--  如果不配置db.properties,下面的连接池可直接定义driver,url,username,password  -->
        <properties resource="db.properties"></properties>  
        <!--打印SQL及结果-->
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
        <!--  包的类型别名,配置完后,该包下所有类的别名都默认是自己的类名  -->
        <typeAliases>
            <package name="com.zpwd.pojo"/>
            <!--    自定义单个包下其中的一个类的别名      -->
            <!--    <typeAlias type="com.zpwd.pojo.Emp" alias="Emp"></typeAlias>      -->
        </typeAliases>
        <!--数据源配置  这块用 Oracle数据库 -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="jdbc"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driverClassName}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--  mapper映射器,配置持久层的包(以前是dao,现在叫mapper,就是持久层) -->
        <!--    -->
        <mappers>
            <package name="com.zpwd.mapper"></package>
        </mappers>
    </configuration>
    

    注意点:

    • <properties resource="db.properties"></properties>调用的是db.properties文件,如果没有配置db.properties,可再下方driver,url,username,password 处填写真实的连接池。
    • <mappers>
      <package name="com.zpwd.mapper"></package>
      </mappers>
      指的是SqlMapConfig.xml配置的是哪个包下的文件,使配置文件和包进行连接。
    • <typeAliases>
      <package name="com.zpwd.pojo"/>
      </typeAliases>
      指的是SqlMapConfig.xml配置的是哪个包下mapper.xml文件中出现的类的所在包的路径,使用该种写法后,可以mapper.xml中不需写类名的全称(包名.类名)

    4.创建一个Java bean

    注意:类名称和属性一定要与数据库中的表名称和字段名称一一对应。
    自己补全getter() 、setter()方法(alt+insert)
    java bean代码

    package com.zpwd.pojo;
    
    import java.util.Date;
    
    public class Zpwd {
        private Integer empno;
        private String ename;
        private String job;
        private Integer mgr;
        private Date hiredate;
        private double sal;
        private double comm;
        private Integer deptno;
    }
    

    5.创建一个mapper包,该包可以认为是代替dao的包。

    dao模式:一个接口,一个实现类
    mapper:一个接口,一个对应的.xml文件(接口名和xml文件名称必须完全一致
    接口写的是查询规则,根据人员ID查询一条,查询全部数据,根据条件查询返回雇员信息集合
    !!!该框架下如果形参为两个以上的条件,必须使用对象,换句话说,不接受两个及以上的形参。
    ZpwdMapper.java

    public interface ZpwdMapper {
    
        Zpwd serchByEmpno(Integer empno);
    
        List<Zpwd> serchAll();
    
        List<Zpwd> serchByDeptnoSal(Zpwd zpwd);
    }
    

    ZpwdMapper.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">
    <mapper namespace="com.zpwd.mapper.ZpwdMapper">
        <select id="serchByEmpno" parameterType="Integer" resultType="Zpwd">
            select * from zpwd where empno = #{value}
        </select>
        <!--  返回值为list或set集合时,需要写泛型(与map不同)  -->
        <select id="serchAll" resultType="Zpwd">
            select * from zpwd
        </select>
        <select id="serchByDeptnoSal" parameterType="Zpwd" resultType="Zpwd">
            select * from zpwd where deptno = #{deptno} and sal > #{sal}
        </select>
    </mapper>
    

    注意点:

    • 该框架下如果形参为两个以上的条件,必须使用对象,换句话说,不接受两个及以上的形参
    • 接口名和xml文件名称必须完全一致
      <mapper namespace="com.zpwd.mapper.ZpwdMapper">指向的就是ZpwdMapper.java文件
    • id中的内容是方法名称。
    • parameterType: 是参数类型,当形参是一个的时候,用#{value}代替。当形参是对象时,xml会解析成#{getter(属性)},但是getter去掉,直接写成#属性}
    • resultType:是返回值类型,当返回值是list,set集合时,使用泛型(map除外)

    <?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">

    如果记不住该头部,从别的位置复制过来,要记住修改三个位置。小写mapper,开头大写Mapper,小写mapper这三个要修改好。


    总结

    在Maven下创建Mybatis过程
    1.创建Maven项目(该步骤略过)
    2.引入依赖(一个mybatis,两个日志)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zpwd</groupId>
        <artifactId>mybatis_maven</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.39</version>
            </dependency>
            <!--日志logging-->
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </dependency>
        </dependencies>
    
        <!--带模板的maven项目需要指定xml文件,让其变为可编译-->
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    </project>
    

    3.配置配置文件(数据库、日志、SqlMapConfig.xml)

    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/zpwd?useUnicode=true&characterEncoding=utf8
    jdbc.user = root
    jdbc.password = root
    
    # Global logging configuration
    #在开发环境日志级别要设置为DEBUG、生产环境要设置为INFO或者ERROR
    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
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!--声明根节点类型:configuration-->
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <!--根节点-->
    <configuration>
        <!--  如果不配置db.properties,下面的连接池可直接定义driver,url,username,password  -->
        <properties resource="db.properties"></properties>
        <!--  包的类型别名,配置完后,该包下所有类的别名都默认是自己的类名  -->
        <typeAliases>
            <package name="com.zpwd.pojo"/>
            <!--    自定义单个包下其中的一个类的别名      -->
            <!--    <typeAlias type="com.zpwd.pojo.Emp" alias="Emp"></typeAlias>      -->
        </typeAliases>
        <!--数据源配置  这块用 Oracle数据库 -->
        <environments default="development">
            <!--设置环境-->
            <environment id="development">
                <transactionManager type="jdbc"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.user}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
        <!--  mapper映射器,配置持久层的包(以前是dao,现在叫mapper,就是持久层) -->
        <!--    -->
        <mappers>
            <package name="com.zpwd.mapper"></package>
        </mappers>
    </configuration>
    

    4.创建Mapper层(一个Mapper.java、一个Mapper.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">
    <mapper namespace="com.zpwd.mapper.EmpMapper">
        <!--如果形参是基本数据类型:#{}中写啥都行,标准写法#{value}-->
        <select id="getEmpByEmpno" parameterType="int" resultType="com.zpwd.pojo.Emp">
            select * from emp where empno = #{value}
        </select>
    
        <!--返回值是集合,返回值写泛型。如果是Map,返回值写map:Map<String,Object> 、List<Map<String,Object>>-->
        <select id="getEmpListByEname" parameterType="String" resultType="com.zpwd.pojo.Emp">
            select * from emp where ename = #{value}
        </select>
    
    
        <select id="getMapByEmpno" parameterType="int" resultType="map">
            select * from emp where empno = #{value}
        </select>
    
        <!--如果形参是对象,#{}中写对象的属性名-->
        <select id="getEmpByEmp" parameterType="Emp" resultType="Emp">
            select * from emp where empno = #{empno} and ename = #{ename}
        </select>
    
        <!--mybatis增删改xml中不存在返回值-->
        <insert id="inserEmp" parameterType="Emp" >
            insert into emp (ename,empno,job)
            values (#{ename},#{empno},#{job})
        </insert>
    
        <!--动态sql-->
        <select id="getEmpList" parameterType="Emp" resultType="Emp">
            select * from emp
            <where>
                <if test="ename != null and ename != ''">
                    and ename =#{ename}
                </if>
            </where>
        </select>
    
        <!--sql片段-->
        <sql id="commentserch">
    
        </sql>
    </mapper>
    

    注意点:

    数据库中bit类型的数据发送给jsp文件后,0为false,1为true。
    Dao操作的不会出现这种情况!只有mybatis

    相关文章

      网友评论

          本文标题:Mybatis

          本文链接:https://www.haomeiwen.com/subject/bwibzqtx.html