• MyBatis总结


    一.MyBatis简介

    • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
    • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
    • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java
      Objects,普通的Java对象)映射成数据库中的记录
    • MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架

    MyBatis下载地址:https://github.com/mybatis/mybatis-3
    在这里插入图片描述

    二.搭建MyBatis

    1.开发环境

    IDE:idea 2019
    构建工具:maven 3.6.0
    MySQL版本:MySQL 5.7
    MyBatis版本:MyBatis 3.5.7

    2.创建maven工程

    引入依赖

     <dependencies>
            
            <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatisartifactId>
                <version>3.5.7version>
            dependency>
    
            
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
                <scope>testscope>
            dependency>
    
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>5.1.49version>
            dependency>
    
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.创建MyBatis的核心配置文件

    MyBatis官方推荐MyBatis的核心配置文件:mybatis-config.xml
    核心配置文件的存放位置是src/main/resources目录下

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                dataSource>
            environment>
        environments>
        <mappers>
            <mapper resource="mappers/UserMapper.xml"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.创建mapper接口

    public interface UserMapper {
        /**
         * 添加用户信息
         * @return
         */
        int insertUser();    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.创建MyBatis的映射配置文件

    ORM对象关系映射
    对象:Java的实体类对象
    关系:关系型数据库(MySQL)
    映射:二者之间的关系

    JavaMySQL
    属性字段/列
    对象记录/行

    1.映射文件的命名规则:
    一般为实体类的类名+Mapper.xml 例如:UserMapper类对应的配置文件为UserMapper.xml
    一个映射文件对应一个实体类,对应一张表的操作
    MyBatis映射文件用于编写SQL,访问以及操作表中的数据
    MyBatis映射文件存放的位置是/src/main/resources/mappers目录下

    2.MyBatis中面向接口操作数据,要保证两个一致
    mapper接口的全类名和映射文件的命名空间(namespace)保持一致
    mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.yxm.test.UserMapper">
        
        <insert id="insertUser">
            insert into user values (null,'springyang','123456');
        insert>
    mapper>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    6.Junit测试功能

    package com.yxm.test;
    
    import com.yxm.test.dao.UserMapper;
    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.InputStream;
    
    public class UserTest {
    
        @Test
        public void test1() throws Exception {
            //读取MyBatis的核心配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            //创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
            //SqlSession sqlSession = sqlSessionFactory.openSession();
            //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            //通过代理模式创建UserMapper接口的代理实现类对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配 映射文件中的SQL标签,并执行标签中的SQL语句
            int result = userMapper.insertUser();
            //手动提交
            //sqlSession.commit();
            System.out.println("结果:"+result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    需要注意:测试类要在src/test下新建测试类才能使用junit测试,因为pom文件中已经指定了scope 为test,如果不需要可删除。

    三.MyBatis加入log4j日志功能

    1.在maven加入log4j依赖

            
            <dependency>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
                <version>1.2.17version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.在mybatis-config.xml的settings标签中配置log4j日志

        <settings>
            <setting name="logImpl" value="LOG4J"/>
        settings>
    
    • 1
    • 2
    • 3

    3.在src/resources文件夹下新建log4j.properties文件

    ### 配置根/在什么地方会打印日志   ###
    log4j.rootLogger = debug,console,fileAppender
    
    ### 设置输出sql的级别,其中logger后面的内容全部为jar包中所包含的包名 ###
    log4j.logger.org.apache=dubug
    log4j.logger.java.sql.Connection=dubug
    log4j.logger.java.sql.Statement=dubug
    log4j.logger.java.sql.PreparedStatement=dubug
    log4j.logger.java.sql.ResultSet=dubug
    
    ### 配置输出到控制台 ###
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.Target = System.out
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### 配置输出到文件 ###
    log4j.appender.fileAppender = org.apache.log4j.FileAppender
    log4j.appender.fileAppender.File = logs/log.log
    log4j.appender.fileAppender.Append = true
    log4j.appender.fileAppender.Threshold = DEBUG
    log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
    log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    以上配置会同时打印到控制台并生成日志文件

    四.核心配置文件详解

    核心配置文件中的标签必须按照固定的顺序: properties?,settings?
    typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,refl
    ectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?

    properties

    引入外部properties文件
    新建外部jdbc.properties文件,连接数据库

    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/ssm
    jdbc.username = root
    jdbc.password = 123456
    
    • 1
    • 2
    • 3
    • 4
        
        <properties resource="jdbc.properties"/>
    
        <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.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                dataSource>
            environment>
        environments>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    setting

    MyBatis标签属性配置,例如日志配置。

    typeAliases

    设置类型别名
    typeAlias:设置某个类型的别名
    type:设置需要设置别名的类型
    alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名

        <typeAliases>
            <typeAlias type="com.yxm.test.pojo.User">typeAlias>
        typeAliases>
    
    • 1
    • 2
    • 3

    以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写

        <typeAliases>
           <package name="com.yxm.test.pojo">package>
        typeAliases>
    
    • 1
    • 2
    • 3

    environments

    配置多个连接数据库的环境
    属性default:设置默认使用的环境的id
    transactionManager:设置事务管理方式type=“JDBC|MANAGED”
    JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事 务的提交或回滚需要手动处理
    MANAGED:被管理,例如Spring
    dataSource:配置数据源 属性:type:
    设置数据源的类型 type=“POOLED|UNPOOLED|JNDI”
    POOLED:表示使用数据库连接池缓存数据库连接
    UNPOOLED:表示不使用数据库连接池
    JNDI:表示使用上下文中的数据源

    mappers

    mapper 引入单个映射文件

        <mappers>
            <mapper resource="mappers/UserMapper.xml"/>
        mappers>
    
    • 1
    • 2
    • 3

    package以包为单位引入配置文件

        <mappers>
           <package name="com.yxm.test.mappers"/>
        mappers>
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述

    以包为单位引入映射文件的两个要求

    1.mapper接口所在的包和映射文件所在的包要一致。
    2.mapper接口要和映射文件的名字一致。

    五.MyBatis的增删改查

    新增

    <insert id="insertUser">
        insert into user values (null, 'springyang', '123456');
    </insert>
    
    • 1
    • 2
    • 3

    删除

    <delete id="deleteUser">
        delete from user where id=12;
    </delete>
    
    • 1
    • 2
    • 3

    修改

    <update id="updateUser">
        update  user set username='yxm' where id=1;
    </update >
    
    • 1
    • 2
    • 3

    查询单个实体类对象

    <select id="getUserById" resultType="com.yxm.test.pojo.User"> 
         select * from user where id = 2 
    </select>
    
    • 1
    • 2
    • 3

    返回值User

    查询多个实体类对象

    <select id="getUserList" resultType="com.yxm.test.pojo.User"> 
         select * from user
    </select>
    
    • 1
    • 2
    • 3

    返回值List

    查询select标签必须设置resultType或者resultMap,用于设置实体类和数据库的映射关系
    resultType:自动映射,用于属性名和表中字段名一致的情况
    resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

    六.${}和#{}区别及特殊的SQL语句

    ${}本质就是字符串拼接,#{}的本质就是占位符赋值,
    #{}在MyBatis作为参数时,会将参数转化为?,相当于JDBC中的preparestatment,使用#{}可以防止SQL注入。

    • 模糊查询
      查询username中包含m的用户名
        /**
         * 模糊查询
         */
        List<User> queryLike();
    
    • 1
    • 2
    • 3
    • 4
        <select id="queryLike" resultType="com.yxm.test.pojo.User">
            SELECT * FROM USER WHERE username LIKE '%m%'
        </select>
    
    • 1
    • 2
    • 3
    • 批量删除
      删除id为11 12的用户
        /**
         * 批量删除
         */
        int deleteUser();
    
    • 1
    • 2
    • 3
    • 4
        <delete id="deleteUser">
            delete from user where id in ('11','12')
        </delete>
    
    • 1
    • 2
    • 3
    • 根据表名查询所有表中数据(动态设置表名)
        /**
         * 动态设置表名
         */
        List<User> getUsers(@Param("tableName") String tableName);
    
    • 1
    • 2
    • 3
    • 4
        <select id="getUsers" resultType="com.yxm.test.pojo.User">
            select * from ${tableName}
        </select>
    
    • 1
    • 2
    • 3

    七.自定义映射resultMap

    resultMap处理字段和属性的映射关系,常用属性如下:

    属性说明
    父标签
    id表示自定义映射的唯一标识
    type查询数据映射的实体类类型,即查询结果返回实体类
    子标签
    id设置主键的映射关系
    result设置普通字段的映射关系
    association设置多对一的映射关系
    collection设置一对多的映射关系
    property设置实体类中的属性名
    column设置表中的字段名
        <resultMap id="userMap" type="User">
            <id property="id" column="id"></id>
            <result property="username" column="user_name"/>
            <result property="password" column="password"/>
        </resultMap>
        <select id="queryUserMap" resultMap="userMap">
            select * from user
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    八.动态SQL

    • if
      if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会被执行,否则不会执行。
        <select id="getEmpList" resultType="Emp">
            select * from t_emp
            where 1=1
            <if test="ename != '' and ename != null">
                and ename = #{ename}
            </if>
            <if test="age != '' and age != null">
                and age = #{age}
            <if test="sex != '' and sex != null">
                and sex = #{sex}
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • where
      where和if一般结合使用。
        <select id="getEmpList2" resultType="Emp">
            select * from t_emp
            <where>
                <if test="ename != '' and ename != null">
                    ename = #{ename}
                </if>
                <if test="age != '' and age != null">
                    and age = #{age}
                </if>
                <if test="sex != '' and sex != null">
                    and sex = #{sex}
                </if>
            </where>
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • trim
    • choose、when、otherwise
    • foreach
        <insert id="insertEmp">
            insert into t_emp values
            <foreach collection="emps" item="emp" separator=",">
                (null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
            </foreach>
        </insert>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    属性:
    collection:设置要循环的数组或集合
    item:表示集合或数组中的每一个数据
    separator:设置循环体之间的分隔符
    open:设置foreach标签中的内容的开始符
    close:设置foreach标签中的内容的结束符

    • SQL片段
      sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入

    九.MyBatis逆向工程

    添加依赖和插件

    
        <dependencies>
            <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatisartifactId>
                <version>3.5.7version>
            dependency>
            
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
                <scope>testscope>
            dependency>
    
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>5.1.3version>
            dependency>
    
            
            <dependency>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
                <version>1.2.17version>
            dependency>
    
        dependencies>
    
        
        <build>
    
            
            <plugins>
    
                
                <plugin>
                    <groupId>org.mybatis.generatorgroupId>
                    <artifactId>mybatis-generator-maven-pluginartifactId>
                    <version>1.3.0version>
    
                    
                    <dependencies>
    
                        
                        <dependency>
                            <groupId>org.mybatis.generatorgroupId>
                            <artifactId>mybatis-generator-coreartifactId>
                            <version>1.3.2version>
                        dependency>
    
                        
                        <dependency>
                            <groupId>com.mchangegroupId>
                            <artifactId>c3p0artifactId>
                            <version>0.9.2version>
                        dependency>
    
                        
                        <dependency>
                            <groupId>mysqlgroupId>
                            <artifactId>mysql-connector-javaartifactId>
                            <version>5.1.8version>
                        dependency>
                    dependencies>
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    创建逆向工程的配置文件

    文件名必须是:generatorConfig.xml

    
    DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        
        <context id="DB2Tables" targetRuntime="MyBatis3">
            
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/mybatis"
                            userId="root"
                            password="123456">
            jdbcConnection>
            
            <javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true" />
                <property name="trimStrings" value="true" />
            javaModelGenerator>
            
            <sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper"  targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true" />
            sqlMapGenerator>
            
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper"  targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true" />
            javaClientGenerator>
            
            
            
            <table tableName="t_emp" domainObjectName="Emp"/>
            <table tableName="t_dept" domainObjectName="Dept"/>
        context>
    generatorConfiguration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    执行MBG插件的generate目标

    在这里插入图片描述

    效果

    在这里插入图片描述

  • 相关阅读:
    java计算机毕业设计服装连锁店后台管理系统源码+mysql数据库+系统+lw文档+部署
    C++程序性能控制(cpu,内存,带宽,io)
    java继承
    基于自动化设备和现代化仓储精益管理思想开发的仓库管理系统
    高精度算法【加减乘除】
    04 【对象】
    设计模式之(9)——适配器 模式
    Python库的使用
    MySQL主从复制
    高效PPT制作与演示技巧大揭秘
  • 原文地址:https://blog.csdn.net/weixin_44226883/article/details/126776411