1. 入门
1.1 框架介绍
- 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求
1.2 ORM介绍
- ORM(Object Relational Mapping):对象关系映射
- 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术
- 映射规则
- 数据表——>类
- 表中字段——>类中的属性
- 表数据——>实体对象
1.3 原始JDBC操作
- 原始的JDBC的操作存在的问题
- 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能
- sql语句在代码中硬编码,如果要修改sql语句,就要修改java代码,代码不易维护
- 查询操作时,需要手动将结果集中的数据封装到实体对象中
- 增删改查操作需要参数时,需要手动将实体对象的数据设置到sql语句的占位符
- 原始JDBC的操作问题解决方案
- 使用数据库连接池初始化连接资源
- 将sql语句抽取到配置文件中
- 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射
1.4 MyBatis介绍
- MyBatis
- MyBatis是一个优秀的基于Java的持久层框架,它内部封装了JDBC,使开发者只需要要关注sql语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等过程
- MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
- 最后MyBatis框架执行完SQL并将结果映射为Java对象并返回,采用ORM思想解决了实体和数据库映射的问题,对JDBC进行了封装,屏蔽了JDBC API底层访问细节,使我们不用与JDBC API打交道,就可以完成对数据库的持久化操作
- MyBatis官网:http://www.mybatis.org/mybatis-3/
1.5 入门案例
- 数据准备
- 在数据库中创建Student数据表
- 在java中编写Student实体类
public class Student { private Integer id; private String name; private Integer age; ... }
- 在数据库中创建Student数据表
- 导入jar包
mysql-connector-java-5.1.37-bin.jar
mybatis-3.5.3.jar
- 在src下创建一个映射配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis的DTD约束--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mapper:核心根标签 namespace属性:名称空间 --> <mapper namespace="StudentMapper"> <!-- select:查询功能的标签 id属性:唯一标识 resultType属性:指定结果映射对象类型 parameterType属性:指定参数映射对象类型 --> <select id="selectAll" resultType="student"> SELECT * FROM student </select> </mapper>
- 在src下创建一个核心配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis的DTD约束--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration 核心根标签--> <configuration> <!--引入数据库连接的配置文件--> <properties resource="jdbc.properties"/> <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--> <environments default="mysql"> <!--environment配置数据库环境 id属性唯一标识--> <environment id="mysql"> <!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--> <transactionManager type="JDBC"></transactionManager> <!-- dataSource数据源信息 type属性 连接池--> <dataSource type="POOLED"> <!-- property获取数据库连接的配置信息 --> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- mappers引入映射配置文件 --> <mappers> <!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 --> <mapper resource="StudentMapper.xml"/> </mappers> </configuration>
- 编写测试类
/* 控制层测试类 */ public class StudentController { //创建业务层对象 private StudentService service = new StudentServiceImpl(); //查询全部功能测试 @Test public void selectAll() { List<Student> students = service.selectAll(); for (Student stu : students) { System.out.println(stu); } } }
2. 相关API详解
2.1 Resources
- org.apache.ibatis.io.Resources:加载资源的工具类
- 核心方法
返回值 方法 说明 InputStream getResourceAsStream(String fileName) 通过类加载器返回指定资源的字节输入流
2.2 SqlSessionFactoryBuilder
- org.apache.ibatis.session.SqlSessionFactoryBuilder:获取SqlSession
- 核心方法
返回值 方法 说明 SqlSessionFactory build(InputStream is) 通过指定资源字节输入流获取SqlSession工厂对象
2.3 SqlSessionFactory
- org.apache.ibatis.session.SqlSessionFactory:获取SqlSession构建者对象的工厂接口
- 核心方法
返回值 方法名 说明 SqlSession openSession() 获取SqlSession构建者对象,并默认手动提交 SqlSession openSession(boolean autoCommit) 获取SqlSession构建者对象,如果参数为true,则开启自动提交事务
2.4 SqlSession
- org.apache.ibatis.session.SqlSession:构建者对象接口
- 作用:用于执行sql语句,管理事务,接口代理(获取代理对象)
- 核心方法
返回值 方法 说明 List selectList(String statement,Object parameter) 执行查询语句,返回List集合 T selectOne(String statement,Object parameter) 执行查询语句,返回一个结果对象 int insert(String statement,Object parameter) 执行新增语句,返回影响行数 int update(String statement,Object parameter) 执行修改语句,返回影响行数 int delete(String statement,Object parameter) 执行删除语句,返回影响行数 void commit() 提交事务 void rollback() 回滚事务 T getMapper(Class cls) 获取指定接口的代理实现类对象 void close() 释放资源 注意
- selectList中String statement参数书写规则:映射配置文件的namespace属性值.id属性值
- 开启事务是在获取SqlSession对象的时候将自动提交设置为false
3. 映射配置文件
3.1 介绍
- 映射配置文件包含了数据和对象之间的映射关系和要执行的SQL对象
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.StudentMapper">
<!--查询全部-->
<select id="findAll" resultType="student">
SELECT * FROM student
</select>
<!--根据条件查询-->
<select id="findOne" resultType="student" parameterType="java.lang.Integer">
SELECT * FROM student WHERE id = #{id}
</select>
<!--添加-->
<insert id="insert" parameterType="student">
INSERT INTO student VALUES ( #{id} , #{name} , #{age} )
</insert>
<!--修改-->
<update id