JDBC 与 MyBatis 的基本用法及常见问题

简介: 本文介绍了 JDBC 与 MyBatis 的基本用法及常见问题,涵盖数据库连接、SQL 执行、资源管理、防止 SQL 注入等内容,并讲解了 Spring Boot 中的配置方式和 MyBatis 映射文件的使用。

try (
        Connection  connection = DriverManager.getConnection(url, "root", "123456");
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,username);
        statement.setString(2,password);
        ResultSet rs = statement.executeQuery();
)

上述代码为什么不可以?

总结

错误写法

问题

正确写法

try () 中调用方法

语法错误,无法编译

方法调用移至 try 块内

在括号内执行 executeQuery ()

结果集被提前关闭,无法使用

嵌套 try-with-resources

资源声明与方法调用混合

违反 try-with-resources 设计原则

严格分离资源声明和业务逻辑


核心原则:try 的括号内只能用于声明和初始化资源,所有业务逻辑(如设置参数、执行查询)必须放在 try 块内部。

jdbc-mybatias

jdbc写法:

?占位符必须使用预编译,使用预编译之后就不能在进行传参sql执行了

String sql = "select * from user where age >= ? and id <= ? ;"

; PreparedStatement statement = connection.prepareStatement(sql); ResultSet resultSet = statement.executeQuery();,

有占位符?,是不是必须预编译,

预编译之后在进行执行 ResultSet resultSet = statement.executeQuery()是不是不能传sql

@Test
    public void testUpdate() throws Exception {
        // 准备工作
        //1,加载驱动
        //Class.forName("com.mysql.cj.jdbc.Driver");//可以省略
        //2.获取数据库连接(建立java程序与mysql数据库通信桥梁)
        //  通过设置连接字符串、用户名、密码 获取数据库连接
        //    连接指定数据库字符串:协议://ip:port/数据库名 ,
        //    eg:jdbc:mysql://localhost:3306/db201
        //    jdbc:mysql: 协议
        //    localhost   ip
        //    3306   端口
        //    db201   数据库名
        //    如果连接本机数据库服务器可以简写为: jdbc:mysql:///db201
        String url = "jdbc:mysql://localhost:3306/db201";
        //    获取数据库连接api:会返回java.sql.Connection的实现类ConnectionImpl对象
Connection connection = DriverManager.getConnection(url, "root", "root");
        //3.创建执行SQL语句对象(运输货物的货车)
        Statement statement = connection.createStatement();
        //4.执行SQL(使用货车将sql语句运行给mysql数据库去执行)
        statement.executeUpdate("update user set username = 'abc222' where id = 1");
        //5.释放资源
        statement.close();
        connection.close();
    }

解决sql注入写法:

前期的定义不变,执行用?占位符
//4.执行SQL(使用货车将sql语句运行给mysql数据库去执行)
        String sql = "select * from user where username=? and password=?";
        try{
            //    获取数据库连接api:会返回java.sql.Connection的实现类ConnectionImpl对象
            connection = DriverManager.getConnection(url, "root", "root");
            //3.创建执行SQL语句对象(运输货物的货车)
            statement  = connection.prepareStatement(sql);//预编译
     statement.setString(1, username); //这里的数字1代表是第一个?(占位符)
            statement.setString(2, password);
            //4.执行sql语句
            rs = statement.executeQuery();//注意:预编译在执行sql语句的时候不用传递sql

mybatis写法 (使用代理对象)

1. 导入依赖

2.编写application.properties

# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/db201数据库名称
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# springboot项目运行端口号
server.port=8080

@Mapper //使用mybatis的注解代替@Repository,mybatis会对象当前类生成代理对象,spring会将代理对象加入spring容器管理  Dao层也可以叫做(Mapper后面更常用)

3.在接口中写sql语句

UserMapper

@Mapper //使用mybatis的注解代替@Repository,mybatis会对象当前类生成代理对象,spring会将代理对象加入spring容器管理
public interface UserMapper {  //即是Dao,不用创建实现类,由数据库厂商实现,所以使用动态代理,获取对象交给bean
    /**
     * mybatis会自动执行sql语句,并将返回的数据自动映射给List<User>
     *     如何映射? 答获取结果集的每一行数据,封装为User对象,将User对象添加到List集合中
     *     如何将一行数据映射封装成User对象? 答:数据库表中字段名与User类属性名相同会自动映射,使用反射技术
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}
调用:
   @Autowired
    private UserMapper userMapper;//注入的是UserMapper生成的代理对象
    
    @Test
    public void testFindAll() {
        List<User> userList = userMapper.findAll();
        userList.forEach(user->System.out.println(user));

xml写法:

创建xml文件

eg:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace="com.itheima.mapper.UserMapper" 名称空间映射关联接口-->
<mapper namespace="com.itheima.mapper.UserMapper">
    <!--映射 UserMapper接口的List<User> findAll2(); 关联sql语句
     <select>:执行查询sql语句,标签体是sql语句
     id="关联的方法名"  id的值要求唯一,所以在mybatis的接口开发里面不可以理由方法重载,否则会报错
     resultType="返回值类型",注意如果是集合List<T>只需要T的类型
     -->
    <select id="findAll2" resultType="com.itheima.pojo.User">
        select * from user
    </select>
    
    <!--
    XML映射文件的默认定义规则?
        a.XML文件名称与Mapper接口名称一致,并且放置在相同包下(同包同名)
        b.XML文件的namespace属性为Mapper接口全限定名一致。
        c.XML文件中sql语句的id与Mapper接口中的方法名一致。
    -->
</mapper>

1.类名要与mapper层的接口名一致

2.必须放在与启动类的包或者子包下

此时,接口中可以不写sql语句(均写在yml文件下)

SpringBoot配置文件:yml配置

简化版的application.properties 名称:application.yml

# 数据库连接信息
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db201
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
# 端口号配置
server:
  port: 8080
# mybatis日志配置
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

application.properties  application.yml   xml文件(前两种差不多)

配置类型

推荐文件名

存放位置

格式

通用配置

application.yml

src/main/resources/

YAML(推荐)

开发环境配置

application-dev.yml

src/main/resources/

YAML/Properties

生产环境配置

application-prod.yml

src/main/resources/

YAML/Properties

MyBatis 映射文件

UserMapper.xml

src/main/resources/mapper/

XML

名称基本固定(除非加参数指定)

xml文件(生成,在接口的mapper 哪里按alt+回车,自动生成xml文件,但路径要提前配置)


配置项

规则

命名规则

XML 文件必须与 Mapper 接口同名(如UserMapper.xml

)。

存放位置

1. 与接口同包(推荐)src/main/java/com/itheima/mapper/

或者逻辑同包或者子包:src/resource/com/itheima/mapper/

原理,编译后包名就都变成了com/itheima/mapper/,其他情况一律不行都要显式调用


2. 集中存放:src/main/resources/mapper/

核心配置

- namespace

必须为接口全限定名
- mapper-locations

需指向 XML 所在路径

@RequestBody 用于接收获取请求体json字符串数据 并 转换为java对象,要求对象的属性名与json字符串属性名一致

接受传过来的参数“id”

public Result findById(@PathVariable Integer id){  形参与传过来的参数名一致过来的

等价于@PathVariable(“id”) Integer id

相关文章
|
3月前
|
传感器 人工智能 自然语言处理
比亚迪座舱接入通义大模型,未来将联合打造更多AI智能座舱场景
比亚迪与阿里云深度合作,将通义大模型应用于智能座舱和营销服务。通过通义万相,腾势推出“AI壁纸”功能;借助通义星尘,实现“心理伴聊”等情感陪伴场景。阿里云Mobile-Agent智能体落地比亚迪座舱,支持复杂语音操作,如查询淘宝物流、订火车票等。该方案基于全视觉解决技术,具有强泛化能力,未来双方将持续拓展更多AI应用。
427 8
|
1月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
2月前
|
安全 Java 数据安全/隐私保护
Springboot应用开发-SpringBootSecurity
Spring Boot Security 是 Spring 提供的安全框架,集成了身份认证和授权功能,帮助开发者快速构建安全的应用程序。本篇博客将从功能介绍到配置和实践,带您全面了解 Spring Boot Security。
680 1
Springboot应用开发-SpringBootSecurity
|
10月前
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”-&gt;“Settings”-&gt;“Editor”-&gt;“Code Style”-&gt;“Java”中设置。批量生成时,可多选变量一次性生成。
1972 2
|
10月前
|
缓存 应用服务中间件 Linux
yum 命令下载软件包到本地
在 Linux 系统中,使用 `yum` 命令可以下载软件包但不安装。通过 `yum` 的下载缓存功能,可以快速获取所需软件包。常用命令包括:`yum list available` 列出可安装的软件包,`yum download nginx` 下载特定软件包,`yum download nginx-1.18.0` 下载特定版本,`yum download -resolve nginx` 下载软件包及其依赖,`yum download nginx -d /path/to/download/directory` 指定下载目录
1057 11
|
人工智能 API 语音技术
用Python解锁微软Edge的文本转语音服务
近来,TTS模型工具给大家也分享了不少,对于一些小白或有需要的人是提供了一个额外的选项。 但作为编程人员/研发人员,或者需要集成TTS服务的人来说,好像又有点麻烦。 今天就为大家分享一个非常有趣的项目—edge-tts。
|
SQL Java 关系型数据库
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
232 2
|
存储 Java 数据库连接
Spring Boot 配置主从数据库实现读写分离
Spring Boot 配置主从数据库实现读写分离
1202 0
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
292 6
|
存储 NoSQL 分布式数据库
【Flink】Flink分布式快照的原理是什么?
【4月更文挑战第21天】【Flink】Flink分布式快照的原理是什么?