什么是MyBatis
MyBatis简而言之就是一个数据库框架,一种用于简化JDBC开发的持久层框架
既然会出现MyBatis框架来简化JDBC开发那么JDBC必然会存在一些开发上的不便或者缺点
JDBC的缺点
-
操作繁琐
-
硬编程(也就是说程序被写死了,当需求发生变化时得要改源码)
操作
了解完MyBatis之后,就是要了解他的一些基本操作流程
-
导入mysql数据库和MyBatis框架的jar包/maven直接导入坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
-
2. 设置配置信息
首先要在resources目录下创建配置文件,配置信息可以直接从官网复制粘贴
https://mybatis.org/mybatis-3/zh/index.html
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
-
3. 获取配置信息
配置信息设置好之后就要获取配置信息,之后便是执行SQL语句,执行SQL语句就需要执行SQL的对象(万物皆对象)
MyBatis提供了一个类SqlSessionFactory来替我们获取sql执行对象
如何使用可以从官网复制粘贴
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
4. 获取SQL执行对象
我们可以通过sqlSessionFactory来获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
-
5. 执行SQL语句
众所周知我们Java程序必须得要CRUD,然后我们来逐个分析他们的异同以及它们的注意事项
这边采用更为高效简便的Mapper代理开发模式
Mapper代理开发
Mapper代理开发是体现***约定大于配置***思想的一个典型案例
首先我们可以先去idea上下载MyBatisX这款插件以便提高开发效率
首先我们在java.com.company包下面创建一个新包名mapper(一定要叫mapper,不然框架无法识别,约定大于配置!!!)
然后在这个包里创建一个接口XXXMapper接下我们都以UserMapper为例
创建完接口后我们在resources目录下创建一个和接口一模一样的(包括目录和文件名)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">
<mapper namespace="com.suo.mapper.UserMapper">
</mapper>
我们需要做的就是修改mapper标签中namespace属性值为接口的路径,然后我们就可以进行快乐的SQL了
select
首当其冲就是select
我们首先在接口中写方法比如说
User selectByName(String name);
然后插件会自动帮我们在配置文件中生成select标签和sql语句我们只需要对sql语句进行修改即可
<select id="selectByName" resultType="com.suo.pojo.User">
select * from t_user where name = #{name};
</select>
其中#{}相当于JDBC中的占位符?
${}相当于JDBC中对SQL进行字符串的拼接这样会导致sql注入问题,所以无脑用#{}就好了
对与传入参数和SQL语句中参数的对应关系如果只一个参数传入那么传入参数就是占位符中的数
如果有多个那么就需要用到注解了
User select(@Param("name") String name, @Param("password") String password);
<select id="select" resultType="com.suo.pojo.User">
select * from t_user where name = #{name} and password = #{password};
</select>
MyBatis会自动通过注解帮我创建一个Map键值对集合注解里面的是键,然后会把注解后面的参数传给对应sql语句里名同名的值
然后我们还可以通过传入对象的方式传参,MyBatis底层会自动把把属性和属性值经行封装,其余的和上面一样
第三种方式是传入一个Map集合这个就不多说和上面一样的
insert
操作和select其实是一样的在UserMapper接口中声明方法,剩下的插件会帮我们完成的
这个得重点讲一讲
因为mySql默认是关闭事务的所以我们得手动提交事务否则数据会添加失败
重要的事情说三遍
手动提交事务!!!
手动提交事务!!!
手动提交事务!!!
sqlSession.commit();
delete
update
这两没啥好讲的和上面select一模一样
-
6. 关闭资源
最后就是要关闭资源了
sqlSession.close();
动态SQL
说MyBatis比JDBC强的一个很重要的因素就是动态SQL
如果业务现在想要查找一个用户通过它的id和账户
select * from t_user where id = #{id} and root = #{root}
很简单对吧,那么假如我现在要求不修改源码的情况下只通过账户或者id的方式查找一个用户的信息你该怎么办呢
MyBatis提供了一个标签
我们可以这么写
select * from tb_brand where
<if test="id != null">
id = #{id}
</if>
<if test="root != null and root != ''">
and root = #{root};
</if>
有了这个if做个条件判断问题是不是就解决了呀,但是问题又来了如果第一个if为false或者说两个if都为false那么会发生什么呢
select * from tb_brand where
and root = #{root};
select * from tb_brand where
这两句sql是不是显然就是错的呀所以MyBatis又提供了标签
select * from tb_brand where
<where>
<if test="id != null">
id = #{id}
</if>
<if test="root != null and root != ''">
and root = #{root};
</if>
</where>
where标签会自动帮我们判断并修正语法错误的
同理的Mybaties还为我们提供了标签用于修正update语句可能出现的语法错误
相当于switch case 语句
<foreach collection="array" item="id" separator="," open="("close=")">#{id} 用于批量删除