从JDBC到MyBatis
MyBatis介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
MyBatis的优点
- 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接。
- 很好的与各种数据库兼容,开发人员不需要考虑数据库的差异性。
- MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,解除sql与程序代码的耦合,便于统一管理和优化,并可重用。
- 提供XML标签,支持编写动态SQL语句。
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
JDBC编程的步骤:
1、 加载数据库驱动
2、 创建并获取数据库链接
3、 创建jdbc statement对象
4、 设置sql语句
5、 设置sql语句中的参数(使用preparedStatement)
6、 通过statement执行sql并获取结果
7、 对sql执行结果进行解析处理
8、 释放资源(resultSet、preparedstatement、connection
一、Mybatis 测试
1. 新建项目
选择SpringInitializr
:
填写Group等,Next:
选择项目依赖:
Finish:
2. 配置项目并编写代码
定义数据库:
根据自己的数据库名、用户名和密码,修改application.properties:
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
在com.example.demo下创建四个package(controller、entity、mapper、service):
在entity下创建类Student:
package com.example.demo.entity;
public class Student {
private int stu_id;
private String stu_name;
private int stu_age;
public int getStu_id() {
return stu_id;
}
public void setStu_id(int stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getStu_age() {
return stu_age;
}
public void setStu_age(int stu_age) {
this.stu_age = stu_age;
}
@Override
public String toString() {
return "Student{" +
"stuID=" + stu_id +
", stuName='" + stu_name + "'" +
", stuAge=" + stu_age +
"}";
}
}
在mapper下创建接口StuMapper:
StuMapper:
package com.example.demo.mapper;
import com.example.demo.entity.Student;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface StuMapper {
public List<Student> findAllStudent();
public List<Student> findStudentByStudentID(int stuID);
}
在resources下创建目录mapper:
在刚刚创建的resources下的mapper下创建StuMapper.xml文件:
StuMapper:
<?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.example.demo.mapper.StuMapper">
<resultMap id="result" type="com.example.demo.entity.Student">
<result column="stu_id" jdbcType="INTEGER" property="stu_id" />
<result column="stu_name" jdbcType="VARCHAR" property="stu_name" />
<result column="stu_age" jdbcType="INTEGER" property="stu_age" />
</resultMap>
<select id="findAllStudent" resultType="com.example.demo.entity.Student">
select * from student;
</select>
<select id="findStudentByStudentID" resultType="com.example.demo.entity.Student">
select * from student where stu_id=#{stuID};
</select>
</mapper>
在包Service下创建类StudentService:
StudentService:
package com.example.demo.service;
import com.example.demo.entity.Student;
import com.example.demo.mapper.StuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentService {
@Autowired(required = false)
public StuMapper stuMapper;
public List<Student> findAllStudent(){
return stuMapper.findAllStudent();
}
public List<Student> findStudentByStuID(int stuID){
return stuMapper.findStudentByStudentID(stuID);
}
}
在包controller下创建类StudentController:
StudentController:
package com.example.demo.controller;
import com.example.demo.entity.Student;
import com.example.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("/getAllStudent")
public List<Student> findAll(){
return studentService.findAllStudent();
}
@RequestMapping("/getStudentByStudentID/{stuID}")
public List<Student> findStudentByStudentID(@PathVariable int stuID){
return studentService.findStudentByStuID(stuID);
}
}
所有结构如下:
3. 测试
运行项目:
成功运行:
打开http://localhost:8080/student/getAllStudent
打开http://localhost:8080/student/getStudentByStudentID/1001
测试成功!
二、总结
- 与JDBC相比,减少了50%以上的代码量
- 最简单的持久化框架、小巧简单易学
- SQL代码从程序代码中彻底分离出来,可重用
- 提供XML标签,支持编写动态SQL
- 提供映射标签,支持对象与数据库的ORM字段关系映射