Mybatis部分笔记一

mybatis:

背景介绍:

mybatis原来是apache下面的一个开源项目,名为ibatis, 2010年开发团队转移到谷歌旗下,改名为mybatis.

mybatis介绍:

mybatis是一个优秀的数据持久层(dao层 /数据访问层/数据持久层)

mybatis是对jdbc进行封装,,避免了Jdbc中手动设置参数,手动映射结果的操作.

mybatis将jdbc中的接口进行封装,提供了它自己的类和接口实现.

mybatis可以使用xml配置和注解的方式,将数据库中记录自动映射到java对象中,是一种ORM实现(对象关系映射)将可以自动将数据映射到对象中的这种框架,也称为orm框架。

mybatis还提供了动态sql和数据缓存。

搭建补充:

1.在idea中安装MybatisX插件,

2.数据库连接池

链接数据库 每次访问数据库,创建一个connection,使用完后删除,但当访问量大了后,每次都要创建新的连接对象,用完关闭,比较耗时。

使用数据库连接池,在池(集合)中事先创建一些连接对象,用户访问时,就直接从池中获取一个链接对象,用完后不销毁,传回池中。这样减少了频繁创建和销毁连接对象。

#{} 和 ${}区别:

#{}:是占位符,是采用预编译方式向sql传值,可以防止sql注入,如果我们往sql中传值,使用#{}。

${}:将内容直接拼接到sql语句中,一般不用于sql里传值,一般用于向sql中动态传递列名。加上''可以当做值使用。

区别:底层实现不同

#{} 采用预编译方式,防止sql的注入,更加安全。

${} 采用字符串拼接,直接将值拼接到sql中

使用场景:

#{} 一般用于向sql中的列传值

${}一般用于向sql动态传递列名 例如:排序时 order by 后面的列名是可以改变和select 后的列名也可以自由选择。

Mybatis:

Mybatis项目的创建:

需要再idea里创建一个maven项目,在创建的maven项目里,在其中的pom.xml文件里导入

Mybatis 的jar包,以及MYSQL 的数据库驱动包,

在main文件中的java文件里创建出相应的项目文件,如dao包,model包,util包,以及测试的包;

同时在于java同级的resources文件夹里创建Mapper文件夹,还需要再resources文件夹里的mybatils.xml里进行该Mybatis项目的核心配置:
 

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

2.在此文件里可以对我们的类配置别名:

<typeAliases>
    <!--
    <typeAlias type="com.ffyc.mybatispro.model.Admin" alias="Admin"></typeAlias>
    -->
    <package name="com.ffyc.mybatispro.model"/>
</typeAliases>

其中的typeAlias type 每次只能为一种模版类进行配置名称,如果模版类数量特别多,会导致,代码冗余,所以使用package 对整体的model进行配置,类型调用时,直接使用model文件包里的名称。

3.配置所要链接数据库的信息

<!-- 配置数据库连接相关信息 -->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <!--TYPE="POOLED" 使用数据库连接池功能,默认创建10个链接对象,减少创建和销毁连接对象-->
        <dataSource type="POOLED">
            <!--数据库连接配置-->
            <property name="driver" value="com.mysql.cj.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/mssdb?serverTimezone=Asia/Shanghai" />
            <property name="username" value="root" />
            <property name="password" value="root"/>
        </dataSource>
    </environment>
</environments>

如果当你在Mapper文件夹创建了,与模版类对应的mapper文件,最后还要在此文件里配置映射文件。

<!--  注册映射文件 -->
<mappers>
    <mapper resource="Mapper/AdminMapper.xml"></mapper>
    <mapper resource="Mapper/StudentMapper.xml"></mapper>
    
</mappers>

mapper文件就是sql映射文件,其主要的作用是写sql实现。

<?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文件对应的Dao包在java文件夹的地址 -->
<mapper namespace="com.ffyc.mybatispro.dao.TeacherDao">
    
</mapper>
Mapper的部分标签:
where标签:
<!--
       动态SQL
        可以在sql中添加逻辑判断
        if test属性条件成立 执行if标签体,不成立就不执行
        where标签 当where标签 if语句有条件成立时,就会动态添加where关键字,
                                    还可以删除where后面紧跟着的关键字,例如and or
