首页 > 其他分享 >Mybatis

Mybatis

时间:2022-10-17 14:48:36浏览次数:91  
标签:语句 mapper 映射 sql SQL Mybatis id

Mybatis

简化jdbc,免除了几乎所有jdbc代码以及设置参数和获取结果集的工作。

将注册驱动、获取连接的语句放在xml里设置好。

sql语句也设置好。

搭建环境流程:

1.创建maven工程并导入坐标

主要是mybatis的,其他都是附加的

<dependencies>
	
	       <dependency>
	           <groupId>org.mybatis</groupId>
	           <artifactId>mybatis</artifactId>
	           <version>3.4.5</version>
	       </dependency>
	       <dependency>
	           <groupId>mysql</groupId>
	           <artifactId>mysql-connector-java</artifactId>
	           <version>5.1.43</version>
	       </dependency>
	
	       <dependency>
	           <groupId>log4j</groupId>
	           <artifactId>log4j</artifactId>
	           <version>1.2.12</version>
	       </dependency>
	<!--junit单元测试-->
	       <dependency>
	           <groupId>junit</groupId>
	           <artifactId>junit</artifactId>
	           <version>4.10</version>
	       </dependency>
	
</dependencies>

2.写xml配置文件

创建mybatis的主配置文件

以下只是一个简单的例子

直接把jdbc相关的配置一次性写好,免得以后每次调数据都需要重新配置。

注意头部的声明,它用来验证XML文档的正确性

<?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="mysql">
        <!--配置Mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的四个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/db1" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="Mybatis/IuserMapper.xml" />
    </mappers>

</configuration>

3.构建SqlSessionFactory。

先使用SqlSessionFactoryBuilder加载xml文件,再构造SqlSessionFactory。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

4.用SqlSessionFactory获取SqlSession

说明mapper文件

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
}

方法可以通过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">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

它在命名空间"org.mybatis.example.BlogMapper"中定义了一个"selectBlog"的映射语句,就可以调用了。

这里用的是Mapper代理开发

  1. 定义与sql映射文件(xxx.xml)同名的Mapper接口,将接口和sql映射文件放置在同一目录
  2. 设置sql映射文件的namespace属性为Mapper接口全限定名
  3. 在mapper接口中定义方法,方法名就是xml文件里sql语句的id,保持参数类型和返回值

如果遵守以上的几个规则,在总配置文件里就可以把放mapper类的包加上,直接扫描这个包里所有的mapper了

https://gitee.com/hxdacc/myphotos/raw/master/image-20221014111843034.png

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

其实还有另一种调用方法,这里就不多赘述了,因为那个方法不好用。

  • 创建实体类和mapper的接口

实体类用于对应数据库每一行数据,mapper用于映射

public class User implements Serializable {
		
	private int id ;
	private String username;
	......
}
public interface IUserMapper {
	/**
	* 查询所有操作
	* @return
	*/
	List<User> findAll();
}
  • 创建映射配置文件

名称空间

此次查询的id,对应查询的数据类型

<mapper namespace="com.Mapper.IUserMapper" >
    <select id="findAll" resultType="com.Pojo.User" >
        select * from usr
    </select>
</mapper>

MyBatis配置

环境准备

可以不只配置一个数据源,在总配置文件里,我们可以通过配置多个environment来配置多个数据源,通过default属性来切换不同的environment。

配置各个标签的时候,要注意顺序。

MyBatisX插件

这个插件可以自动生成sql映射,写好Mapper接口以后,alt+enter自动生成。

结果映射

由于在类中的变量和数据库的字段命名方式不太一样,下划线和驼峰命名法是无法一一对应的,所以经常出现字段对应不上的问题,这个问题如何解决呢?有两种方法。

  • 别名

    在sql映射中的sql语句中将字段名别名为类的属性名。

  • 通过resultMap来进行一一对应

    resultMap的id是唯一标识,type是映射的类型,支持别名。

    resultMap内部的标签:id:完成主键字段的映射

    ​ column:表的列名

    ​ property:实体类的

    ​ result:完成一般字段的映射

<resultMap id="xxxResultMap" type="pojo类">
    <result column="brand_name" property="brandName"/>
    <id column="id_ll" property="idll"/>
</resultMap>

查询-查看详情

1.编写接口方法:mapper接口(参数、结果)

2.编写sql语句:sql映射文件

3.执行方法,测试

参数占位符

在sql语句中,我们大部分时间都是传入参数的,在mybatis里,有两个符号

1.#{}这个是采用预编译的方法,占位符用?取代,先预编译成一个sql语句。不会有sql注入问题。

2.${}这个是采用字段拼接的方法,在编译的时候直接把变量拼接上去,因此会有sql注入问题。

  • 例如传入 id = 1 or 1 = 1 or and empname = xxx
id=${id} and empname=#(empName):
select * from t_employee where id=1 and empname=?
------------------------------------------------
id=#{id} and empname=#{empName}:
select * from _employee where id=? and empname=?

那$的使用场景有什么?

sql只有参数位置才支持预编译,如果要动态传入表名、列名,就需要${},#{}会失败(直接将表名替换为?了)。

