JDBC使用(一)
一. 环境的创建
- 第一步:导入jar包
- 第二步:添加到工作环境
二.开始实现
- 在src目录下创建一个后缀为.properties文件,在这里我创建了一个db.properties,里面的内容如下:
driverClassName=com.mysql.jdbc.Driver //驱动位置
url=jdbc:mysql:///db1?rewriteBatchedStatements=true //需要连接数据库所在的地址
username=root //用户名称
password=123456 //密码
//?rewriteBatchedStatements=true开启批处理,这段代码是为了在批处理的时候加快效率
注意:在上述代码中的///其实是省略了ip地址和端口号,此处是因为在本机上,所以进行了省略,省略的内容为localhost:3306
- 创建工具类JDBCUtils.java
public class JDBCUtils {
private static String driverClassName;
private static String url;
private static String username;
private static String password;
static{
//利用Properties对象读取db.properties文件里的内容
Properties p = new Properties();
try {
p.load(new FileInputStream("src/db.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//将读取到的值传给静态的成员变量,从而实现动态的为其赋值
driverClassName = p.getProperty("driverClassName");
url = p.getProperty("url");
username = p.getProperty("username");
password = p.getProperty("password");
}
//注册驱动
public static void loadDriver(){
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//建立连接
public static Connection buildConnection(){
Connection conn = null;
try {
loadDriver();
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//释放资源(这是对于查的资源释放)
public static void release(Connection conn,Statement stat,ResultSet rs){
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stat = null;
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
}
//这里使用了方法的重载,来实现对增删改进行资源的释放
public static void release(Connection conn,Statement stat){
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stat = null;
}
}
}
注意:在这个工具类中的释放资源的时候,又将变量置为null(conn = null;)的原因:为了满足堆中的垃圾回收机制,更快的将资源进行回收,在堆中的垃圾回收机制,是通过查看是否对栈中的数据有连接,置为null之后,没有什么连接,更快的进行回收.
- 创建测试类
public class Demo02 {
@Test
//添加
public void jdbcAdd(){
Connection conn = null;
PreparedStatement prstm = null;
try {
//调用工具类中的方法,建立连接
conn = JDBCUtils.buildConnection();
//数据库语句,此处的null是因为在建立数据表的时候使用了自增长
String sql = "insert into student values (null,?,?,?)";
//预编译(可以解决注入异常的问题)
prstm = conn.prepareStatement(sql);
//赋值
prstm.setString(1, "令狐冲");
prstm.setString(2, "男");
prstm.setString(3, "4班");
//执行sql语句,使用executeUpdate()这个方法,可以执行增删改的语句,返回值为影响的行数
int ex = prstm.executeUpdate();
if (ex>0) {
System.out.println("添加成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, prstm);
}
}
@Test
//删除
public void jdbcDelete(){
Connection conn = null;
PreparedStatement prstm = null;
try {
conn = JDBCUtils.buildConnection();
String sql = "delete from student where sid = ?";
prstm = conn.prepareStatement(sql);
prstm.setInt(1, 3);
int ex = prstm.executeUpdate();
if (ex>0) {
System.out.println("删除成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, prstm);
}
}
@Test
//修改
public void jdbcUpdate(){
Connection conn = null;
PreparedStatement prstm = null;
try {
conn = JDBCUtils.buildConnection();
String sql = "update student set sname=?,sex=?,cname=? where sid=?";
prstm = conn.prepareStatement(sql);
prstm.setString(1, "任盈盈");
prstm.setString(2, "女");
prstm.setString(3, "6班");
prstm.setInt(4, 2);
int ex = prstm.executeUpdate();
if (ex>0) {
System.out.println("修改成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(conn, prstm);
}
}
//查询
@Test
public void jdbcSelect(){
Connection conn = null;
PreparedStatement prstm = null;
ResultSet rs = null;
try {
// 获得连接:
conn = JDBCUtils.buildConnection();
// 编写SQL:
String sql = "select * from student where sid = ?";
// 预编译SQL:
prstm = conn.prepareStatement(sql);
// 设置参数:
prstm.setInt(1, 2);
// 执行SQL:
rs = prstm.executeQuery();
// 遍历结果集:
while(rs.next()){
System.out.print(rs.getString("sname")+" ");
System.out.print(rs.getString("sex")+" ");
System.out.print(rs.getString("cname")+" ");
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, prstm, rs);
}
}
}
-
JDBC扩展知识
JDBC的扩展操作
public class JDBCDemo6 {
@Test
/**
* 批量插入记录:
* * 默认情况下MySQL批处理没有开启的,需要在url后面拼接一个参数即可。
*/
public void demo2(){
// 记录开始时间:
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL语句:
String sql = "insert into user values (null,?)";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
for(int i=1;i<=10000;i++){
pstmt.setString(1, "name"+i);
// 添加到批处理
pstmt.addBatch();
// 注意问题:
// 执行批处理
if(i % 1000 == 0){
// 执行批处理:
pstmt.executeBatch();
// 清空批处理:
pstmt.clearBatch();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.println((end-begin));
}
@Test
/**
* 批处理基本操作
*/
public void demo1(){
Connection conn = null;
Statement stmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 创建执行批处理对象:
stmt = conn.createStatement();
// 编写一批SQL语句:
String sql1 = "create database test1";
String sql2 = "use test1";
String sql3 = "create table user(id int primary key auto_increment,name varchar(20))";
String sql4 = "insert into user values (null,'aaa')";
String sql5 = "insert into user values (null,'bbb')";
String sql6 = "insert into user values (null,'ccc')";
String sql7 = "update user set name = 'mmm' where id = 2";
String sql8 = "delete from user where id = 1";
// 添加到批处理
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
stmt.addBatch(sql4);
stmt.addBatch(sql5);
stmt.addBatch(sql6);
stmt.addBatch(sql7);
stmt.addBatch(sql8);
// 执行批处理:
stmt.executeBatch();
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(stmt, conn);
}
}
}
注意:该块知识需要了解