• 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官方有文档

  • 相关阅读:
    第3课 线性分类器损失函数与最优化
    李飞飞机器视觉课程笔记:第2课 K最近邻与线性分类器
    周志华《机器学习》第二章学习笔记
    通过anaconda安装tensorflow
    周志华《机器学习》第一章学习笔记 奥卡姆剃刀原理、没有免费的午餐定理(NFL)、回归模型
    DPM目标检测模型
    损失函数的理解
    mini-batch的理解
    前向传播、后向传播
    SVM(支持向量机)的理解
  • 原文地址:https://www.cnblogs.com/tigo/p/15039739.html
Copyright © 2020-2023  润新知