注:下面的连接均是以mysql为例,@Test是Junit4的注解用于测试,用到的工具类在前一个有讲过
- 首先贴出建表语句方便后续操作
CREATE TABLE `fruit` (
`fruitName` varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT '水果名称',
`id` int(11) NOT NULL COMMENT 'id',
`price` double DEFAULT NULL COMMENT '水果价格',
`info` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '介绍',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2,插入几条数据便于后边用
insert into `fruit`(`fruitName`,`id`,`price`,`info`) values
('梨',2,14,'梨好吃'),
('香蕉',3,11,'香蕉也很好吃'),
('菠萝',4,13,'菠萝特别好吃!');
首先是获取连接调用前面讲到的工具类JdbcUtils中的方法getConncetion方法获取连接conn,编写sql语句,之后调用conn的prepareStatement进行预编译sql语句。代码如下所示
//获取数据库链接
Connection connection = JdbcUtils.getConnection();
//定义要执行的sql语句
String sql="update fruit set fruitName=? where id=?";
//预编译sql语句
PreparedStatement ps = connection.prepareStatement(sql);
- 可能会发现sql语句会有不同,平时我们写的sql语句应该是update fruit set fruitName="苹果" where id=2,这里的?被称为占位符,通俗点说就是这个地方我不确定填什么你先给我空出来,我以后想用的时候再往里加入我想要的数据,那么我们应该怎么加呢?
- PreparedStatement中有设置内容的方法,可以调用ps.setXxx(intparameterIndex,Object x),第一个参数intparameterIndex就是指定是第几个占位符,注意这里不是从0开始,而是从1开始,第二个参数就要看你想添加的类型了。举个例子我们想设置fruitName为苹果,我们就可以调用ps.setString(1,"苹果")设置,1代表他是第一个占位符,"苹果"就是你要加的数据,若输入的是int类型,可以调用ps.setInt()方法,以此类推,可以根据数据的类型调用不同的方法,用的时候在集成开发环境idea或者eclipse中可以 . 出来。
接下来就是执行sql了,调用PreparedStatement中的execute方法执行
//执行sql语句
ps.execute();
对于连接我们用完应该关闭,PreparedStatement同样需要关闭,关闭时会抛出异常,try-catch包裹一下就行
try {
if (connection!=null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (ps!=null)
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
当然如果我们直接判断connection和ps是否为null,会报错,这是因为作用域问题,我们要提升作用域把Connection和PreparedStatement声明到上面值为null,并且把获取连接,预编译sql语句和执行sql语句用try-catch-finally包起来,把关闭连接放到finally里
/**
* 修改一条信息
* @throws Exception
*/
@Test
public void test2() throws Exception {
Connection connection=null;
java.sql.PreparedStatement ps=null;
try {
//获取数据库链接
connection = JdbcUtils.getConnection();
//预编译sql语句
String sql="update fruit set fruitName=? where id=?";
ps = connection.prepareStatement(sql);
//填充占位符
ps.setString(1,"栗子");
ps.setInt(2,1);
//执行
ps.execute();
System.out.println("一条数据修改成功!");
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭连接
try {
if (connection!=null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if (ps!=null)
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
考虑到每次都要关闭连接,可以把关闭连接封装成一个方法,需要时调用就可以
/**
* 关闭资源
* @param con
* @param ps
*/
public static void colseResource(Connection con, PreparedStatement ps) {
if (con!=null) {
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (ps!=null) {
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
用的时候直接JdbcUtils.closeRecsource()传入连接和PreparedStatement即可。