完成数据库的连接,就马上要对数据库进行增删改查操作了;先来了解一下Statement

通过JDBC插入数据 (这里提供一个查找和插入方法)

Statement:用于执行sql语句的对象;
*1.通过Connection 的creatStatement()方法来获取;
*2.通过executeUpdate(sql) 可以执行SQL语句
*3.传入的SQL可以是insert update delete,但是不能是select;
* 注意:在使用后要关闭connection和statement(在finally中关闭)
* 关闭的顺序:先关statement ; 后关 connection

@Test
public void testStatement()throws Exception{
//1.获取数据库连接
Connection conn = null;
Statement st = null;
try {
conn = getConnection();//参看最底下的附录(获取连接)
//2.准备插入的sql
String sql ="insert into contacts(name,address,phone)"+"value('xyz','abc','abc')";
//3.执行插入
//获取sql的statement对象:Connection的createStatement()方法来获取
st = conn.createStatement();
//调用statement对象的executeUpdate(sql)对象,插入sql语句
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(st !=null)
//关闭Statement 对象
st.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
//关闭连接
if(conn !=null)
conn.close();
}

}

}

/**
* ResultSet:结果集,封装了使用JDBC进行查询的接口
* 1.调用Statement 对象的executeQuesry(sql)可以得到结果集
* 2.返回一张数据表,有指针指向数据表的第一行的前面
* 3.可以调用next方法检测下一行是否有效,若有效返回true且指针下移
* 4.当指针对到一行时,可以通过getxxxx(index)或者getxxx(cloumName);
* 获取每一列的值:getInt(1),getString("name")
* @throws Exception
*/
@Test
public void testResultSet() throws Exception{
//获取Id=19的记录值,并且每条打印
Connection con = null;
ResultSet rs = null;
Statement st = null;
try {
//1.获取connection
con = JdbcTools.getConnection();//JdbcTools.getConnection()同附录的方法
//2.获取Statement
st = con.createStatement();
//3.准备sql
String sql = "select * from contacts where id=19";
//4.获取ResultSet
rs = st.executeQuery(sql);
//5.处理ResultSet
if(rs.next()){//如果是多条记录,把if改成while
int id = rs.getInt(1);//第一列
String name = rs.getString("name");
String address = rs.getString(3);
System.out.println(id);
System.out.println(name);
System.out.println(address);
}
//6.关闭
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.release(rs, st, con);//方法见附录
}
}

//以上提供了插入和查询方法

*********************************************************************************************************************

这里我们在来了解一个PreparedStatement方法,可以对比Stetement

/**
* PreparedStatement是Stetement的子接口;
*preparedStatement:使用statement,sql需要拼接;
*PerparedStatement:String sql="insert into contacts(name,address,phone) value(?,?,?)"
*Statement:String sql = "insert into contacts(name,address,phone)"+"value('nn'+'121'+'1212')";
*1.创建preparedStatement:
*2.调动PreparedStatement的setxxx(int index,object value),设置占位符的值
*这里index从1开始
*3.执行sql语句:executeQuery()或者executeUpdate(),前者是查询,后者是更新
*注意,执行时不再需要闯入sql语句
*
*好处:1防止SQl注入,即防止拼接过程中有加入其它东西,例如有OR···,这样,sql就可以正确执行;2提高性能;3····
*
* @throws Exception
*/
@Test
public void testPreparedStatement() throws Exception {
Connection con = null;
PreparedStatement p = null;
ResultSet rs = null;
try {
con = JdbcTools.getConnection();
String sql = " insert into contacts(name,address,phone)values(?,?,?)";
p = con.prepareStatement(sql);
p.setString(1, "tom");
p.setString(2, "zhejiang");
p.setString(3, "15988324290");
p.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.releaseDB(rs, p, con);
}

}

附上

