Springboot项目测试原生JDBC连接
- 加载依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- Main函数访问代码实操
public static void main(String [] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
//连接
String url = "jdbc:mysql://127.0.0.1:3306/(自己的数据库名字)?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String username = "root";
String password = "xdclass.net";
//获取连接对象,并连接数据库
Connection connection = DriverManager.getConnection(url,username,password);
//获取语句对象
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from video");
while (resultSet.next()){
System.out.println("视频标题:"+resultSet.getString("title"));
}
statement.close();
}
- 原生jdbc缺点:
- 每次要加载驱动,连接信息是硬编码
- sql和java代码耦合一起,改动不易
- 参数设置缺少灵活性
- 处理结果集麻烦,不能自动映射到实体类
- 连接资源不能复用,资源浪费
所以我们需要用 ORM 框架:
- 对数据库的表和POJO(Plain Ordinary Java Object)Java对象的做映射的框架
MyBatis
- 一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射
- 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- 通过简单的 XML 或注解来配置和映射 Java对象 到 数据库中的记录
官方地址:https://mybatis.org/mybatis-3/
核心流程
- 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心
- SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得
- SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
- 工厂设计模式里面 需要获取SqlSession ,里面提供了在数据库执行 SQL 命令所需的所有方法
- https://mybatis.org/mybatis-3/zh/getting-started.html 基本流程
实际步骤:
- 先添加 maven 依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 使用JDBC链接mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
- 配置mybatis-config.xml
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/***写自己数据库的名字?useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="***"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/VideoMapper.xml"/>
</mappers>
</configuration>
- 配置VideoMapper.xml(假设我们实现一个视频类)
- mapper 文件是用来编写 sql 语句的
- 注意 :取java对象的某个值,属性名大小写要一致
<?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">
<!--名称空间一般需要保持全局唯一,最好是和 dao 层的 java 接口一致,
可以直接映射 sql 语句到对应的方法名称和参数
mybatis 是使用接口动态代理-->
<mapper namespace="com.onlineStar.onlineCreate.demo.dao.VideoMapper">
<!-- 这里写的就是之前的那个注解里的ID, 当前 mapper 下需要唯一
resultType:sql 查询结果集的封装
-->
<select id="selectById" resultType="com.onlineStar.onlineCreate.demo.domain.Video">
select * from video where id = #{Video_id}
</select>
</mapper>
#{value} : 推荐使用, 是java的名称
${value} : 不推荐使用,存在sql注入风险
- 写对应的实体类,dao 层以及 SqlSession
package com.onlineStar.onlineCreate.demo.dao;
import com.onlineStar.onlineCreate.demo.domain.Video;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface VideoMapper {
/**
* 根据视频 ID 查找视频对象
* @param videId
* @return
*/
Video selectById(@Param("Video_id") int videId);//这个注解相当于起一个别名,当有多个参数就必须要写了
@Select("select * from video")
List<Video> selectList();
}
package com.onlineStar.onlineCreate.demo;
import com.onlineStar.onlineCreate.demo.dao.VideoMapper;
import com.onlineStar.onlineCreate.demo.domain.Video;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class SqlSessionDemo {
public static void main(String[] args) throws IOException {
String resources = "config/mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resources);
//构建 Session 工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//本来sqlSession是需要关闭的,但是用这样的语法是可以自动的关闭
//获取 Session
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
Video video = videoMapper.selectById(44);
System.out.println(video.toString());
//下面的方式也可以,这种适用于简单的 sql 查询,没有复杂的表的嵌套
List<Video> videoList = videoMapper.selectList();
System.out.println(videoList);
}
}
}
就可以输出了,我没写出来 Video 里面具体的类,这个可以自己定义就好