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代理开发
- 定义与sql映射文件(xxx.xml)同名的Mapper接口,将接口和sql映射文件放置在同一目录
- 设置sql映射文件的namespace属性为Mapper接口全限定名
- 在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