java getgeneratedkeys,Java jdbc基础

导入jar包

初始化

Class.forName("com.mysql.jdbc.Driver");

注意,需处理可查异常 ClassNotFoundException

连接数据库

Connection c=DriverManager.getConnection(

"jdbc:mysql://127.0.0.1:3306/database_name?characterEncoding=utf8",

"user_name",

"your_password"

)

注意,需处理可查异常SQLException

创建Statement

Statement s=c.createStatement();

5.执行语句

String sql=" sql statement xxx";

s.execute(sql);

值得一提的是sql中的单条sql语句不用加;

关闭连接

先关Statement s,再关Connection c

需要处理可查异常SQLException

try{

s.close();

}catch(SQLException e){

e.printStackTrace();

}

c关闭方法也相同

要点:

标准关闭流的方式:

在try代码块外定义流的引用(这样流的引用变量作用域可以覆盖finally代码块)

在finally代码块中关闭流,记得关闭前先判断一下流的引用是否为空

关闭流的时候再进行一次try-catch处理

总结

标准模板如下

public static void main(String[] args){

Connection c=null;

Statement s=null;

try{

Class.forName("com.mysql.jdbc.Driver");

c=DriverManager.getConnection(

"jdbc:mysql://127.0.0.1:3306/your_database_name?characterEncoding=utf8",

"user_name","your_password"

);

s=c.createStatement();

String sql="your_sql_statements";

s.execute(sql);

}catch(ClassNotFoundException e){

e.printStackTrace();

}catch(SQLException e){

e.printStackTrace();

}finally{

if(s!=null){

try{

s.close();

}catch(SQLException e){

e.printStackTrace();

}

}

if(c!=null){

try{

c.close();

}catch(SQLException e){

e.printStackTrace();

}

}

}

}

简化版处理方案:

使用Java7的新特性try-with-resource,即把输入流Connection c和Statement s在try(。。。)中声明,在执行完try的代码块后会自动关闭,因为二者均实现了AutoCloseable接口

//c,s作为形参传入,try代码块结束后自动关闭

try (

Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",

"root", "admin");

Statement s = c.createStatement();

)

{

String sql = "insert into hero values(null," + "'提莫'" + "," + 313.0f + "," + 50 + ")";

s.execute(sql);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

增删改都跟上面的操作一样,只是sql语句不同而已,但查是要返回数据的,需要额外来区分

查询

与之前的区别:

有返回值,jdbc中是以ResultSet这个类型来接收返回值的。

调用方法不用,为executeQuery

ResultSet可以看作是一个迭代器,用getXXX来返回具体的字段值,XXX代表你用什么返回类型去解释查询到的数据。next()方法代表迭代下一条数据,同时返回一个bool值,若为false,则说明已经遍历完所有数据了

getXXX方法可以有2种方式去指定获取哪个字段,一是按照字段名,一是按照索引值(注意,索引从1开始)

采用预编译的执行语句

String sql = "insert into hero values(null,?,?,?)";

try (Connection c = xxxx);

// 根据sql语句创建PreparedStatement

PreparedStatement ps = c.prepareStatement(sql);

) {

// 设置参数

ps.setString(1, "提莫");

ps.setFloat(2, 313.0f);

ps.setInt(3, 50);

// 执行

ps.execute();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

优势:

性能高,执行效率比Statement快

把语句参数化,提高了代码的复用性

防止SQL语句注入,因为已经定义好了SQL语句的结构,可以赋值的只是变量,因此可以检查出是否会改变SQL结构,而Statement则不行

注意:

在使用PreparedStatement对象给sql语句赋值时,起始索引为1,这是Java内置语句中唯二以1为起点的索引,另一个是ResultSet通过索引取字段值

execute 和 executeUpdate的区别

execute可以进行查询操作,后者不可以;

前者返回值是bool值,表示进行的是否是查询操作,查询得到的结果集可以由Statement通过getResultSet()获得,后者返回的是int,代表有多少条记录收到影响

自增长id

通常我们会把主键定义为一个自动增长的id,Statement对象可以通过getGeneratedKeys获取到当前表中的自增长id号(一条记录,ResultSet类型)

获取元数据

类型DatabaseMetaData,通过Connection对象的getMetaData()获取,之后通过调用各种getXXX()方法获取具体信息值

设置事务

保证原子性

通过c.setAutoCommit(false);

sql执行1

sql执行2

c.commit();

sql会把执行1和执行2看作一个事务,除非都成功才会正确执行,否则就回滚到上一次提交的状态

注意,只有是InnoDB引擎时才支持事务

数据库连接池

因为线程同数据库建立连接和关闭连接都比较耗时,当许多线程同数据库建立或关闭连接时会造成系统卡顿

而且数据库的连接数量是有限的,当连接用完后后续线程的请求会失败

数据库连接池则解决了以上2个问题,原理是,首先先建立好数个连接,放在连接池中,当线程请求数据库的时候,直接拿现成的连接去用,若当前没有连接,则让线程进行等待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值