一、简介
1. JDBC
JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。 JDBC API库常用用法
- 制作到数据库的连接
- 创建SQL或MySQL语句
- 执行SQL或MySQL查询数据库
- 查看和修改所产生的记录
架构 JDBC 的 API 支持两层和三层处理模式进行数据库访问,但一般的 JDBC 架构由两层处理模式组成:
- JDBC API: 提供了应用程序对 JDBC 管理器的连接。
- JDBC Driver API: 提供了 JDBC 管理器对驱动程序连接。
2. MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
3. JDBC开发问题
JDBC查询数据库数据步骤
- 加载JDBC驱动
- 建立并获取数据库连接
- 创建 JDBC Statements 对象
- 设置SQL语句的传入参数
- 执行SQL语句并获得查询结果
- 对查询结果进行转换处理并将处理结果返回
- 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
问题
- 频繁创建数据库连接对象,释放,造成系统资源浪费,影响系统性能,利用率低
- 可读性差,sql语句定义、参数设置、结果集处理存在硬编码。发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
- 对 ResultSet 查询的结果,需要自己封装为 List,重复代码较多
- 业务代码和数据库的操作混用
优化
- 使用数据库连接池对连接进行管理
- SQL语句统一存放到配置文件
- SQL语句变量和传入参数的映射以及动态SQL
- 动态SQL语句的处理
- 对数据库操作结果的映射和结果缓存
- SQL语句的重复
4. MyBatis改进
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能
- Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
- 不用编写关闭资源代码。
二、项目搭建
- 创建项目
勾选Web项,Spring Web SQL中勾选JDBC API Mybaits Fragment 和Mysql Driver - 项目创建完成
三、项目配置
使用该种方式创建项目,则在pom.xml文件中自动添加依赖
- 修改application.properties文件,application.properties是项目自带的配置文件,也可以建立其他的配置文件,可以在文中田间端口、数据源、mydatis等相关数据
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/runboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.username=root //账户
spring.datasource.password=****** //密码
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
- 建立项目文件
package com.wxcmybaits.mybaits_example.controller;
import com.wxcmybaits.mybaits_example.entity.User;
import com.wxcmybaits.mybaits_example.service.UserService;
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 List<User> findAll(){
return userService.findAllUser();
}
@RequestMapping("/getUserByUserID/{userid}")
public List<User> findUserByUserId(@PathVariable int userid){
return userService.findUserByUserId(userid);
}
}
package com.wxcmybaits.mybaits_example.entity;
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 + '\'' +
'}';
}
}
package com.wxcmybaits.mybaits_example.mapper;
import com.wxcmybaits.mybaits_example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> findAllUser();
public List<User> findUserByUserId(int userid);
}
package com.wxcmybaits.mybaits_example.service;
import com.wxcmybaits.mybaits_example.entity.User;
import com.wxcmybaits.mybaits_example.mapper.UserMapper;
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 List<User> findAllUser(){
return userMapper.findAllUser();
}
public List<User> findUserByUserId(int userid){
return userMapper.findUserByUserId(userid);
}
}
- 建立mapper文件,在里面建立UserMapper.xml文件,这个xml文件就是映射文件,sql语句就是在这里面写的,注意具体包名位置(namespace)与刚刚建立的usemapper类要对应
UserMapper.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.wxcmybaits.mybaits_example.mapper.UserMapper">
<resultMap id="result" type="com.first.mybatis_example.entity.User">
<result column="userid" jdbcType="INTEGER" property="userid" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
</resultMap>
<select id="findAllUser" resultType="com.first.mybatis_example.entity.User">
select * from user;
</select>
<select id="findUserByUserId" resultType="com.first.mybatis_example.entity.User">
select * from user where userid=#{userid};
</select>
</mapper>
- Mysql创建表格
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT COMMENT 'useriduser',
`username` char(20) NOT NULL DEFAULT '' COMMENT 'username',
`password` char(10) NOT NULL DEFAULT '' COMMENT 'password',
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '4545646', '546546'), ('2', '553453', 'h5354354'), ('3', '4355354', '543643453');
四、运行
在浏览器中输入http://localhost:8080/user/getAllUser就可以看到查询结果,查询的语句是在映射文件里的,而路径由来是UserController.Java里确定的,。 http://localhost:8080/user/getUserByUserID/1 - 问题:
修正 - 问题
Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could no 修正
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency>
导入jar包同数据库版本相同
- 问题
修正
五、小结
- mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
- 加载映射文件。该文件中配置了操作数据库的 SQL 语句,需要在MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
- 用jdbc是需要导入一个包,而sql语句则是直接在代码里构造,用mybatis则是需要加入依赖,且需要配置,数据库的变更比较频繁时或查询的需求变化时,mybatis的使用更有利于代码的维护。
六、 参考
IDEA2019开发Spring Boot整合Mybatis实现User的CRUD(增读更删) MyBatis从前世到今生一网打尽(全网最全,建议收藏) 2020-10-10: 传统JDBC开发存在的问题? Mybatis解决了JDBC编程哪些问题
|