预编译的作用

  • 防止sql:将参数位置使用占位符?预留,先将请求预编译成了一条sql语句,其后注入的参数将不会再进行SQL编译。也就是说SQL已经编译完成,其结构已经固定,用户的输入只能当做参数传入进去,而不会认为它会是一条SQL语句,参数中的or或者and 等就不是SQL语法保留字了,不会再破坏SQL的结果,无法造成曲解SQL原本意思的破坏。

  • 复用sql,提高SQL执行效率:

    预编译功能除了避免SQL注入,还能提高SQL执行效率。当客户发送一条SQL语句给服务器后,服务器首先需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句。其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多。

    如果我们需要执行多次insert语句,但只是每次插入的值不同,MySQL服务器也是需要每次都去校验SQL语句的语法格式以及编译,这就浪费了太多的时间。如果使用预编译功能,那么只对SQL语句进行一次语法校验和编译,所以效率要高。

特殊字符处理

因为我们是在xml文件里写sql语句,所以难免会遇到符号冲突得情况,可以通过如下几个方法进行处理:

1.转义字符

2.cdata区

多条件查询

当sql语句需要多个参数时,接口有三种参数接手方式。

1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称")

2.对象参数:把我们需要传入的值都放进同一个对象中,再把这个对象传进接口中。

3.map集合参数:https://gitee.com/hxdacc/myphotos/raw/master/image-20221014160206109.png

再把map传进去。

缺点:列名是固定的,当不传入这个列的数据时,就查不到数据。没有办法动态的从几个列中查询数据。这就需要 动态sql来查询。

动态sql

在写动态sql的时候,由于是通过if一段一段插入的,当有条件不满足的时候,可能导致语句的and之间出现连接错误。

动态条件查询:

if :条件判断

test:逻辑表达式

问题,会出现格式问题

解决方法:where标签,在where里写if语句,这会自动去掉多余的and。

<select id="selectByCondition" resultMap="brandResultMap">
select * from tb_brand
<where>
    <if test = "companyName != null and companyName !=''">
    and company_name like #{companyName}</if>

       <if test = "brand_name != null and brand_name !=''">
    and brand_name like #{brandName}</if>
    </where>
</select>

choose(when,otherwise):选择,类似于switch语句,这个用于多个条件选一个

https://gitee.com/hxdacc/myphotos/raw/master/image-20221017104900786.png

如果一个都不满足,就多了个where,因此加上一个1 = 1,要不,还是用

增删改查

添加

1.编写接口方法:Mapper接口

2.编写sql语句,sql映射文件

<insert id="add">
    insert into tb_brand(brand_name,company_name,ordered,description,status)
    values (#{brandname},#{companyName});
</insert>

增删改,我们就需要注意事务的提交了,可以在sqlSession创建时设置自动提交事务,也可以在最后手动提交。

修改

https://gitee.com/hxdacc/myphotos/raw/master/image-20221017112110060.png

避免出现逗号的格式问题。

删除

mybatis会将数组参数,封装为一个Map集合,

默认:array = 数组

或者:使用@Param注解改变map集合的默认key的名称

<delete id="deleteByIds">
delete from tb_brand where id
in(
    <foreach collection="ids" item ='id' seperator=",">
    #{id}</foreach>
)</delete>

注解开发

不需要写xml配置文件了,在注解里直接写sql语句。

  • @Select
  • @Insert
  • @Update
  • @Delete

只适合比较简单的语句。

标签:语句,mapper,映射,sql,SQL,Mybatis,id
From: https://www.cnblogs.com/brotheracc/p/16799126.html

相关文章

  • [转]「SpringCloud」基于MybatisPlus插件实现多租户功能
    原文地址:「SpringCloud」基于MybatisPlus插件实现多租户功能-开源基础软件社区-51CTO.COM作者AI全栈程序猿来源|今日头条多租户技术的基本概念:多租户技术(英语:multi......
  • 一篇文章带你掌握MyBatis简化框架——MyBatisPlus
    一篇文章带你掌握MyBatis简化框架——MyBatisPlus我们在前面的文章中已经学习了目前开发所需的主流框架类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人......
  • Spring boot Mybatis
       复杂的sql语句,建议使用xml 简单的sql可以使用注解    ......
  • Spring Boot Mybatis plus中国人开发的,直接参考官方文档
        扫描路径     ......
  • Mybatis 增删改查 基础小进阶
    有部分相同不需要修改可以点击--->简单的Mybatis项目1.配置Maven依赖2.配置环境文件mybatis-config.xml3.编写MybatisUtils工具类4.编写实体类User5.实体类UserMapper......
  • mybatis学习笔记
    1、简介1.1、什么是MyBatis?MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的......
  • MybatisX 新建项目
    新建项目MybatisX1. 一路next就行了,导包直接复制以前的 2.导入yml3.链接sql4.配置  自动生成好了......
  • MyBatis 模糊查询时对特殊字符"%"和"_"的处理
    MyBatis 模糊查询时对特殊字符"%“和”_"的处理问题:输入"%“或”_",查询结果为全部数据,且无法查询到带有"%"或者下划线的数据。解决:对特殊字符转义例如查询字段为na......
  • MybatisPlus生成主键策略方法
    MybatisPlus生成主键策略方法全局id生成策略【因为是全局id所以不推荐】SpringBoot集成Mybatis-Plus在yaml配置文件中添加MP配置mybatis-plus:global-config:d......
  • mybatis的逆向工程
    Mybatis逆向工程实现步骤:mybatis逆向工程:1)简介:根据表生成mapper层三部分代码:实体类,mapper接口,映射文件。2)使用mybatis逆向工程:a)创建工程:crm-mybatis-generatorb)......