Springboot项目测试原生JDBC连接

  1. 加载依赖包
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
  
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
</dependency>
  1. 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缺点:
  1. 每次要加载驱动,连接信息是硬编码
  2. sql和java代码耦合一起,改动不易
  3. 参数设置缺少灵活性
  4. 处理结果集麻烦,不能自动映射到实体类
  5. 连接资源不能复用,资源浪费

所以我们需要用 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 基本流程
实际步骤:
  1. 先添加 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>
  1. 配置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>
  1. 配置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注入风险
  1. 写对应的实体类,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 里面具体的类,这个可以自己定义就好