目录
本笔记学习B站视频【尚硅谷】MyBatis零基础入门教程(细致全面,快速上手)_哔哩哔哩_bilibili
1.什么是mybatis
以前都是使用JDBC完成代码和数据库的交互。
Mybatis是一个半自动(还有一部分SQL语句需要自己写)持久层框架,支持自定义SQL(自己写SQL,维护方便)、存储过程和高级映射。
使用Mybaits几乎免除了JDBC代码、手动设置参数(比如SQL语句中的拼接参数)和获取结果集。
使用简单的XML或者注解来配置和原始映射。将接口直接映射成数据库中的记录(只需要有接口,直接对应XML文件实现对数据的操作)
(可以理解为Mybatis封装了JDBC)
应用的三层架构:
表示层:展现给用户的界面
业务逻辑层:业务逻辑
持久层\:操作数据库的层
2.JDBC Hibernate Mybatis比较
JDBC:SQL夹杂JAVA代码,耦合高,硬编码问题,修改维护SQL麻烦,代码冗长,开发效率低
Hibernate:
(1)操作简单,简单的增删改查容易.
(2)但是内部自动产生SQL,不容易做特殊优化.
(3)长难SQL需要绕过框架.
(4)基于全映射的全自动框架,默认会把表中的字段全部查出来,如果只需要表中几个字段需要自己写SQL
(5)反射操作太多,数据库性能下降
Mybatis:
(1)轻量,性能高,开发效率略逊于Hibernate,但可以接受
(2)SQL和JAVA编码分开,SQL专注业务,JAVA专注业务
3.Mybatis环境搭建
idea新建项目,配置maven,添加maven的module,在module的pom.xml文件中添加依赖
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
4.Mybatis核心配置文件
Mybatis的核心配置文件,用于配置连接数据库的环境和Mybatis的全局配置信息.但是将mybatis整合到Spring或者Springboot后,该配置文件可以省略,这些工作交给Springboot/spring做.配置文件自己创建mybatis-config.xml,放在resource文件夹中.文件内容见官方文档,如下:
<?xml version="1.0" encoding="UTF-8" ?> <!--xml文件声明,声明版本和编码--> <!--mybatis的约束--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"><!--enviroments,配置连接数据库的环境--> <environment id="development"> <transactionManager type="JDBC"/><!--事务管理器类型--> <dataSource type="POOLED"> <!--数据源,填写自己的数据库信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/clerk"/> <property name="username" value="root"/> <property name="password" value="ruiyang1999"/> </dataSource> </environment> </environments> <mappers> <!--引入映射文件--> <mapper resource="mappers/UserMapper.xml"/> </mappers> </configuration>
5.Mapper接口
相当于DAO接口,但是只有接口,无需实现类.调用接口中的方法回直接对应XML文件中的SQL语句执行.Mapper接口里面就是操作数据库的方法
根据数据库的表创建实体类,再创建Mapper接口文件
(1)实体类写好实体类的属性后,右击/generate/constructor,setter和getter,toString可以自动生成构造函数,getset和toString方法
(2)Mapper接口
public interface UserMapper {
/*
接口文件(Interface)要和映射文件(XML)两点一致
1.映射文件中的namespace的值为接口文件的全类名
2.映射文件中SQL语句的id要为接口文件中相应接口函数的函数名
*/
/*
添加用户信息
*/
public int insertUser();
/*
删除用户信息
*/
public int deleteUser();
/*
修改用户信息
*/
public int updateUser();
/*
根据id查询一个用户信息
*/
public User getUserById();
/*
查询所以用户信息
*/
public List<User> getAllUser();
}
6.创建映射文件
Mybatis是一个ORM持久层框架
ORM Object Relationship Mapping
Object指JAVA中的实体类的对象,Relationship指关系型数据库,Mapping指二者之间的对应关系
JAVA | 数据库 |
类 | 表 |
属性 | 字段 |
对象 | 元组 |
在resource中创建映射文件,一般一个接口类对应一个实体类,对应数据库中一个表,对应一个映射文件,映射文件命名一般和接口类命名一样,只是后缀改为.xml.
接口类:
public interface UserMapper {
/*
接口文件(Interface)要和映射文件(XML)两点一致
1.映射文件中的namespace的值为接口文件的全类名
2.映射文件中SQL语句的id要为接口文件中相应接口函数的函数名
*/
/*
添加用户信息
*/
public int insertUser();
/*
删除用户信息
*/
public int deleteUser();
/*
修改用户信息
*/
public int updateUser();
/*
根据id查询一个用户信息
*/
public User getUserById();
/*
查询所以用户信息
*/
public List<User> getAllUser();
}
映射文件:
注意,一般增删改返回值设为int或者void即可,但是查需要设置为实体对象.
mybatis会帮我们处理查询的结果,但是编写查询语句时需要指明我们查询需要的结果类型resultType或者resultMap.
resultType:设置默认的映射关系(实体类的属性和数据库中字段名一致)
resultMap:设置自定义的映射关系(实体类的属性和数据库字段名不一致,对多一或者一对多关系)
<?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="com.atguigu.mybatis.mapper.UserMapper"><!--namespace需要和相应接口的全类名保持一致-->
<!--insertUser方法-->
<insert id="insertUser">
insert into user values(1,'admin','123456',23,'男','20958@qq.com')
</insert>
<!--updateUser方法-->
<update id="updateUser">
update user set username = 'user1' where id = 1
</update>
<!--deleteUser方法-->
<delete id="deleteUser">
delete from user where id = 1
</delete>
<!--getUserById方法-->
<!--查询必须设置resultType或者resultMap
resultType:设置默认的映射关系(实体类的属性和数据库中字段名一致)
resultMap:设置自定义的映射关系(实体类的属性和数据库字段名不一致,对多一或者一对多关系)-->
<select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
select * from user where id = 1
</select>
<!--getAllUser方法-->
<select id="getAllUser" resultType="com.atguigu.mybatis.pojo.User">
select * from user
</select>
</mapper>
调用接口类中的方法时,通过全类名找到XML映射文件,通过方法名找到SQL语句
7.测试
myBatis提供了一个操作数据库的会话对象,sqlsession.
SqlSessionFactoryBuilder - SqlSessionFactory - SqlSession - getMapper() - insertUser()
public class MybatisTest {
@Test
public void testMybatis() throws IOException {
/*
myBatis提供了一个操作数据库的会话对象,sqlsession
*/
//以字节输入流方式,加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactoryBuilder---SSF的builder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory--SSF
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取mybatis操作数据库的会话对象SqlSession,SqlSession代表JAVA程序和数据库之间的对话
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//默认不自动提交事务,openSession参数设置为为true,自动提交
//获取mapper接口对象,getMapper方法输入一个类,返回该类的一个实现类的实例对象.该方法低层使用代理模式
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//测试插入功能
//int res = mapper.insertUser();
//测试更新功能
//int res = mapper.updateUser();
//测试查询一个人功能
//User user = mapper.getUserById();
//测试查询多个人功能
List<User> userList = mapper.getAllUser();
//测试删除功能
//int res = mapper.deleteUser();
//提交事务
//sqlSession.commit();
//System.out.println("username:"+user.getUsername());
userList.forEach(user -> System.out.println(user));
}
}
8.添加log日志
在pom.xml文件中添加依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
在resource文件夹建立日志配置文件log4j.xml,文件内容如下
等级level分为:FATAL - ERROR