会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 128777个问题

create table numbers
(
	id int auto_increment primary key,
	num int not null,
	type varchar(2)
);

我使用的是mySql,已经把id设置为自动增长

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;

/**
 *使用PreparedStatement批处理数据
 *将2~1000之间的数字插入数据库,并记录数字的类型(质数还是合数)
 *
 */
public class TestNum {
	
	public static void main(String[] args) throws Exception {
		int num=1000;
		long startTime=System.currentTimeMillis();
//		insertNum1(num);//	使用Statement插入数字
//		System.out.println("使用statement耗时:"+(endTime-startTime));
		
		insertNum2(num);//	使用PreparedStatement插入数字
		long endTime=System.currentTimeMillis();
		System.out.println("使用PreparedStatement耗时:"+(endTime-startTime));
	}
	/**
	 * 使用PreparedStatement插入数字,批处理
	 * @throws Exception 
	 */
	private static void insertNum2(int num) throws Exception {		
		Connection conn = JDBCUtils.getConnection();
		String sql="insert into numbers  values(null,?,?)";
		PreparedStatement state=conn.prepareStatement(sql);
		conn.setAutoCommit(false);//关闭自动提交
		for(int i=2;i<=num;i++) {
			//绑定参数
			JDBCUtils.bind(state,i,getType(i));
			//加入批处理
			state.addBatch();		
		}		
		//统一执行批处理
		state.executeBatch();
		conn.commit();
		JDBCUtils.relese(state, conn);
		
	}
	/**
	 * 使用Statement插入数字,并且只开关一次连接
	 * @throws Exception 
	 * 
	 */
	private static void insertNum1(int num) throws Exception {
		Connection conn=JDBCUtils.getConnection();
		Statement state=conn.createStatement();
		for(int i=2;i<=num;i++) {
			String sql="insert into numbers values(null,"+i+",'"+getType(i)+"')";
			state.executeUpdate(sql);
		}		
		JDBCUtils.relese(state, conn);
	}
	/**
	 * 判断数字类型
	 * @return
	 */
	private static String getType(int num) {
		if(num<4) {
			return "ZS";
		}
		for(int i=2;i<Math.sqrt(num);i++) {
			if(num % i==0) {
				return "HS";
			}
		}
		return "ZS";
	}
}

在测试PreparedStatement时,就只是需要绑定两个参数了,将id那个设置为null,运行时出现异常,这是为什么呢?

image.png

JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1937楼
JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 1939楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 1940楼

package com.bjsxt.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 事务管理
 * @author Administrator
 *
 */
public class JdbcTransaction {

	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";// 数据库连接路径
		String user = "bjsxt";
		String password = "123";
		Connection conn = null;
		Statement stmt1 = null;
		Statement stmt2 = null;
		String sql1 = "update t_account set money=money-1000 where id=1";
		String sql2 = "update t_account set money=money+1000 where id=2";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, user, password);
			System.out.println(conn);
			conn.setAutoCommit(false);
			stmt1 = conn.createStatement();
			stmt2 = conn.createStatement();
			int num = stmt1.executeUpdate(sql1);
			num += stmt2.executeUpdate(sql2);
			if (num == 2) {
				System.out.println("转账成功,提交事务");
				conn.commit();
			} else {
				System.out.println("转账失败");
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("异常信息:" + e.getMessage());
			if (conn != null) {
				try {
					conn.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		} finally {//关闭
			if (conn != null) {
				try {
					conn.setAutoCommit(true);
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt2 != null) {
				try {
					stmt2.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (stmt1 != null) {
				try {
					stmt1.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

GIF.gif

代码应该是对的,为什么操作失败呢,我也在eclipse中用查询语句查了,结果集的next()是false;是找不到这个t_account表吗.我都已经创建了啊

JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1942楼

老师, 请问一下, 我按照视频中的方法加载"db.properties"文件到输入流, 但是输入流是null.. 请看:


DBUtil.JAVA文件截图:


123.png


代码:

package com.yuanzhao.dbutil;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


public class DBUtil {
	private static String url;
	private static String user;
	private static String password;
	
	static {
		try {
			Properties prop = new Properties();
			
			// 创建文件输入流
			InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
			
			//测试输出
			System.out.println(is);
			
			// 加载配置文件
			prop.load(is);
					
			url = prop.getProperty("jdbc.url").trim();
			user = prop.getProperty("jdbc.username").trim();
			password = prop.getProperty("jdbc.password").trim();
		} catch (IOException e) {
			e.printStackTrace();
			
		}
	}
	
	public static Connection getConn() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			System.out.println("DBUtil.getConn(连接创建失败, 请检查[url]:" + url + ", [user]:" + user + ", [password]:" + password + ")");
		}
		return conn;
	}

	public static Statement getStatement(Connection conn) {
		Statement statement = null;
		try {
			statement = conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return statement;
	}

	public static PreparedStatement getStatement(Connection conn, String sql) {
		PreparedStatement preparedStatement = null;
		try {
			preparedStatement = conn.prepareStatement(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return preparedStatement;
	}

	public static void bindParam(PreparedStatement preparedStatement, Object... params) {
		try {
			for (int i = 0; i < params.length; i++) {
				preparedStatement.setObject((i + 1), params[i]);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void close(ResultSet resultSet, Statement statement, Connection conn) {
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (statement != null) {
			try {
				statement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}


源代码打包:

MyPro0305.zip


JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1944楼
JAVA 全系列/第三阶段:数据库编程/Oracle 数据库的使用 1947楼

JDBC的作业报错,调试好久不知道怎么解决:

java.sql.BatchUpdateException: Incorrect string value: '\xAC\xED\x00\x05sr...' for column 'name' at row 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance(Unknown Source)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)

at com.mysql.jdbc.Util.getInstance(Util.java:408)

at com.mysql.jdbc.SQLError.createBatchUpdateException(SQLError.java:1163)

at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1778)

at com.mysql.jdbc.PreparedStatement.executeBatchInternal(PreparedStatement.java:1262)

at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:970)

at homework0820.BaseDao.Insert(BaseDao.java:85)

at homework0820.ShowView.main(ShowView.java:27)

Caused by: java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05sr...' for column 'name' at row 1

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)

at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)

at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1756)

... 4 more


JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1948楼
JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 1949楼

百战程序员微信公众号

百战程序员微信小程序

©2014-2024 百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637