public Connection getConnection() throws Exception{
String driverClass = null;
String jdbcUrl = null;
String user = null;
String password = null;

//读取类路径下的properties
InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(in);
driverClass=p.getProperty("driver");
jdbcUrl = p.getProperty("jdbcUrl");
user = p.getProperty("user");
password = p.getProperty("password");

Driver driver = (Driver) Class.forName(driverClass).newInstance();//实例化
Properties info = new Properties();
info.put("user",user);
info.put("password",password);
Connection connection = driver.connect(jdbcUrl, info);
return connection;
}

public static void release(ResultSet rs, Statement statement ,Connection con) throws Exception{

if(rs != null){

try {

rs.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

if(statement !=null){

try {

statement.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

if(con!=null){

try {

con.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

public static void releaseDB(ResultSet rs, PreparedStatement statement ,Connection con) throws Exception{

if(rs != null){

try {

rs.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

if(statement !=null){

try {

statement.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

if(con!=null){

try {

con.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

需要导入的包

mysql-connector-java-5.1.34.jar

jdbc 数据的增删改查的Statement Resultset PreparedStatement的更多相关文章

  1. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  2. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  3. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  4. Mybatis实现数据的增删改查

    Mybatis实现数据的增删改查 1.项目结构(使用maven创建项目) 2.App.java package com.GetcharZp.MyBatisStudy; import java.io.I ...

  5. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  6. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  7. mvc模式jsp+servel+jdbc oracle基本增删改查demo

    mvc模式jsp+servel+jdbc oracle基本增删改查demo 下载地址

  8. 数据的增删改查(三层)<!--待补充-->

    进行数据操作必然少了对数据的增删改查,用代码生成器生成的代码不是那么满意!方便在今后使用,这里就主要写“数据访问层(Dal)” 既然这里提到三层架构:有必要将三层内容在这里详细介绍一下(待补充) 注: ...

  9. vue实现对表格数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

随机推荐

  1. jqGrid配置属性说明

    Property Type Description Default1) ajaxGridOptions object This option allows to set global ajax set ...

  2. (iOS) __block和__weak认识

    果然还是对最基础的知识了解不透彻,今天看一看iOS中的两个修饰符:__block和__weak .也是做一下温习吧. 1.先说weak,<弱引用> 我们知道weak的使用,比如声明一个控件 ...

  3. CentOS7中DHCP配置

    因为需要网络引导系统的安装,所以需要安装和配置DHCP服务器.DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议,它提供了一种动态指定IP地址和配置参 ...

  4. Android之UI编程(二):表格布局

    表格布局(TableLayout)继承了LinearLayout,它的本质依然是线性布局管理器,表TableLayout采用行.列的形式来管理UI组件,它并不需要明确地声明暴行多少行.多少列,而是通过 ...

  5. 如何使用的Ue4自带的SQLiteSupport

    在UE4.6版本加入的模块.可以让开发者使用SQLite数据库.SQlite是个轻量型的本地数据库. 我下面就来介绍一下如何使用这个模块. 第一步:下载SQLite源代码以及SQLite GUI管理工 ...

  6. 【转】Oracle索引列NULL值引发执行计划该表的测试示例

    有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...

  7. letter upper lower combo

    以前同事为了炫耀ruby的简洁,特意出一道题来考小陈: 在写一个爆破密码的字典生成工具,其中有这样一个需求: 输入一个单词:列出这个单词的所有大小写组合,比如ruby Ruby rUby ruBy r ...

  8. 【BZOJ】3521: [Poi2014]Salad Bar

    题意 长度为\(n(1 \le n \le 1000000)\)的\(01\)字符串.找一个最长的连续子串\(S\),使得不管是从左往右还是从右往左取,都保证每时每刻已取出的\(1\)的个数不小于\( ...

  9. SQL 执行进展优化

    聚集索引扫描 SELECT * FROM C_SY_Ownedstorm 聚集索引扫描比表扫描快 聚集索引扫描:发生于聚集表,也相当于全表扫描操作,但在针对聚集列的条件等操作时,效率会较好. 表扫描 ...

  10. iOS开发中常见问题集锦

    在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...