前两天在学习jdbc部分,发现在数据库插入一行数据时,运行的时候一直报错,原来是这些问题。,看看你的错误是不是和我一样吧。
首先是查看数据库表中id是否是递增序列
其次在连接池配置文件中在url后是不是添加了这样一行字&useServerPrepStmts=true&characterEncoding=utf8
把这两个问题注意到应该就不会在报错了
但是我现在还有一个未解决的问题就是,如果新增的数据是日期类型的如何通过jdbc导入到数据库中,不会定义日期类型的变量
package com.itcast.example;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.itcast.pojo.Goods;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
//产品数据的增删改查
public class goodsTest {
// 1查询所有 2.不需要参数 3.结果封装成为arrayList
@Test
public void testSelectAll() throws Exception {
// 1.todo 获取Connection
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接池链接
Connection connection = dataSource.getConnection();
// 2.todo 定义sql语句
String sql="select *from milk_tea";
// 3.todo 获取pstmt对象
PreparedStatement pstmt = connection.prepareStatement(sql);
// 4.todo 设置参数(此处无参数)
// 5.todo 执行sql并将查询结果用resultSet返回
ResultSet resultSet = pstmt.executeQuery();
ArrayList<Goods> list = new ArrayList<>();
// 6.todo 处理结果 将处理结果list<Goods>封装为 Goods对象装载到list集合
while (resultSet.next()){
// 获取对应的数据
String id = resultSet.getString(1);
String name = resultSet.getString(2);
String w = resultSet.getString(3);
Date date = resultSet.getDate(4);
int month = resultSet.getInt(5);
BigDecimal price = resultSet.getBigDecimal(6);
BigDecimal sale = resultSet.getBigDecimal(7);
// 封装对象
Goods goods = new Goods();
// 对象赋值
goods.setId(id);
goods.setName(name);
goods.setW(w);
goods.setDate((java.sql.Date) date);
goods.setMonth(month);
goods.setPrice(price);
goods.setSale(sale);
// 装载集合
list.add(goods);
}
System.out.println(list);
// 7.todo 释放资源
connection.close();
pstmt.close();
resultSet.close();
}
// 添加数据
// SQL: insert into supplier_info(supplier_name,city,addr,tel)values(?,?.?,?);
//参数: 除了id之外的所有参数
//结构:boolean
@Test
public void testAdd() throws Exception {
// 接收页面提交的参数
String supplierName="北京第一大供应商";
String city="北京";
String addr="北京大道";
String tel="1234567890";
// 1.todo 获取Connection
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接池链接
Connection connection = dataSource.getConnection();
// 2.todo 定义sql语句
String sql="insert into supplier_info(supplier_name,city,addr,tel)values(?,?,?,?);";
// 3.todo 获取pstmt对象
PreparedStatement pstmt = connection.prepareStatement(sql);
// 4.todo 设置参数(此处无参数)
pstmt.setString(1,supplierName);
pstmt.setString(2,city);
pstmt.setString(3,addr);
pstmt.setString(4,tel);
//执行sql
int count = pstmt.executeUpdate();
// 返回影响行数
System.out.println(count>0);
// 7.todo 释放资源
connection.close();
pstmt.close();
}
// * 测试日期
// * 作用1.从数据库日期转换为date对象,并将date对象按照格式输出
// * 作用2.将用户输入的日期(Date对象)转为String类型,然后调用sql语句插入数据库
// * 作用3.同时还可以判断用户输入的日期格式对不对
@Test
public void testAdd2() throws Exception {
// 接收页面提交的参数
String prod_name="小馒头";
String net_w="150g";
int month =3;
BigDecimal in_price= BigDecimal.valueOf(0.5);
BigDecimal sale_price= BigDecimal.valueOf(1);
// 1.todo 获取Connection
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接池链接
Connection connection = dataSource.getConnection();
// 2.todo 定义sql语句
String sql="insert into milk_tea(prod_name,net_w,valid_month,in_price,sale_price)values(?,?,?,?,?)";
// 3.todo 获取pstmt对象
PreparedStatement pstmt = connection.prepareStatement(sql);
// 4.todo 设置参数(此处无参数)
pstmt.setString(1,prod_name);
pstmt.setString(2,net_w);
// pstmt.setDate(3, (java.sql.Date) date);
pstmt.setInt(3,month);
pstmt.setBigDecimal(4,in_price);
pstmt.setBigDecimal(5,sale_price);
//执行sql
int count = pstmt.executeUpdate();
// 返回影响行数
System.out.println(count>0);
// 7.todo 释放资源
connection.close();
pstmt.close();
}
}