概述
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和
Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
为什么要使用MyBatis?
MyBatis是一个【半自动化】的持久化层框架。
JDBC:
SQL夹在Java代码块里,耦合度高导致硬编码内伤
维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA:
长难复杂SQL,对于Hibernate而言处理也不容易
内部自动生产的SQL,不容易做特殊优化。
基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
MyBatis-HelloWorld
教程也可以参考官方文档:https://mybatis.net.cn/getting-started.html
1、导包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
<build>
<!-- **.xml写在src找不到问题解决方案 -->
<resources>
<resource>
<!-- directory:指定资源文件的位置 -->
<directory>src/main/resources</directory>
<includes>
<!-- “**” 表示任意级目录 “*”表示任意任意文件 -->
<!-- mvn resources:resources :对资源做出处理,先于compile阶段 -->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) -->
<filtering>false</filtering>
</resource>
</resources>
</build>
2、写配置
1、mybatis_config.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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--mappers标签:引入自己编写的每一个接口的xml实现文件
resource属性:引入xml实现文件的位置
-->
--
//在此注册让Mybatis知道我们的dao实现xml文件在哪里
---
<mappers>
<mapper resource="mapper/employee.xml"/>
</mappers>
</configuration>
2、接口
public interface employeemapper {
Employee getEmployee(Integer id);
}
3、创建sql映射文件
mapper标签
namespace属性:名称空间;写接口的全类名
select标签:用来定义一个查询操作
id属性:方法名;相当于对于某个方法的实现
resultType属性:方法运行后的返回值类型(查询操作必须指定)
#{属性名}:代表取出传递过来的某个参数的值
-----------------------------------------------------------------------
<?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.lly.mapper.employeemapper">
<select id="getEmployee" resultType="com.lly.pojo.Employee">
select * from employee where id = #{id}
</select>
</mapper>
3、测试
@Test
public void testGetEmployee() throws IOException {
String resource = "mybatis-config";
InputStream inputStream = Resources.getResourceAsStream(resource);
--
//1、根据全局配置文件创建出一个sqlSessionFactory
//SqlSessionFactory:是SqlSession工厂,负责创建SqlSession对象
//SqlSession对象:sql会话---(代表和数据库的一次会话)
--
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取和数据库的一次会话;与getConnection();拿到一条连接
SqlSession session = sqlSessionFactory.openSession();
try {
//3、使用SqlSession操作数据库,获取到dao接口的实现
employeemapper mapper = session.getMapper(employeemapper.class);
Employee employee = mapper.getEmployee(1);
System.out.println(employee);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
}
补充:
SqlSessionFactory的使用
增删改需要设置事务
方式一、—要在方法中最后try-catch-finally关闭资源,增删改需要手动提交事务
方式二、—openSession(true);设置是否自动提交事务,true为自动提交,false为不自动提交
eg:
//openSession(true)设置自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
细节:
两个文件细节:
1、全局配置文件:mybatis-config.xml;指导mybatis正确运行的一些全局设置
2、SQL映射文件:Employee.xml;相当于是对mapper接口的一个实现描述细节;
细节二:
1、获取到的是接口的代理对象;mybatis自动创建的
2、SqlSessionFactory和SqlSession;
SqlSessionFactory:创建SqlSession对象,Factory只new一次就行
SqlSession:相当于connection,是和数据库进行交互的,也是一次和数据库的一次会话,就应该创建一个新的的SqlSession,一次与数据库连接,就创建一次会话