JDBCTemplate和MySQL连接技术详解(下)

SQL动态参数绑定

场景:

向数据库添加一条数据,字段数据由用户输入决定。

在这里插入图片描述

思路:

用户通过界面,输入数据并提交给Java程序,java程序通过JDBC技术,将数据插入到MySQL中。

在这里插入图片描述

1. 字符串拼接

💡JDBC中的SQL语句本质上是一个String字符串。可以通过把参数和SQL进行String拼接。

语法:

String sql = "insert into t_person values(null,'"+arg1+"',"+arg2+",'"+arg3+"','"+arg4+"','"+arg5+"')";
String sql = "select * from t_person where id = "+id变量;

示例

# 参数
String name = "宇希";
String sex = "男";
int age = 28;
String mobile = "15533368877";
String address = "北京";

# 绑定
String sql = "insert into t_person values(null,'"+name+"',"+age+",'"+sex+"','"+mobile+"','"+address+"')";
2. 占位符

💡使用**?标记动态参数在SQL中位置,然后使用编码,动态将参数绑定到?站位**的位置。

语法:

① SQL中使用?标记站位

注意:?站位只能表示数据,其他(sql关键词、表名、字段名等)都不能使用?站位。

insert into t_person values(null,?,?,?,?,?);

② 动态绑定参数

注意,参数绑定的参数位置和顺序必须和?站位保持一致。

1. 增删改DML的方法参数绑定
update(String sql, @Nullable Object... args);

2. DQL查询语句的方法参数绑定
query(String sql, RowMapper<T> rowMapper, @Nullable Object... args);

示例:

# 1. 参数
String name = "宇希";
String sex = "男";
int age = 28;
String mobile = "";
String address = "";

# 2. SQL并使用?站位
String sql = "insert into t_person values(null,?,?,?,?,?)";

# 3. 动态参数绑定并发送SQL
jdbcTemplate.update(String sql, name,age,sex,mobile,address);


3. SQL注入

💡通过输入特殊的参数拼接SQL语句,进而破坏原有的SQL语句的含义,然后非法获取数据库数据或者进行非法数据库操作,是一种常见的web安全漏洞。

场景:用户通过输入username和password,判断是否能够登录成功。

SQL注入参数:

String adminName = "xiaohei'-- ";//真实用户名后添加'-- ,后面的内容会被注释掉
String adminPassword = "1234567";//密码错误,但也能登录成功
  • 字符串拼接

在这里插入图片描述

  • ?站位
    在这里插入图片描述

  • 结论

    ?站位方式可以防止SQL注入问题。

4. 总结
字符串拼接?站位
相同动态拼接sql中的数据参数动态拼接SQL中的数据参数
不同可以绑定非数据的参数:表名、字段名、SQL关键字只能绑定数据,不能绑定其他SQL关键词和表名字段名
有SQL注入风险可以防止SQL注入。
建议场景适用于拼接表名、字段名、SQL关键词适用于拼接数据参数

四 连接池

问题:

  1. 每次JDBC访问MySQL,都需要一个Connection对象。
  2. 一个Connection对象创建,需要经历(开辟内存空间、初始化数据、建立java和MySQL之间的io连接,最后完成Connection的创建),这个过程会消耗CPU资源和JVM内存资源。
  3. 如果使用完Connection,就销毁掉,会让Connection对象创建消耗的资源白白浪费掉。

解决思路:

1. 事先创建好一个管理器容器,内部准备好一定数量的连接池。(只做一次)
2. 当Java访问数据库需要用连接的时候, 直接从连接池中获取一个conn对象。(避免了创建conn过程消耗的时间,效率高。)
3. 使用完毕conn之后,将conn还回连接池。(以备重复利用)

在这里插入图片描述

连接池:

💡对一定数量的Connection对象,进行池化管理,可以重复利用connection对象,节约CPU和JVM内存资源。

编码:

//1 创建,并配置DataSource
  String url = "jdbc:mysql://localhost:3306/baizhi?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai";
  String username = "root";
  String password = "123456";
  DataSource dataSource = new DriverManagerDataSource(url,username,password);

五 异常调试

1. 常见JDBC异常

SQLException: No value specified for parameter 1

  • 错误信息:控制台输入对应的值后 抛出SQL异常

    在这里插入图片描述

  • 原因: sql语句中使用了?占位符,但是没有给占位符赋值

    //执行sql
    PreparedStatement pstm = conn.prepareStatement("delete from t_product where product_name=?");
    //执行sql
    pstm.executeUpdate();
    
  • 解决方案:

    给?占位符赋值即可;

      //执行sql
    PreparedStatement pstm = conn.prepareStatement("delete from t_product where product_name=?");
    //这里给 ? 占位符   赋值
    pstm.setString(1,name);
    
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要使用JdbcTemplate连接MySQL数据库,您需要进行以下步骤: 1. 确保您的项目中已添加了相关的依赖。对于Spring Boot项目,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 在您的应用程序配置文件中,配置数据库连接信息。例如,在application.properties文件中,添加以下内容: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 请将"your_database_name"替换为您要连接数据库名称,"your_username"和"your_password"分别替换为您的数据库用户名和密码。 3. 创建一个JdbcTemplate bean。您可以在Spring Boot的配置类或任何其他适当的地方创建它。以下是一个示例: ```java @Configuration public class JdbcConfig { @Autowired private DataSource dataSource; @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource); } } ``` 这将使用上述配置中的数据源创建一个JdbcTemplate实例。 现在,您可以在应用程序中使用JdbcTemplate来执行数据库操作了。例如,您可以使用它执行SQL查询、插入、更新等操作。 希望这能帮到您!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值