JAVA MyBatis

介绍

MyBatis为数据库框架 替代JDBC大量的重复代码

基本知识

原理

把数据库中的一行数据映射为一个java对象从而对对象进行操作

功能

提供重复部分代码的创建 Connection Statement ResulSet

执行sql语句

查询结果转为集合

提供关闭资源的能力

达到开发人员只需要编写sql语句即可的效果

步骤

1创建数据库对应操作表的实体类(映射)get set方法写入 toStirng方法重写

2创建总的mybatis的配置  位置  在resource文件夹下

<?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>
<!--default 默认 为不同连接池的选择 对应environment的id-->
    <environments default="spacewhisper">

        <environment id="spacewhisper">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/wyxyj?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <!--mapper sql语句配置文件的注册-->
        <mapper resource="com/persion/dao/MessageDao.xml"/>
    </mappers>
</configuration>

3创建dao层接口  一个方法对应的一个sql执行语句(在xml配置中)

4创建dao层对应xml文件 一个接口类对应一个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 对应接口类所在位置-->
<mapper namespace="com.persion.dao.MessageDao">

<!--    id为对应sql语句方法   resultType 表示返回的数据类型 -->
    <select id="selectAll" resultType="com.persion.entity.Message">
        select id from message order by id
    </select>
</mapper>

前面例子为查询
更删改记得提交事物sqlSession.commit();

sqlsession

sqlsession下的方法即对应sql执行
而对象的获取是重复操作
//        String config = "mybatis.xml";
//        //读取配置文件
//        InputStream in = Resources.getResourceAsStream(config);
//        //SqlSessionFactory的创建 重量级对象
//        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//
//        SqlSessionFactory factory = builder.build(in);
//        //获取sqlsession 其方法为多种数据库操作
//        SqlSession sqlSession =factory.openSession();
可直接做成工具类

步骤(进阶 真正掌握)

动态代理
最初需要对dao接口的实现类对方法重写 调用完成sql查询入口操作
即使封装了重复代码但是依然存在
mybatis采用反射等机制 动态代理

实现前提
sql xml中<mapper namespace="dao.MessageDao">
namespace对应接口类名

sql语句id <select id="selectAll" resultType="entity.Message" >对应接口方法名

完成实现
MessageDao messageDao = sqlSession.getMapper(MessageDao.class);
messageDao.selectAll();
getmapper方法自动生成接口下的实现类 实现开发者直接调用方法就可

#和$

#{}占位符 实际参数代替 更安全迅速
${}非占位符 字符串拼接 不传参(有sql注入问题)

多个参数的传参

mybastis把java的基本数据类型和String都称为简单参数

1@Param(value = "mes")
注解起别名代替原有名称

传对象 sql中 #{}中属性名即可
(了解 认得就好)其中完整的为#{属性名,javaType=数据java在java中的类型,jdbc=数据在jdbc的类型}

(了解)方式3 按位传参#{arg0(第几个)}

(了解)方式4 hasmap传 通过key找

sql返回结果

简单数据类型 int。。。。

对象类型(类或者List集合)
(了解)paramecerType 指定传入的参数的数据类型,为一个属性 用于判别

自定义类的映射(不常用)
  <resultMap id="getALl" type="entity.Message">//sql的id type 返回的类型
        <id column="id" property="id"/>
        <result column="to_user_id" property="toUserId"/>
        <result column="from_user_id" property="fromUserId"/>
        <result column="content" property="content"/>
        <result column="state" property="state"/>
        <result column="date" property="date"/>
    </resultMap>
    sql的resulttype改为resultmap为resultmap的id
    
sql查询返回可以是map但只能一条数据(了解)

    
     返回列名和实体类不一样还可以给数据库类取别名

模糊查询两种方案

like {name}(推荐)
name =%dog%

like %{name}%
name =dog

动态sql

实际上就是sql评介 根据传入参数判断选择在sql中是否加入指定的sql片段
选择不同的sql
<if test=>text中为具体判断 

<where> 为if服务 因为存在如果所有if都不成立导致were后无判别 语法错误 
所以包含多个if 至少一个if成立则写入where

<foreach>
<foreach collection="传入的数据类型" open="开头的字符" close="结尾的字符" item="为取出值取名" separator="分隔符">
            #{item的值}
        </foreach>

复用代码片段

定义一段代码片段 使用时加入就好
定义
<sql id="唯一id"></sql>
使用
<include refid="对应id"/>

setting(了解)

只对部分介绍 完全看官方文档

<transactionManager type="JDBC"/> 提交,回滚事物的方式
JDBC 原生jdbc  MANAGED spring下的容器

<dataSource type="POOLED">
POOLED 使用连接池(一般都是这个)
UPOOLED 不使用连接池
JNDI windows注册表

sql资源文件在mybatis中的注册 前面说过
<mappers>
        <!--mapper sql语句配置文件的注册-->
        <mapper resource="com/persion/dao/MessageDao.xml"/>
    </mappers>
同时在mappers中可以转为使用包名则会扫描包下所有xml
<package name="dao"/>
条件 1 dao层接口和mapper文件要同一目录 2 同名

数据库连接属性单独放置

resources目录下创建properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
写入key=value格式

setting处的值例如
<property name="driver" value="${jdbc.driver}"/>

额外(mybatisxml配置文件下的一些设置)

日志
setting表示对mybatis的设置 以下为日志设置输出到控制台
<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

实体类映射转换
<settings>
        <!-- 是否开启下划线和驼峰式的自动转换, http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

分页插件

PageHepler
支持多种数据库分页 当然包括mysql

使用
maven依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.2.0</version>
    </dependency>
    
mybatis配置文件设置
<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
    
应用
执行处加入
PageHelper.startPage(int pageNum, int pageSize);
num 第几页 size尺寸

了解

 别名
 
为类起别名 替代全限定名称
<typeAliases>
        <typeAlias type="dao.MessageDao" alias="ao"/>
    </typeAliases>
放包名     resulttype 就可以只放类名
    <typeAliases>
        <package name="entity"/>
    </typeAliases>
只能替代resulttype



注意

1 resulttype和resultmap二选一

2 返回列名和实体类不一样还可以给数据库类取别名

3setting位置的配置需要按照一定的顺序 否则会出错提示

The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

超级链接

mybatis官方有文档

posted @ 2021-07-21 15:30  TIGO  阅读(188)  评论(0编辑  收藏  举报