MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
框架概念
框架,就是软件的半成品,完成了软件开发过程中的通用操作,程序员只需很少或者不用进行加工就能够实现特定的功能,从而简化开发人员在软件开发中的步骤,提高开发效率。
- MVC框架:简化Servlet的开发步骤,如【SpringMVC】。
- 持久层框架:完成数据库操作的框架,如【MyBatis】。
- 胶水框架:Spring。
原始jdbc缺点分析
原始jdbc开发存在的问题如下:
- 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能。
- sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
- 查询操作时,需要手动将结果集中的数据手动封装到实体中;插入操作时,需要手动将实体的数据设置到 sql 语句的占位符位置。
应对上述问题给出的解决方案:
- 使用数据库连接池初始化连接资源
- 将sql语句抽取到xml配置文件中
- 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
Mybatis简介
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis 通过 xml 或注解的方式将要执行的各种 statement配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的sql语句。
最后 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
MyBatis是一个半自动的ORM框架。
MyBatis特点:
- 支持自定义SQL、存储过程。
- 对原有的JDBC进行了封装,几乎消除了所有JDBC代码,让开发者只需关注SQL本身。
- 支持XML和注解配置方式自定完成ORM操作,实现结果映射。
Mybatis快速入门
1. 导入MyBatis的坐标和其他相关坐标
1 2 3 4 5 6 7 8 9 10 11 12 13
| <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency>
|
2. 创建MyBatis配置文件
在 resources 中创建名为 mybatis-config.xml 的文件,在 mybatis-config.xml 文件配置数据库连接信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?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="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> <environment id="oracle"> <transactionManager type=""></transactionManager> <dataSource type=""></dataSource> </environment> </environments> </configuration>
|
3. 创建数据表
tb_students |
|
4. 编写实体类
Student.java |
|
5. 创建DAO接口,定义操作方法
StudentDao.java |
|
6. 创建DAO接口的映射文件
在 resources 目录下,新建名为 mappers
的文件夹,在 mappers
中新建名为 StudentMapper.xml
的映射文件(根据模板创建。在映射文件中对DAO中定义的方法进行实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?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.qfedu.dao.StudentDAO">
<insert id="insertStudent"> insert into tb_students(stu_num,stu_name,stu_gender,stu_age) values(#{stuNum},#{stuName},#{stuGender},#{stuAge}) </insert>
<delete id="deleteStudent"> delete from tb_students where stu_num=#{stuNum} </delete>
</mapper>
|
7. 将映射文件添加到主配置文件
mybatis-config.xml |
|
8. 单元测试
添加单元测依赖
1 2 3 4 5
| <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
|
在被测试类名后alt+insert — 选择Test
StudentDao.java |
|
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class StudentDAOTest {
@org.junit.Test public void insertStudent() {
try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(is); SqlSession sqlSession = factory.openSession(); StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class); int i = studentDAO.insertStudent(new Student(0, "10001", "张三", "男", 21)); sqlSession.commit(); System.out.println(i); } catch (IOException e) { e.printStackTrace(); } }
@org.junit.Test public void deleteStudent() { } }
|
MyBatis的映射文件概述