IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> MyBatis总结 -> 正文阅读

[Java知识库]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>
        <!-- mybatis 核心包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!-- junit 测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- mysql 核心包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

    </dependencies>

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

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

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

4.创建mapper接口

public interface UserMapper {
    /**
     * 添加用户信息
     * @return
     */
    int insertUser();    
}

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属性保持一致

<?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.yxm.test.UserMapper">
    
    <insert id="insertUser">
        insert into user values (null,'springyang','123456');
    </insert>
</mapper>

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);
    }
}

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

三.MyBatis加入log4j日志功能

1.在maven加入log4j依赖

        <!-- log4j 日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

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

    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

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

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

四.核心配置文件详解

核心配置文件中的标签必须按照固定的顺序: 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
    <!--引入jdbc.properties数据库文件-->
    <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>

setting

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

typeAliases

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

    <typeAliases>
        <typeAlias type="com.yxm.test.pojo.User"></typeAlias>
    </typeAliases>

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

    <typeAliases>
       <package name="com.yxm.test.pojo"></package>
    </typeAliases>

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>

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

    <mappers>
       <package name="com.yxm.test.mappers"/>
    </mappers>

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

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

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

五.MyBatis的增删改查

新增

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

删除

<delete id="deleteUser">
    delete from user where id=12;
</delete>

修改

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

查询单个实体类对象

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

返回值User

查询多个实体类对象

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

返回值List<User>

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

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

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

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

七.自定义映射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>

八.动态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>
        <if test="sex != '' and sex != null">
            and sex = #{sex}</if>
    </select>
  • 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>
  • 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>

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

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

九.MyBatis逆向工程

添加依赖和插件

<!-- 依赖MyBatis核心包 -->
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.3</version>
        </dependency>

        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

    </dependencies>

    <!-- 控制Maven在构建过程中相关配置 -->
    <build>

        <!-- 构建过程中用到的插件 -->
        <plugins>

            <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>

                <!-- 插件的依赖 -->
                <dependencies>

                    <!-- 逆向工程的核心依赖 -->
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>

                    <!-- 数据库连接池 -->
                    <dependency>
                        <groupId>com.mchange</groupId>
                        <artifactId>c3p0</artifactId>
                        <version>0.9.2</version>
                    </dependency>

                    <!-- MySQL驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.8</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

创建逆向工程的配置文件

文件名必须是:generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--
            targetRuntime: 执行生成的逆向工程的版本
                    MyBatis3Simple: 生成基本的CRUD(清新简洁版)
                    MyBatis3: 生成带条件的CRUD(奢华尊享版)
     -->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 数据库的连接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <!-- javaBean的生成策略-->
        <javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 -->
        <sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 逆向分析的表 -->
        <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
        <!-- domainObjectName属性指定生成出来的实体类的类名 -->
        <table tableName="t_emp" domainObjectName="Emp"/>
        <table tableName="t_dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>

执行MBG插件的generate目标

在这里插入图片描述

效果

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:51:23  更:2022-09-15 01:54:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:22:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码