MyBatis介绍及快速搭建
MyBatis的配置文件详解
MyBatis基于XML的详细使用 输入参数 输出结果处理 高级应用 动态SQL 一、二级缓存 逆向工程 分页插件
SSM框架整合
MyBatis-plus的使用 对MyBatis的增强
JDBC(Java Database Connection) 用于执行SQL语句的Java API.
MyBatis 底层是对JDBC基础上进行的封装 (建议看下MyBatis 源码)
========================================== JDBC 核心API
1、DriverManager 链接数据库
2、Connection 连接数据库的抽象
3、Statment 执行SQL
4、ResultSet 数据结果集
运行快捷高效 代码量大 繁琐异常处理 不支跨平台
========================================
DBUtils
Apache开发的工具类 简化了JDBC操作 少写代码 工具类
==========================================
数据库操作框架 持久化映射框架 ORM(object relational mapping) 对象关系映射
Hibernate 是对ORM贯彻最彻底的框架 只要声明好 javabean 维护xml 能够自动建好表 code first
操作数据库使用对象方式不用SQL语句
跨数据库平台
缺点:优化SQL 复杂业务复杂的SQL使用门槛高
========================================
JDBCTemplate
内嵌到Spring框架中 支持AOP
缺点:必须与Spring框架一起使用 不支持数据库跨平台 默认没有缓存。
=================================
什么是MyBatis?
Mybatis是操作数据库的 是一款优秀的持久层框架 半自动的ORM 。
它支持自定义SQL 存储过程以及高级映射。
MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集工作。
MyBatis可以通过配置简单的XML或注解来配置和映射原始类型表、接口和Java POJO(Plain Old Java Objects 普通老式Java对象)为数据库中的记录。
优点:
1、与JDBC相比 减少了50%的代码量
2、最简单的持久化框架 简单易学
3、SQL代码从程序代码中彻底分离出来 可以重用。
4、提供XML标签 支持编写动态SQL
5、提供映射标签 支持对象与数据库的ORM字段关系映射
支持缓存 连接池 数据库移植。。。
缺点:
1、SQL语句编写工作量大 熟练度要高
2、数据库移植性比较差 如果需要切换数据库的话 SQL语句会有很大的差异
---------------------
MyBatis使用
1、添加pom依赖(mybatis核心jar和数据库版本对应版本的驱动jar包)
2、新建数据库和表
3、添加mybatis全局配置文件
4、修改全局配置文件中数据源配置信息
5、添加数据库表对应的pojo对象(相当于我们以前的实体类)
6、添加对应的pojoMapper.xml(里面维护了所有的sql)
修改namespace :如果是satementID 没有特殊的要求
如果是接口绑定方式必须等于接口的完整限定名
7、修改mybatis全局配置文件 修改Mapper
1、pom.xml加载MyBatis
<!--MyBatis核心依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
MySQL 连接器 APIs 与 Java 对应版本 dev.mysql.com/doc/index-c…
2、设置MyBatis配置文件
可以利用Intellj提供的database工具生成url 可以通过mysql-connect-java找驱动名字
这个POJO后面讲
<?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="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- <property name="url" value="${url}"/>-->
<property name="url" value="jdbc:mysql://localhost:3306/emp"/>
<!-- <property name="username" value="${username}"/>-->
<property name="username" value="root"/>
<!-- <property name="password" value="${password}"/>-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
mapper 就是存储SQL的文件 通常一个实体类 对应一个Mapper 对应一张表
3、创建实体类
package com.kdy.pojo;
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 + ''' +
'}';
}
}
4、 创建Mapper
<?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.kdy.pojo.EmpMapper">
<select id="selectEmp" resultType="com.kdy.pojo.Emp">
select * from Emp where id = #{id}
</select>
</mapper>
5、修改MyBatis配置文件的Mapper
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
6、使用
MyBatis 3版本之前叫 iBatis
//基于StatementId 的方式去执行SQL
@Test
public void test01() throws IOException {
// String resource = "org/mybatis/example/mybatis-config.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//从XML中构建 SqlSessionFactory
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper中 namespace="com.kdy.pojo.EmpMapper" + <select id="selectEmp"
// namespace + id
Emp emp = (Emp)sqlSession.selectOne("com.kdy.pojo.EmpMapper.selectEmp",1);
System.out.println(emp);
}
基于接口绑定的方式
1、新建数据访问层的接口:pojoMapper
2、添加mapper中对应的操作方法
2.1 方法名要和mapper中对应的操作的节点处的id要一致
2.2 返回类型要和mapper中对应的操作的节点的resultType要一致
2.3 mapper中对应的操作的节点的参数必须要在方法的参数中声明
3、Mapper.xml 中的namespace 必须要和接口的完整限定名一致 4、修改mybatis全局配置文件中的mappers 采用接口绑定的方式
<mapper class="com.kdy.mapper.EnpMapper"></mapper>
1、新建数据访问层接口
package com.kdy.mapper;
import com.kdy.pojo.Emp;
public interface EmpMapper {
// 根据id 查询Emp实体
//方法名 和 mapper文件中id一致
public Emp selectEmp(Integer id);
}
2、修改添加map中对应的操作方法
<?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.kdy.pojo.EmpMapper">-->
<mapper namespace="com.kdy.mapper.EmpMapper">
<select id="selectEmp" resultType="com.kdy.pojo.Emp">
select * from Emp where id = #{id}
</select>
</mapper>
3、修改mybatis 中 mapper配置文件 class
<?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="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- <property name="url" value="${url}"/>-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<!-- <property name="username" value="${username}"/>-->
<property name="username" value="root"/>
<!-- <property name="password" value="${password}"/>-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="EmpMapper.xml"/>-->
<mapper class="com.kdy.mapper.EmpMapper"></mapper>
</mappers>
</configuration>
4、注意 POJOMapper的 xml文件 和 接口文件在一个目录
编译后是在一个目录的
5、调用
SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//基于statementID 的方式 去执行SQL
@Test
public void test01() throws IOException {
// String resource = "org/mybatis/example/mybatis-config.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//从XML中构建 SqlSessionFactory
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper中 namespace="com.kdy.pojo.EmpMapper" + <select id="selectEmp"
// namespace + id
Emp emp = (Emp)sqlSession.selectOne("com.kdy.pojo.EmpMapper.selectEmp",1);
System.out.println(emp);
}
//基于接口绑定的方式
@Test
public void test02(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(1);
System.out.println(emp);
}
使用注解方式
package com.kdy.mapper;
import com.kdy.pojo.Emp;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
// 根据id 查询Emp实体
//方法名 和 mapper文件中id一致
@Select("select * from emp where id=#{id}")
public Emp selectEmp(Integer id);
}
使用注解方式 EmpMapper.xml 去掉 不用建
注解方式 sql和代码没有分离 复杂的sql有难度
XML方式实现简单的增删改查
1、XML实现相应语句
<?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.kdy.pojo.EmpMapper">-->
<mapper namespace="com.kdy.mapper.EmpMapper">
<select id="selectEmp" resultType="com.kdy.pojo.Emp">
select * from Emp where id = #{id}
</select>
<insert id="insertEmp">
insert into `emp`(`username`) values(#{username})
</insert>
<update id="updateEmp">
update `emp` set username=#{username} where id=#{id}
</update>
<delete id="deleteEmp">
delete from `emp` where id=#{id}
</delete>
</mapper>
2、写入接口方法
package com.kdy.mapper;
import com.kdy.pojo.Emp;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
// 根据id 查询Emp实体
//方法名 和 mapper文件中id一致
// @Select("select * from emp where id=#{id}")
public Emp selectEmp(Integer id);
public Integer insertEmp(Emp emp);
public Integer updateEmp(Emp emp);
public Integer deleteEmp(Integer id);
}
3、调用测试
package com.kdy.test;
import com.kdy.mapper.EmpMapper;
import com.kdy.pojo.Emp;
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 org.junit.Before;
import org.junit.Test;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
public class MybatisCURD {
SqlSessionFactory sessionFactory;
@Before
public void before() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void select(){
SqlSession sqlSession = sessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(1);
System.out.println(emp);
}
@Test
public void add(){
SqlSession sqlSession = sessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setUsername("测试名");
Integer integer = mapper.insertEmp(emp);
sqlSession.commit();
System.out.println(integer);
}
@Test
public void add01(){
//SqlSession sqlSession = sessionFactory.openSession(1); 开启自动提交
SqlSession sqlSession = sessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setUsername("自动提交");
try {
Integer integer = mapper.insertEmp(emp);
System.out.println(integer);
}catch (Exception ex){
sqlSession.rollback();
}finally {
sqlSession.close();
}
}
@Test
public void update(){
SqlSession sqlSession = sessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setId(5);
emp.setUsername("王二麻子");
mapper.updateEmp(emp);
sqlSession.commit();
}
@Test
public void delete(){
SqlSession sqlSession = sessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
mapper.deleteEmp(5);
sqlSession.commit();
}
}