- 一、JDBC访问数据库
- 二、mybatis连接数据库
- 1. mybatis特性:
- 2. MyBatis工作原理
- 3. Spring 集成Mybatis(IDEA)
- 三、总结
-
Java连接数据库之前已经说过,通过JDBC查询数据库数据,一般需要以下七个步骤:
(1) 加载JDBC驱动
(2) 建立并获取数据库连接
(3) 创建 JDBC Statements 对象
(4) 设置SQL语句的传入参数
(5) 执行SQL语句并获得查询结果
(6) 对查询结果进行转换处理并将处理结果返回
(7) 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet) -
存在的问题
1.数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
2.Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
- 解决方法
二、mybatis连接数据库 1. mybatis特性:1.数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间
2.我们可以考虑不把SQL语句写到Java代码中,而是将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。然后
通过SQL语句的key值去获取对应的SQL语句。
(1) 使用连接池对连接进行管理
(2) SQL和代码分离,集中管理(mapper.xml)
(3) 参数映射和动态SQL
(4) 结果集映射
(5) 缓存管理
(6) 重复SQL提取
(7) 插件机制
(1) 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
(2) 加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3) 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
(4) 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
(5) Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
(6) MappedStatement 对象:在 Executor 接口的执行方法中有一个MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
(7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
(8) 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
- 新建项目,选择spring initializr,initializr service URL使用default就行
- 项目元数据界面的选择,其实选择默认的,不过我Java Version改为了8,Artifa 改为了mybatis_demo,注意项目名不能大小写混杂,然后点next就行了
- 选择依赖,web里面要把spring web选上,然后在SQL里面把Mybatis framework、MySQL Driver、JDBC API选上,最后可以在旁边的selected Dependence里查看自己选择的项,点击next之后点击finish就完成项目建立了。
- 打开查看pom.xml文件,可以看到刚刚我们选择的依赖已经自动添加到我们的文件中了
- 修改application.properties文件,application.properties是项目自带的配置文件,也可以建立其他的配置文件,可以在文中添加端口、数据源、mydatis等相关数据
- 建立项目文件User.Java
package com.example.mybatis_demo.user; public class User { private int userid; private String username; private String password; public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "userid=" + userid + ", username='" + username + ''' + ", password='" + password + ''' + '}'; } }
- 新建UserMapper.Java
package com.example.mybatis_demo.mapper; import com.example.mybatis_demo.user.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { public ListfindAllUser(); public List findUserByUserId(int userid); }
- 新建UserService.Java
package com.example.mybatis_demo.service; import com.example.mybatis_demo.mapper.UserMapper; import com.example.mybatis_demo.user.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired(required=false) public UserMapper userMapper; public ListfindAllUser(){ return userMapper.findAllUser(); } public List findUserByUserId(int userid){ return userMapper.findUserByUserId(userid); } }
- 新建UserController.Java
package com.example.mybatis_demo.controller; import com.example.mybatis_demo.service.UserService; import com.example.mybatis_demo.user.User; 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("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/getAllUser") public ListfindAll(){ return userService.findAllUser(); } @RequestMapping("/getUserByUserID/{userid}") public List findUserByUserId(@PathVariable int userid){ return userService.findUserByUserId(userid); } }
- 建立mapper文件,在里面建立UserMapper.xml,这个xml文件就是映射文件,sql语句就是在这里面写的,注意具体包名位置(namespace)与刚刚建立的usemapper类要对应。
- MySQL方面,首先是创建表格,结构如下,表名为user
- 在浏览器中输入http://localhost:8080/user/getAllUser就可以看到查询结果,查询的语句是在映射文件里的,而路径由来是UserController.Java里确定的,查询结果如下图。
在IDEA里用jdbc和用mybatis连接区别还是蛮大的:用jdbc是需要导入一个包,而sql语句则是直接在代码里构造;而用mybatis则是需要加入依赖,且需要配置,但sql语句与代码是分开的,直接在映射文件里更改sql就行了。当数据库的变更比较频繁时或查询的需求变化时,mybatis的使用更有利于代码的维护。
参考文献
从JDBC到Mybatis的改进
MyBatis-从JDBC到Spring整合MyBatis
IDEA使用mybatis连接MySQL