目录
一、由JDBC到Mybatis
1.什么是Mybatis
2.JDBC查询数据库数据步骤
3.JDBC演变为Mybatis
二、IDEA环境下Mybatis与JDBC进行改造示例对比
(一)JDBC操作数据库
1.Navicat数据表
2.IDEA创建项目
3.引入JDBC的jar包
?(二) MyBatis应用
? ? ? 1.创建项目
?2.Mysql建表(Navicat)
?3.配置文件
4.测试结果
?5.完整功能
一、由JDBC到Mybatis
1.什么是Mybatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
2.JDBC查询数据库数据步骤
? 加载JDBC驱动;
? 建立并获取数据库连接;
? 创建 JDBC Statements 对象;
? 设置SQL语句的传入参数;
? 执行SQL语句并获得查询结果;
? 对查询结果进行转换处理并将处理结果返回;
? 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet);
3.JDBC演变为Mybatis
(1)问题:数据库连接频繁的开启和关闭,造成了资源的浪费以及影响系统的性能
解决问题:数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间。
(2)但是现在连接池多种多样,可能存在变化,有可能采用DBCP的连接池,也有可能采用容器本身的JNDI数据库连接池
解决问题:我们可以通过DataSource进行隔离解耦,我们统一从DataSource里面获取数据库连接,DataSource具体由DBCP实现还是由容器的JNDI实现都可以,所以我们将DataSource的具体实现通过让用户配置来应对变化。
(3)我们使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处:
第一,可读性很差,不利于维护以及做性能调优。
第二,改动Java代码需要重新编译、打包部署。
第三,不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得通过+号在Java进行拼凑)。
解决问题:我们可以考虑不把SQL语句写到Java代码中,那么把SQL语句放到哪里呢?首先需要有一个统一存放的地方,我们可以将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。然后通过SQL语句的key值去获取对应的SQL语句。
(4)执行SQL语句、获取执行结果、对执行结果进行转换处理、释放相关资源是一整套下来的。假如是执行查询语句,那么执行SQL语句后,返回的是一个ResultSet结果集,这个时候我们就需要将ResultSet对象的数据取出来,不然等到释放资源时就取不到这些结果信息了。我们从前面的优化来看,以及将获取连接、设置传入参数、执行SQL语句、释放资源这些都封装起来了,只剩下结果处理这块还没有进行封装,如果能封装起来,每个数据库操作都不用自己写那么一大堆Java代码,直接调用一个封装的方法就可以搞定了。
解决问题:我们分析一下,一般对执行结果的有哪些处理,有可能将结果不做任何处理就直接返回,也有可能将结果转换成一个JavaBean对象返回、一个Map返回、一个List返回等`,结果处理可能是多种多样的。从这里看,我们必须告诉SQL处理器两点:第一,需要返回什么类型的对象;第二,需要返回的对象的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。
(5)由于我们将所有SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差不多,有些可能是SELECT后面那段不同、有些可能是WHERE语句不同。有时候表结构改了,那么我们就需要改多个地方,不利于维护。
解决问题:当我们的代码程序出现重复代码时怎么办?将重复的代码抽离出来成为独立的一个类,然后在各个需要使用的地方进行引用。对于SQL重复的问题,我们也可以采用这种方式,通过将SQL片段模块化,将重复的SQL片段独立成一个SQL块,然后在各个SQL语句引用重复的SQL块,这样需要修改时只需要修改一处即可。
二、IDEA环境下Mybatis与JDBC进行改造示例对比
(一)JDBC操作数据库
1.Navicat数据表
打开navicat,选择数据库T1,新建查询
?新建一个user表然后输入代码并运行
?user
create table user(
id int primary key auto_increment,
name varchar(50),
password varchar(50),
email varchar(60),
birthday date
)character set utf8 collate utf8_general_ci;
?插入数据,并运行
?
代码
insert into user(name,password,email,birthday) values('zs','123456','zs@sina.com','1999-12-04');
insert into user(name,password,email,birthday) values('lisi','123456','lisi@sina.com','2001-12-04');
insert into user(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','2003-12-04');
2.IDEA创建项目
1.打开IDEA,File->New->Project? ? ? ? ?
?2.选择java,然后next->next
?3.命名项目,然后点击finish
?4.新建包右击scr->new->java class
?
?Date
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Date{
static final String driverName="org.gjt.mm.mysql.Driver";
static final String dbUrl="jdbc:mysql://localhost:3306/t";
static final String userName="root";
static final String password="123456";
public static void main(String[] args) {
// TODO Auto-generated method stubt
Connection conn = null;
Statement stmt = null;
try{
Class.forName(driverName);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(dbUrl,userName,password);
// 执行查询
System.out.println(" 实例化Statement对象...");
stmt = (Statement) conn.createStatement();
String sql;
sql = "SELECT id, name, password, email FROM user";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
String email = rs.getString("email");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 姓名: " + name);
System.out.print(", 密码: " +password);
System.out.print(", 邮箱: " +email);
System.out.print("\n");
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 错误
e.printStackTrace();
}finally{
// 关闭资源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
3.引入JDBC的jar包
1.file->project structure
?2.Moudles->Dependencies->+->jars or directories
?3.导入jar包
?
?4.应用成功
?
?5.运行
?6.运行结果
?
?(二) MyBatis应用
? ? ? 1.创建项目
?(1)用IDEA新建项目,new-peoject->spring initializr->next
?(2)Java Version ,点击next
?(3)选择web->Sring Web->next,SQL->JDBC API,mybatis framework,mysql driver
?
?2.Mysql建表(Navicat)
1.创建学生students,插入信息
create table students(
no int primary key auto_increment,
name varchar(50),
age int
)character set utf8 collate utf8_general_ci;
insert into students(no,name,age) values('1','张三','20');
insert into students(no,name,age) values('2','李四','26');
insert into students(no,name,age) values('3','王五','29');
insert into students(no,name,age) values('4','张二','44');
insert into students(no,name,age) values('5','小小','64');
?3.配置文件
1.application.properties代码
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/t?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
?2.(1)项目src->main->java->com? 下分别创建包:controller、entity、mapper、service,用来实现控制层、实体层、映射层、业务层
(2)src->main->resources? 下创建mapper包用于存放*Mapper.xml文件:
(3)创建entity实体类Students
?
?Students
package com.example.demo.entity;
public class Students {
private int no;
private String name;
private int age;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"no=" + no +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
(4)创建Mapper映射操作StudentsMapper类:
?
package com.example.demo.mapper;
import com.example.demo.entity.Students;
import com.example.demo.entity.Students;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface StudentsMapper {
public List<Students> findAllStudent();
List<Students> findStudentByno(int no);
}
(5)创建Mapper映射对应的StudentsMapper.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.example.demo.mapper.StudentsMapper">
<resultMap id="result" type="com.example.demo.entity.Students">
<result column="no" jdbcType="INTEGER" property="no" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>
<select id="findAllStudent" resultType="com.example.demo.entity.Students">
select * from students;
</select>
<select id="findStudentByno" resultType="com.example.demo.entity.Students">
select * from students where no=#{no};
</select>
</mapper>
(6)创建service业务StudentsService类:
package com.example.demo.service;
import com.example.demo.entity.Students;
import com.example.demo.mapper.StudentsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentsService {
@Autowired(required = false)
public StudentsMapper studentsMapper;
public List<Students> findAllStudent() {
return studentsMapper.findAllStudent();
}
public List<Students> findStudentByno(int no) {
return studentsMapper.findStudentByno(no);
}
}
?
(7)创建 controller控制层UsersController类:
?
package com.example.demo.controller;
import com.example.demo.entity.Students;
import com.example.demo.service.StudentsService;
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")
class UserController {
@Autowired
private StudentsService studentsService;
@RequestMapping("/getAllStudent")
public List<Students> findAllStudent(){
return studentsService.findAllStudent();
}
@RequestMapping("/getStudentByno/{no}")
public List<Students> findUserByStudentId(@PathVariable int no){
return studentsService.findStudentByno(no);
}
}
4.测试结果
(1)点击运行
?(2)打开浏览器输入http??????://localhost:8080/Student/getAllStudent/
?
? ?输入:http://://localhost:8080/Student/getStudentByno/1
?5.完整功能
StudentsMapper
package com.example.demo.mapper;
import com.example.demo.entity.Students;
import com.example.demo.entity.Students;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface StudentsMapper {
public List<Students> findAllStudent();
public List<Students> findStudentByno(int no);
public List<Students> findStudentByname(String name);
public int insertStudent(Students student);
public int updateStudent(Students student);
public int deleteStudent(Students student);
}
?StudentController
package com.example.demo.controller;
import com.example.demo.entity.Students;
import com.example.demo.service.StudentsService;
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")
class StudentsController {
@Autowired
private StudentsService studentService;
@RequestMapping("/getAllStudent")
public List<Students> findAll(){
return studentService.findAllStudent();
}
@RequestMapping("/getStudentByno/{no}")
public List<Students> findUserByStudentId(@PathVariable int no){
return studentService.findStudentByno(no);
}
@RequestMapping("/getStudentByname/{name}")
public List<Students> findStudentByname(@PathVariable String name){
return studentService.findStudentByname(name);
}
@RequestMapping("/insertStudent")
public Students insertStudent(Students student){
return studentService.insertStudent(student);
}
@RequestMapping("/updateStudent")
public int updateStudent(Students student){
return studentService.updateStudent(student);
}
@RequestMapping("/deleteStudent")
public int deleteStudent(Students student){
return studentService.deleteStudent(student);
}
}
StudentService
package com.example.demo.service;
import com.example.demo.entity.Students;
import com.example.demo.mapper.StudentsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentsService {
@Autowired(required = false)
public StudentsMapper studentMapper;
public List<Students> findAllStudent() {
return studentMapper.findAllStudent();
}
public List<Students> findStudentByno(int no) {
return studentMapper.findStudentByno(no);
}
public List<Students> findStudentByname(String name){
return studentMapper.findStudentByname(name);
}
public Students insertStudent(Students student){
studentMapper.insertStudent(student);
return student;
}
public int updateStudent(Students student){
return studentMapper.updateStudent(student);
}
public int deleteStudent(Students student){
return studentMapper.deleteStudent(student);
}
}
StudentMapper.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.example.demo.mapper.StudentsMapper">
<resultMap id="result" type="com.example.demo.entity.Students">
<result column="no" jdbcType="INTEGER" property="no" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>
<select id="findAllStudent" resultType="com.example.demo.entity.Students">
select * from students;
</select>
<select id="findStudentByno" resultType="com.example.demo.entity.Students">
select * from students where no=#{no};
</select>
<select id="findStudentByname" resultType="com.example.demo.entity.Students">
select * from students where name=#{name};
</select>
<insert id="insertStudent" parameterType="com.example.demo.entity.Students" keyProperty="no" useGeneratedKeys="true">
insert into students(name,age) values (#{name},#{age});
</insert>
<update id="updateStudent" parameterType="com.example.demo.entity.Students">
update students set name=#{name},age=#{age} where no=#{no};
</update>
<delete id="deleteStudent" parameterType="com.example.demo.entity.Students">
delete from where no=#{no};
</delete>
</mapper>
查找:http://://localhost:8080/Student/getStudentByname/张二
插入一条信息:http://localhost:8080/Student/insertStudent?name=明明&age=123
?插入成功
?
?总结:JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作;MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
参考文献:(8条消息) JDBC演变到Mybatis过程_luzhensmart的专栏-CSDN博客
MyBatis-从JDBC到Spring整合MyBatis_zgliulin-CSDN博客
IDEA数据库连接:从JDBC到Mybatis_WOOZI9600L2的博客-CSDN博客
(8条消息) IDEA实训——从JDBC到Mybatis_一只特立独行的猪 ?的博客-CSDN博客
|