一、概述
what?
1.什么是mybatis?
mybatis是一个半自动的持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,具有延迟加载和缓存等特性
mybatis的开发方式有: 配置文件开发和注解开发
mybatis的配置文件开发有几大要素:
1️⃣核心配置文件、2️⃣pol.xml(mybatis、MySQL坐标)、3️⃣配置文件、4️⃣提供查询语句的接口、5️⃣实现方法。
mybatis的注解开发有几大要素:
1️⃣核心配置文件、2️⃣pol.xml(mybatis、MySQL坐标)、3️⃣注解以及查询提供的接口、4️⃣实现方法。
2.myBatis的执行流程
3.什么是ORM
ORM(Object Relational Mapping):对象映射关系,采用元数据(配置文件)来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
对象可以是java对象,关系可以指数据库中的关系模型。对象映射关系可以理解为将java中的一个类映射为数据库中的一张表,可以将对象中的各属性映射到数据库表中的各个字段。
why?
1.为什么mybatis是一个半自动的框架?
-
在mybatis在映射时,仅有基本的字段映射,对象数据以及对象的实际关系任然需要通过手动编写sql来实现和管理。
-
由于mybatis需要手写sql,使得与数据库的耦合性比较高,移植性比较差。
-
在日志系统方面,mybatis不是比较完善,仅有基本的记录功能
advantage!
1、相对于传统JDBC有哪些优势?
但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率。并且它的学习成本也比hibernate低很多
二、快速入门
以下部分步骤会涉及到一些文件配置方面的知识,这部分在下面的会专门谈到。
使用步骤
1️⃣添加MyBatis坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
2️⃣ 2、创建user数据表
3️⃣3、编写User实体类
4️⃣编写映射文件UserMapper.xml
该文件主要是用来存放sql语句和映射类型
<?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="userMapper">
<!--查询操作-->
<select id="findAll" resultType="user">
select * from user
</select>
<!--插入操作-->
<insert id="save" parameterType="Z.A.domain.User">
insert into user values (#{id},#{username},#{password}) <!-- #{password}:实体类的属性名-->
</insert>
<!--修改操作-->
<update id="update" parameterType="Z.A.domain.User" >
update user set username =#{username} ,password = #{password} where id = #{id}
</update>
<!--修改操作-->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
</mapper>
5️⃣ 编写核心文件SqlMapperConfig.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>
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--定义别名-->
<typeAliases>
<typeAlias type="Z.A.domain.User" alias="user"></typeAlias>
</typeAliases>
<!--数据源的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="Z.A.mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
6️⃣编写测试类
@Test
//查询操作
public void Test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印数据
System.out.println(userList);
//释放资源
sqlSession.close();
}
@Test
//插入操作
public void Test2() throws IOException {
//模拟user对象
User user = new User();
user.setUsername("tom");
user.setPassword("123456");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
sqlSession.update("userMapper.update",user);
//如果执行更新操作,要执行更新操作
sqlSession.commit();
//释放资源
sqlSession.close();
}
7️⃣输出结果(查询)
三、映射文件概述
图示
详解
- 约束头:对文件的格式和形式进行约束,如第一行指定该文件是xml类型,版本号1.0,指定编码是UTF-8;第二行则引入了mybatis,会在添加标签是给出相应的提示。
<?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参数为命名空间,与子标签的id组成查询语句,用法如下:
<mapper namespace="userMapper">
<selcte id="">
.....
</selcte>
</mapper>
- select/update/insert等,与父标签mapper一起组成查询语句
<mapper namespace="userMapper">
<!--查询操作-->
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
四、核心配置文件
图示:
🔍关于事务管理和数据源类型
事物管理: 事物管理分为两种,JDBC&MANAGED
数据源类型: 一共有如下几种,其中第二种常用
详解
💡层级关系
- environments标签:主要是配置数据源(数据库)环境,支持多环境配置如果都多环境,可以指定默认的环境名称
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
-mappers(映射文件)标签:该标签主要用于加载映射文件
<properties resource="jdbc.properties"></properties>
- typeAliases标签:可以给映射的实体对象定义别名,注意标签位置要遵循跟标签内的顺序原则,否则会导致跟标签报错。
<!--定义别名-->
<typeAliases>
<typeAlias type="Z.A.domain.User" alias="user"></typeAlias>
</typeAliases>
此外mybatis还提供了一些常见数据类型的别名,通过编写对应的别名可以自动识别数据类型。
5、相应API
6、注意的问题
在进行CRUD操作时,由于session工厂会调用openSessionAPI并返回给Sql会话对象,此时会默认开启事物,但不会提交事务。由于查询操作不涉及事务提交,而插入、修改、删除会对数据库数据进行改变。因此需要进行事务提交(commit)