一、Mybatis简介
1.1Mybatis简化JDBC
简介:
- Mybatis是一款优秀的持久层框架,用于简化JDBC开发
- Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了gppgle code,并且改名为Mybatis。2013年11月迁移到Github
- 官网:https://mybatis.org/mybatis-3/zh/index.html
- 持久层:
- 负责将数据保存到数据库的那一层代码
- JavaEE三层架构:表现层、业务层、持久层
- 框架:
- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
JDBC缺点:
- 1.硬编码
- 注册驱动,获取连接
- SQL语句
- 2.操作繁琐
- 手动设置参数
- 手动封装结果集
Mybatis简化JDBC
- 配置文件
- Mybatis将一些注册驱动的步骤写入配置文件中,将来直接读取配置文件里的信息就可以了
- SQL语句也是直接被抽取到配置文件中,在对应的配置文件中直接写SQL语句即可
- 参数封装通过映射的关系,就可以将结果封装起来,在调用时只需调用该映射中的方法直接使用。
Mybatis免除了几乎所有的JDBC代码以及设置参数和结果集的工作。
二、Mybatis快速入门
需求:查询user表中所有数据
- 1.创建user表,添加数据
- 2.创建模块,导入坐标
- 3.编写Mybatis核心配置文件 --> 替换连接信息,解决硬编码问题
- 4.编写SQL映射文件 --> 统一管理sql语句,解决硬编码问题
- 5.编码
- 1.定义pojo类
- 2.加载核心配置文件,获取SqlSessionFactory对象
- 3.获取SqlSession对象,执行SQL语句
- 4.释放资源
2.1创建user表,添加数据
- 在对应的mysql数据库中,先创建一个数据库
mybatis
,再建一个表,表名为tb_user
,创建代码如下:
create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender char(1), addr varchar(30) ); INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京'); INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津'); INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
2.2创建模块,导入坐标
- 1.创建一个Maven的项目
- 1.1点击File->NEW->Project
- 1.2.选择Maven->NEXT
- 1.3.在NAME中输入项目名称,点击Finish就创建好了
- 2配置
pom.xml
内的坐标 - 2.1根据mybatis官网上的步骤,需要将mybatis的依赖导入到
pom.xml
文件中,即如下代码:
<!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency>
- 2.2要连接数据库,就需要导入mysql驱动:
<!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency>
- 2.3单元测试:
<!-- junit单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency>
- 2.4为了观察方便,可以添加一些日志的依赖:
<!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <!-- 添加logback-classic依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 添加logback-core依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency>
- 再导入日志依赖的同时,还需要引入一个配置文件
logback.xml
将它放在resources
目录下,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- CONSOLE :表示当前的日志信息是可以输出到控制台的。 --> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern> </encoder> </appender> <logger name="com.practice" level="DEBUG" additivity="false"> <appender-ref ref="Console"/> </logger> <!-- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。 --> <root level="DEBUG"> <appender-ref ref="Console"/> </root> </configuration>
2.3编写Mybatis核心配置文件 --> 替换连接信息,解决硬编码问题
- 根据mybatis官网的提示,编写Mybatis核心配置文件需要配置一个xml文件,将此xml文件同样建立在
resources
目录下,文件中的内容在官网中的示例如下,我们需要修改其中的内容:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://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>
- 1.修改
value="${driver}"
中value
的值为"com.mysql.jdbc.Driver"
- 2.修改
value="${url}"
中value
的值为"jdbc:mysql:///数据库名?useSSL=false"
,注意,这里一定要仔细输入,写错任何一个字符都有可能运行失败 - 3.修改
value="${username}"
中value
的值为自己数据库的登录名(一般为root
) - 4.修改
value="${password}"
中value
的值为自己数据库的登录密码 resource="org/mybatis/example/BlogMapper.xml"
的值为对应的sql的映射文件,之后我们再回来修改
2.4编写SQL映射文件 --> 统一管理sql语句,解决硬编码问题
- 编写SQL映射文件,我们取名为
UserMapper.xml
,添加到resources
目录下,官网提供如下写法:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://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>
- 1.其中
namespace
为命名空间,作为sql映射的唯一标识,在这里我们取名为test
- 2.这里
select
表示的是查询的sql,对应还有添加、修改、删除等的写法,这里我们用的是查询,id可以定义为id="selectAll"
- 3.
resultType
表示返回值的类型,这里由于我们要查找tb_user表中的全部数据,所以返回的可以是一个User集合,即resultType="com.practice.pojo.User"
,关于"com.practice.pojo.User"
在下面定义pojo类中讲解 - 4.编写sql语句,直接在
select * from Blog where id = #{id}
位置写入sql语句select * from tb_user;
即可
- 此文件配置好后,上一步的映射文件就可以修改了,即
resource="UserMapper.xml"
2.5编码
2.5.1定义pojo类
- 这个类的路径在上面编写SQL映射文件中写过,就是
"com.practice.pojo.User"
,是在src.main.java
目录中的,最后的java文件User.java
中与对应mysql数据库的tb_user
表的字段值相同,只是将它们以java类的方式封装了起来,对应如下代码:
package com.practice.pojo; /** * @Author YJ * @Date 2023/7/24 10:47 * Description:User */ public class User { private Integer id; private String userName; private String password; private String gender; private String addr; public User() { } public User(Integer id, String userName, String password, String gender, String addr) { this.id = id; this.userName = userName; this.password = password; this.gender = gender; this.addr = addr; } /** * 获取 * * @return id */ public Integer getId() { return id; } /** * 设置 * * @param id */ public void setId(Integer id) { this.id = id; } /** * 获取 * * @return userName */ public String getUserName() { return userName; } /** * 设置 * * @param userName */ public void setUserName(String userName) { this.userName = userName; } /** * 获取 * * @return password */ public String getPassword() { return password; } /** * 设置 * * @param password */ public void setPassword(String password) { this.password = password; } /** * 获取 * * @return gender */ public String getGender() { return gender; } /** * 设置 * * @param gender */ public void setGender(String gender) { this.gender = gender; } /** * 获取 * * @return addr */ public String getAddr() { return addr; } /** * 设置 * * @param addr */ public void setAddr(String addr) { this.addr = addr; } public String toString() { return "User{id = " + id + ", userName = " + userName + ", password = " + password + ", gender = " + gender + ", addr = " + addr + "}"; } }
2.5.2加载核心配置文件,获取SqlSessionFactory对象
- 同样在
src.main.java
下创建一个测试类取名为(随意的)MybatisDemo.java
,放在com.practice
包下
- 1.加载mybatis的核心配置文件,获取SqlSessionFactory,可以参考官网:
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
resource
的值就是之前配置的mybatis文件"mybatis-config.xml"
- 2.获取SqlSession对象,执行SQL
SqlSession sqlSession = sqlSessionFactory.openSession();
2.5.3获取SqlSession对象,执行SQL语句
- 1.执行sql语句并打印结果
//这里就是调用的`UserMapper.xml`中的sql语句,通过test查找到selectAll执行sql语句 List<Object> users = sqlSession.selectList("test.selectAll"); System.out.println(users);
- 2.释放资源
sqlSession.close();
- 最后结果如下
- 完整的测试代码如下:
package com.practice; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * @Author YJ * @Date 2023/7/24 10:53 * Description:Mybatis快速入门 */ public class MybatisDemo { public static void main(String[] args) throws IOException { //1.加载mybatis的核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取SqlSession对象,执行SQL SqlSession sqlSession = sqlSessionFactory.openSession(); //3.执行sql语句 List<Object> users = sqlSession.selectList("test.selectAll"); System.out.println(users); //4.释放资源 sqlSession.close(); } }
总结
通过这篇文章,我们可以对Mybatis有了基本的认识,并能初步掌握Mybatis的用法与特性,欢迎各位小伙伴三连+关注!!!