-->
<select id="teachers" resultType="Teacher">
        &lt;!&ndash;gender = #{gender} and name = #{name}&ndash;&gt;
        select * from teacher
            <where>
            <if test="num!=null">
                num=#{num}
            </if>
            <if test="name!=null">
                 name=#{name}
            </if>
            <if test="gender!=null">
                 gender=#{gender}
            </if>
            </where>
 </select>
trim标签:
<!--
       trim 当条件判断有成立时,可以自定义前缀关键字和后缀关键字
        prefix="where"
        prefixOverrides=“and|or"   覆盖指定关键字
-->

<select id="teachers" resultType="Teacher">
    select * from teacher
    <trim prefix="where" prefixOverrides="and|or">
        <if test="num!=null">
            num=#{num}
        </if>
        <if test="name!=null">
            or name=#{name}
        </if>
        <if test="gender!=null">
           and gender=#{gender}
        </if>
    </trim>
</select>

when关键字:

<!-- 可以有多个when,没有otherwise,但不能没有when ,类似于if else语句-->
 <select id="teachers" resultType="Teacher">
        select * from teacher
        <where>
        <choose>
         <when test="name!=null">
             name=#{name}
         </when>
         <otherwise>
             name='鼠老师'
         </otherwise>
        </choose>
        </where>
    </select>
set标签:
<!-- set元素可以把最后一个逗号去掉 --> <update id="updateTeacher" parameterType="Teacher">
     update teacher
     <set>
         <if test="num!=null">
             num=#{num},
         </if>
         <if test="name!=null">
             name=#{name},
         </if>
         <if test="gender!=null">
             gender=#{gender}
         </if>
     </set>

     where id=#{id}
 </update>
prefixOverrides和suffixOverrides区别:

prefixOverrides 和 suffixOverrides 是在一些配置文件中用于控制字符串或标识符处理的选项,特别是在代码生成和数据库映射工具中。它们的区别在于:

  1. prefixOverrides:

    作用: 用于从字符串或标识符的开头删除指定的前缀。

    例如果有一个列名 prefix_ColumnNameprefixOverrides 设置为 prefix_,那么最终使用的标识符将是 ColumnName。它会去除所有以 prefix_ 开头的前缀。

  2. suffixOverrides:

    作用: 用于从字符串或标识符的结尾删除指定的后缀。

    例如果有一个列名 ColumnName_suffix和 suffixOverrides 设置为‘_suffix,那么最终使用的标识符将是ColumnName。它会去除所有以 _suffix 结尾的后缀。

prefixOverrides: 删除开头的指定前缀。

suffixOverrides: 删除结尾的指定后缀。

<delete id="deleteTeacher">
    <!--集合 collection="array" 数组用"list" -->
     delete from teacher where id in

     <foreach item="id" collection="array" open="(" separator="," close=")">
         #{id}
     </foreach>

 </delete>
关联查询:

方法一:直接多表关联查询出我们需要的信息

<resultMap id="majorMap" type="Major">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <!--
      property   定义的名字
     javaType  集合数据类型
     ofType   集合内部泛型的类型
     -->
  <!-- 将查询关联的多条结果封装的程序 -->
    <collection property="students"  javaType="list" ofType="Student">
        <result column="num" property="num"></result>
        <result column="sname" property="name"></result>

    </collection>

</resultMap>
<select id="findMajorById" parameterType="int" resultMap="majorMap">
    select
    m.id,
    m.name,
    s.num,
    s.name
    as sname from major m
    inner join student s on m.id=s.majorid
    where m.id=1

</select>
<select id="findMajor" resultMap="majorMap">
    select
    m.id,
    m.name,
    s.num,
    s.name
    as snmae from major m
    left join student s on m.id=s.majorid
</select>

方式2:先查主表(学生表)

该方法是通过

 <resultMap id="majorMap1" type="Major">
     <id column="id" property="id"></id>
     <result column="name" property="name"></result>
     <collection property="students" javaType="list" ofType="Student" select="findStudents" column="id"></collection>
 </resultMap>
 <select id="findMajors" resultMap="majorMap1">
     select  id,name from major
 </select>
 <select id="findStudents" resultType="Student">
     select num,name from student where majorid= #{id}
 </select>

动态sql语句。

数据缓存:

数据缓存,让数据离我们的执行程序更近,让程序能快速获取到数据。

例如:手机缓存,浏览器缓存 ... cpu缓存。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值