Mybitis介绍和快速搭建
1 什么是Mybatis
1.1 MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 ——Mybatis官网
优点:
1、与JDBC相比,减少了50%的代码量
2、最简单的持久化框架,简单易学
3、SQL代码从程序代码中彻底分离出来,可以重用
4、提供XML标签,支持编写动态SQL
5、提供映射标签,支持对象与数据库的ORM字段关系映射,支持缓存、连接池、数据库移植....
缺点:
1、SQL语句编写工作量大,熟练度要高
2、数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异
1.2 JDBC简单回顾
JDBC(Java Data Base Connection,java数据库连接)是一种用于执行 SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言 编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口, 使数据库开发人员能够编写数据库应用程序
优点:运行期:快捷、高效
缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台
1.2.1JDBC核心api
1.DriverManger 连接数据
2.Connection 连接数据库的抽象
3.Statement 执行Sql
4.ResultSet 数据结果集
2 快速搭建Mybatis
2.1 导入Mybatis
2.1.1.直接下载mybatis的jar包,并放置到项目的classpath路径中
2.1.2 通过maven导入,将mybatis的依赖代码置于 pom.xml 文件中
还需要导入mysql-connector 的包。
版本选择:官方兼容说明
Connector/J 5.1 提供与 MySQL 的所有功能的兼容性,包括 5.6、5.7 和 8.0。
Connector/J 8.0 提供与 MySQL 5.6、5.7 和 8.0 的所有功能的兼容性。
2.2 创建mybatis全局配置文件
<?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"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/EmpMapper.xml"/>
</mappers>
</configuration>
2.3 创建数据库表
这里因为演示就简单创建一个emp表
2.4 在java中创建emp表对应的pojo(entity)类
package com.lingyue.pojo;
/**
* @author 和悦
* @date 2021/10/13 22:04
*/
public class Emp {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", username='" + username + ''' +
'}';
}
}
2.5创建对应的mappper.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.lingyue.pojo.EmpMapper">
<select id="selectEmp" resultType="com.lingyue.pojo.Emp">
select * from Emp where id = #{id}
</select>
</mapper>
2.6写一个测试类测试一下sql
/**
* @author 和悦 vx:lingyuefh
* @date 2021/10/13 22:43
*/
public class MybatisTest {
SqlSessionFactory sqlSessionFactory;
/**
* 创建sqlSessionFactory
* @throws IOException
*/
@BeforeAll
public void before() {
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 基于statementId的方式去执行sql
* @throws IOException
*/
@Test
public void testMybatis() {
try (SqlSession session = sqlSessionFactory.openSession()) {
Emp emp = (Emp) session.selectOne("com.lingyue.pojo.EmpMapper.selectEmp", 1);
System.out.println("基于statementId的方式去执行sql,emp:"+emp);
}
}
}
2.7基于mapper接口实现
2.7.1添加mapper接口
/**
* @author 和悦 vx:lingyuefh
* @date 2021/10/13 22:54
*/
public interface EmpMapper {
/**
* 根据id查询Emp实体
* xml方式
* @param id
* @return
*/
Emp selectEmp(Integer id);
}
2.7.2修改EmpMapper.xml的namespace
修改前
<mapper namespace="com.lingyue.pojo.EmpMapper">
修改后
<mapper namespace="com.lingyue.mapper.EmpMapper">
注意:EmpMapper.xml和EmpMapper需要放在相同层级的包下
2.7.3添加mybatis的配置文件里mapper的接口(resource要删掉)
<mappers>
<!--<mapper resource="EmpMapper.xml"/>-->
<mapper class="com.lingyue.mapper.EmpMapper"></mapper>
</mappers>
2.7.4测试一下
/**
* 基于接口绑定的方式(xml)
* 方法步骤:
* 1.新建mapper接口
* 2.添加mapper中的对应方法
* 注意:sql中参数要在方法中声明
* 3.添加mybatis全局配置文件中的mapper接口
*/
@Test
public void testMybatis2(){
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper empMapper = session.getMapper(EmpMapper.class);
Emp emp = empMapper.selectEmp(1);
System.out.println("基于接口绑定的方式(xml),emp:"+emp);
}
}
2.8用注解来写sql(可以和xml共存)
2.8.1注解
/**
* @author 和悦 vx:lingyuefh
* @date 2021/10/13 22:54
*/
public interface EmpMapper {
/**
* 根据id查询Emp实体
* @param id
* @return
*/
@Select("SELECT * FROM emp WHERE id = #{id}")
Emp selectEmp(Integer id);
}
2.8.2测试一下
/**
* 基于接口绑定的方式(注解)
*/
@Test
public void testMybatis3(){
try (SqlSession session = sqlSessionFactory.openSession()) {
EmpMapper empMapper = session.getMapper(EmpMapper.class);
Emp emp = empMapper.selectEmp2(1);
System.out.println("基于接口绑定的方式(注解),emp:"+emp);
}
}