[转载]JavaEE学习篇之--JDBC详解
时间:2022-03-14 03:36
原文链接:
目录
1.摘要
2.JDBC的使用步骤
1.注册驱动 只做一次
2.建立连接Connection
3.创建执行SQL的语句Statement
4.处理执行结果ResultSet
5.释放资源
3.使用JDBC来实现CRUD的操作
4.Statement中的sql依赖注入的问题
5.JDBC中特殊数据类型的操作问题
1.第一个是日期问题
2.第二个问题就是大文本数据的问题
6.JDBC中事务的概念
7.JDBC中调用存储过程
8.JDBC来实现批处理功能
9.JDBC中的滚动结果集和分页技术
10.JDBC中的可更新以及对更新敏感的结果集操作
11.元数据的相关知识
1.数据库的元数据信息
2.查询参数的元数据信息
3.结果集中元数据信息
12.JDBC中的数据源
13.JDBC中CRUD的模板模式
14.Spring框架中的JdbcTemplate
1.加强版的JdbcTemplate
1.NamedParameterJdbcTemplate
2.SimpleJdbcTemplate
今天我们来说一下关于JDBC的相关知识,关于JDBC我想大家都不陌生了,而且我记得早就开始使用它了,记得那是大二的时候做课程设计,但是那时候是为了完成任务,所以遇到问题就google,那时候也没有时间去整理,所以这次就来详细说一下关于JDBC的知识
摘要:
JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。 J2SE的一部分,由java.sql,javax.sql包组成。
应用程序、JDBC API、数据库驱动及数据库之间的关系
JDBC的使用步骤
1.注册驱动 (只做一次)
方式一:Class.forName(“com.mysql.jdbc.Driver”); 推荐这种方式,不会对具体的驱动类产生依赖。 方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver); 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。 方式三:System.setProperty(“jdbc.drivers”, “driver1:driver2”); 虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。 驱动类型(四种类型)
2.建立连接(Connection)
[java]
- Connection conn = DriverManager.getConnection(url, user, password);
Connection conn = DriverManager.getConnection(url, user, password);
url格式: JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&… User,password可以用“属性名=属性值”方式告诉数据库; 其他参数如:useUnicode=true&characterEncoding=GBK。
3.创建执行SQL的语句(Statement)
[java]
- Statement
- Statement st = conn.createStatement();
- st.executeQuery(sql);
- PreparedStatement
- String sql = “select * from table_name where col_name=?”;
- PreparedStatement ps = conn.preparedStatement(sql);
- ps.setString(1, “col_value”);
- ps.executeQuery();
Statement Statement st = conn.createStatement(); st.executeQuery(sql); PreparedStatement String sql = “select * from table_name where col_name=?”; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, “col_value”); ps.executeQuery();
4.处理执行结果(ResultSet)
[java]
- ResultSet rs = statement.executeQuery(sql);
- While(rs.next()){
- rs.getString(“col_name”);
- rs.getInt(“col_name”);
- //…
- }
ResultSet rs = statement.executeQuery(sql); While(rs.next()){ rs.getString(“col_name”); rs.getInt(“col_name”); //… }
5.释放资源
释放ResultSet, Statement,Connection. 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
下面来看一下完整的Demo:
工具类:JdbcUtils
[java]
- package com.weijia.firstdemo;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import javax.sql.DataSource;
- public class JdbcUtils {
- private static String user = "root";
- private static String password = "123456";
- private static String dbName = "test";
- private static String url = "jdbc:mysql://localhost:3306/"+dbName+"?user="+user+"&password="+password+"&useUnicode=true&characterEncoding=gb2312";
- private static DataSource dataSource = null;
- /**
- * 加载驱动
- */
- static{
- try{
- Class.forName("com.mysql.jdbc.Driver");
- }catch(Exception e){
- System.out.println("Exception:"+e.getMessage()+"");
- throw new ExceptionInInitializerError(e);
- }
- }
- private JdbcUtils(){
- }
- /**
- * 获取连接
- * @return
- * @throws SQLException
- */
- public static Connection getConnection() throws SQLException{
- return DriverManager.getConnection(url);
- }
- public static DataSource getDataSource(){
- return dataSource;
- }
- /**
- * 释放资源
- * @param rs
- * @param st
- * @param conn
- */
- public static void free(ResultSet rs,Statement st,Connection conn){
- try{
- if(rs != null){
- rs.close();
- }
- }catch(SQLException e){
- e.printStackTrace();
- }finally{
- try{
- if(st != null){
- st.close();
- }
- }catch(SQLException e){
- e.printStackTrace();
- }finally{
- try{
- if(conn != null){
- conn.close();
- }
- }catch(SQLException e){
- e.printStackTrace();
- }
- }
- }
- }
- }
package com.weijia.firstdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; public class JdbcUtils { private static String user = "root"; private static String password = "123456"; private static String dbName = "test"; private static String url = "jdbc:mysql://localhost:3306/"+dbName+"?user="+user+"&password="+password+"&useUnicode=true&characterEncoding=gb2312"; private static DataSource dataSource = null; /** * 加载驱动 */ static{ try{ Class.forName("com.mysql.jdbc.Driver"); }catch(Exception e){ System.out.println("Exception:"+e.getMessage()+""); throw new ExceptionInInitializerError(e); } } private JdbcUtils(){ } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url); } public static DataSource getDataSource(){ return dataSource; } /** * 释放资源 * @param rs * @param st * @param conn */ public static void free(ResultSet rs,Statement st,Connection conn){ try{ if(rs != null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(st != null){ st.close(); } }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(conn != null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } } }
测试类:
[java]
- package com.weijia.firstdemo;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class Demo {
- public static void main(String[] args) throws Exception{
- //测试代码:
- test();
- //标准规范代码:
- template();
- }
- //模板代码
- public static void template(){
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- try {
- conn = JdbcUtils.getConnection();
- //创建语句
- st = conn.createStatement();
- //执行语句
- rs = st.executeQuery("select * from user");
- //处理结果
- while(rs.next()){
- System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t");
- }
- }catch(SQLException e){
- e.printStackTrace();
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- JdbcUtils.free(rs, st, conn);
- }
- }
- //测试
- static void test() throws Exception{
- //注册驱动
- DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- //通过系统属性来注册驱动
- System.setProperty("jdbc.drivers","");
- //静态加载驱动
- Class.forName("com.mysql.jdbc.Driver");
- //建立连接
- String url = "jdbc:mysql://localhost:3306";
- String userName = "root";
- String password = "";
- Connection conn = DriverManager.getConnection(url,userName,password);
- //创建语句
- Statement st = conn.createStatement();
- //执行语句
- ResultSet rs = st.executeQuery("select * from user");
- //处理结果
- while(rs.next()){
- System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t");
- }
- //释放资源
- rs.close();
- st.close();
- conn.close();
- }
- }
package com.weijia.firstdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Demo { public static void main(String[] args) throws Exception{ //测试代码: test(); //标准规范代码: template(); } //模板代码 public static void template(){ Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //创建语句 st = conn.createStatement(); //执行语句 rs = st.executeQuery("select * from user"); //处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"); } }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtils.free(rs, st, conn); } } //测试 static void test() throws Exception{ //注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //通过系统属性来注册驱动 System.setProperty("jdbc.drivers",""); //静态加载驱动 Class.forName("com.mysql.jdbc.Driver"); //建立连接 String url = "jdbc:mysql://localhost:3306"; String userName = "root"; String password = ""; Connection conn = DriverManager.getConnection(url,userName,password); //创建语句 Statement st = conn.createStatement(); //执行语句 ResultSet rs = st.executeQuery("select * from user"); //处理结果 while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"); } //释放资源 rs.close(); st.close(); conn.close(); } }
注意:这里还要记住引入额外的jar.这个网上很多的,这里使用的是MySql,搜一下MySql驱动的jar就行了。这里我们将一些操作都放到一个工具类中,这种方式是很优雅的。
使用JDBC来实现CRUD的操作
我们这里就采用分层操作:Dao层,Service层
首先看一下domain域中的User实体
[java]
- package com.weijia.domain;
- import java.util.Date;
- public class User {
- private int id;
- private String name;
- private Date birthday;
- private float money;
- public User(){
- }
- public User(int id,String name,Date birthday,float money){
- this.id = id;
- this.name = name;
- this.birthday = birthday;
- this.money = money;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public float getMoney() {
- return money;
- }
- public void setMoney(float money) {
- this.money = money;
- }
- @Override
- public String toString(){
- return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]";
- }
- }
package com.weijia.domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; private float money; public User(){ } public User(int id,String name,Date birthday,float money){ this.id = id; this.name = name; this.birthday = birthday; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } @Override public String toString(){ return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]"; } }
再来看一下Dao层结构:
接口:
[java]
- package com.weijia.domain;
- public interface UserDao {
- //添加用户
- public void addUser(User user);
- //通过userid查询用户,id是唯一的,所以返回的是一个user
- public User getUserById(int userId);
- //更新用户信息
- public int update(User user);
- //删除用户信息
- public int delete(User user);
- }
package com.weijia.domain; public interface UserDao { //添加用户 public void addUser(User user); //通过userid查询用户,id是唯一的,所以返回的是一个user public User getUserById(int userId); //更新用户信息 public int update(User user); //删除用户信息 public int delete(User user); }
实现类:
[java]
- package com.weijia.domain;
- import java.sql.Connection;
- import java.sql.Date;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import com.weijia.firstdemo.JdbcUtils;
- public class UserDaoImpl implements UserDao{
- /**
- * 添加用户
- */
- public void addUser(User user) {
- Connection conn = null;
- PreparedStatement st = null;
- try{
- conn = JdbcUtils.getConnection();
- String sql = "insert into user(id,name,birthday,money) values(?,?,?,?)";
- st = conn.prepareStatement(sql);
- st.setInt(1,user.getId());
- st.setString(2,user.getName());
- //日期格式的转换(utils.date转化成sql.date)
- st.setDate(3,new Date(user.getBirthday().getTime()));
- st.setFloat(4, user.getMoney());
- int count = st.executeUpdate();
- System.out.println("添加记录条数:"+count);
- }catch(Exception e){
- throw new DaoException(e.getMessage(),e);
- }finally{
- JdbcUtils.free(null, st, conn);
- }
- }
- /**
- * 删除用户
- */
- public int delete(User user) {
- Connection conn = null;
- PreparedStatement st = null;
- try{
- conn = JdbcUtils.getConnection();
- String sql = "delete from user where id=?";
- st = conn.prepareStatement(sql);
- st.setInt(1,user.getId());
- int count = -1;
- count = st.executeUpdate();
- System.out.println("删除记录条数:"+count);
- return count;
- }catch(Exception e){
- throw new DaoException(e.getMessage(),e);
- }finally{
- JdbcUtils.free(null, st, conn);
- }
- }
- /**
- * 通过userId获取用户信息
- */
- public User getUserById(int userId) {
- Connection conn = null;
- PreparedStatement st = null;
- ResultSet rs = null;
- try{
- conn = JdbcUtils.getConnection();
- String sql = "select * from user where id=?";
- st = conn.prepareStatement(sql);
- st.setInt(1,userId);
- rs = st.executeQuery();
- if(rs.next()){
- User user = new User();
- user.setId(userId);
- user.setName(rs.getString("name"));
- user.setBirthday(rs.getDate("birthday"));
- user.setMoney(rs.getFloat("money"));
- return user;
- }
- }catch(Exception e){
- throw new DaoException(e.getMessage(),e);
- }finally{
- JdbcUtils.free(rs, st, conn);
- }
- return null;
- }
- /**
- * 更新用户信息
- */
- public int update(User user){
- Connection conn = null;
- PreparedStatement st = null;
- try{
- conn = JdbcUtils.getConnection();
- String sql = "update user set name=?,birthday=?,money=? where id=?";
- st = conn.prepareStatement(sql);
- st.setString(1,user.getName());
- st.setDate(2,new Date(user.getBirthday().getTime()));
- st.setFloat(3,user.getMoney());
- st.setInt(3,user.getId());
- int count = 0;
- count = st.executeUpdate();
- System.out.println("更新的记录数:"+count);
- return count;
- }catch(Exception e){
- throw new DaoException(e.getMessage(),e);
- }finally{
- JdbcUtils.free(null, st, conn);
- }
- }
- }
package com.weijia.domain; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.weijia.firstdemo.JdbcUtils; public class UserDaoImpl implements UserDao{ /** * 添加用户 */ public void addUser(User user) { Connection conn = null; PreparedStatement st = null; try{ conn = JdbcUtils.getConnection(); String sql = "insert into user(id,name,birthday,money) values(?,?,?,?)"; st = conn.prepareStatement(sql); st.setInt(1,user.getId()); st.setString(2,user.getName()); //日期格式的转换(utils.date转化成sql.date) st.setDate(3,new Date(user.getBirthday().getTime())); st.setFloat(4, user.getMoney()); int count = st.executeUpdate(); System.out.println("添加记录条数:"+count); }catch(Exception e){ throw new DaoException(e.getMessage(),e); }finally{ JdbcUtils.free(null, st, conn); } } /** * 删除用户 */ public int delete(User user) { Connection conn = null; PreparedStatement st = null; try{ conn = JdbcUtils.getConnection(); String sql = "delete from user where id=?"; st = conn.prepareStatement(sql); st.setInt(1,user.getId()); int count = -1; count = st.executeUpdate(); System.out.println("删除记录条数:"+count); return count; }catch(Exception e){ throw new DaoException(e.getMessage(),e); }finally{ JdbcUtils.free(null, st, conn); } } /** * 通过userId获取用户信息 */ public User getUserById(int userId) { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = JdbcUtils.getConnection(); String sql = "select * from user where id=?"; st = conn.prepareStatement(sql); st.setInt(1,userId); rs = st.executeQuery(); if(rs.next()){ User user = new User(); user.setId(userId); user.setName(rs.getString("name")); user.setBirthday(rs.getDate("birthday")); user.setMoney(rs.getFloat("money")); return user; } }catch(Exception e){ throw new DaoException(e.getMessage(),e); }finally{ JdbcUtils.free(rs, st, conn); } return null; } /** * 更新用户信息 */ public int update(User user){ Connection conn = null; PreparedStatement st = null; try{ conn = JdbcUtils.getConnection(); String sql = "update user set name=?,birthday=?,money=? where id=?"; st = conn.prepareStatement(sql); st.setString(1,user.getName()); st.setDate(2,new Date(user.getBirthday().getTime())); st.setFloat(3,user.getMoney()); st.setInt(3,user.getId()); int count = 0; count = st.executeUpdate(); System.out.println("更新的记录数:"+count); return count; }catch(Exception e){ throw new DaoException(e.getMessage(),e); }finally{ JdbcUtils.free(null, st, conn); } } }
然后是Servic层:
[java]
- package com.weijia.domain;
- public class UserService {
- private UserDao userDao;
- public UserService(){
- //通过工厂实例化UserDao对象
- userDao = DaoFactory.getInstance().createUserDao();
- System.out.println("userDao:"+userDao);
- }
- /**
- * 注册用户
- * @param user
- */
- public void regist(User user){
- if(user == null){
- System.out.println("注册信息无效!!");
- }else{
- userDao.addUser(user);
- }
- }
- /**
- * 查询用户
- * @param userId
- * @return
- */
- public User query(int userId){
- User user = userDao.getUserById(userId);
- if(user == null){
- System.out.println("查询结果为空!!");
- }else{
- System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+user.getMoney());
- }
- return userDao.getUserById(userId);
- }
- /**
- * 更新用户
- * @param user
- */
- public void update(User user){
- if(user.getId()<=0){
- System.out.println("用户id无效,无法更新");
- }else{
- userDao.update(user);
- }
- }
- /**
- * 删除用户
- * @param user
- */
- public void delete(User user){
- if(user.getId()<=0){
- System.out.println("用户id无效,无法删除!!");
- }else{
- userDao.delete(user);
- }
- }
- }
package com.weijia.domain; public class UserService { private UserDao userDao; public UserService(){ //通过工厂实例化UserDao对象 userDao = DaoFactory.getInstance().createUserDao(); System.out.println("userDao:"+userDao); } /** * 注册用户 * @param user */ public void regist(User user){ if(user == null){ System.out.println("注册信息无效!!"); }else{ userDao.addUser(user); } } /** * 查询用户 * @param userId * @return */ public User query(int userId){ User user = userDao.getUserById(userId); if(user == null){ System.out.println("查询结果为空!!"); }else{ System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+user.getMoney()); } return userDao.getUserById(userId); } /** * 更新用户 * @param user */ public void update(User user){ if(user.getId()<=0){ System.out.println("用户id无效,无法更新"); }else{ userDao.update(user); } } /** * 删除用户 * @param user */ public void delete(User user){ if(user.getId()<=0){ System.out.println("用户id无效,无法删除!!"); }else{ userDao.delete(user); } } }
这里我们还需要额外的两个类:
一个是异常类,因为我们需要自定义我们自己的一个异常,这样方便进行捕获:
[java]
- package com.weijia.domain;
- public class DaoException extends RuntimeException{
- private static final long serialVersionUID = 1L;
- public DaoException(){
- }
- public DaoException(Exception e){
- super(e);
- }
- public DaoException(String msg){
- super(msg);
- }
- public DaoException(String msg,Exception e){
- super(msg,e);
- }
- }
package com.weijia.domain; public class DaoException extends RuntimeException{ private static final long serialVersionUID = 1L; public DaoException(){ } public DaoException(Exception e){ super(e); } public DaoException(String msg){ super(msg); } public DaoException(String msg,Exception e){ super(msg,e); } }
同时,我们这里面采用工厂模式进行实例化UserDao对象:
[java]
- package com.weijia.domain;
- import java.io.FileInputStream;
- import java.util.Properties;
- public class DaoFactory {
- /**
- * 单例模式
- */
- private static UserDao userDao = null;
- private static DaoFactory instance = new DaoFactory();
- private DaoFactory(){
- /**
- * 通过读取属性文件来动态的加载Dao层类
- */
- Properties prop = new Properties();
- try{
- FileInputStream fis = new FileInputStream("src/com/weijia/domain/daoconfig.properties");
- prop.load(fis);
- String className = prop.getProperty("userDaoClass");
- Class<?> clazz = Class.forName(className);
- userDao = (UserDao)clazz.newInstance();
- fis.close();
- }catch(Throwable e){
- throw new ExceptionInInitializerError(e);
- }
- }
- public static DaoFactory getInstance(){
- return instance;
- }
- public UserDao createUserDao(){
- return userDao;
- }
- }
package com.weijia.domain; import java.io.FileInputStream; import java.util.Properties; public class DaoFactory { /** * 单例模式 */ private static UserDao userDao = null; private static DaoFactory instance = new DaoFactory(); private DaoFactory(){ /** * 通过读取属性文件来动态的加载Dao层类 */ Properties prop = new Properties(); try{ FileInputStream fis = new FileInputStream("src/com/weijia/domain/daoconfig.properties"); prop.load(fis); String className = prop.getProperty("userDaoClass"); Class<?> clazz = Class.forName(className); userDao = (UserDao)clazz.newInstance(); fis.close(); }catch(Throwable e){ throw new ExceptionInInitializerError(e); } } public static DaoFactory getInstance(){ return instance; } public UserDao createUserDao(){ return userDao; } }
这里面是读取properties文件,然后去读取类名进行加载,这种方式是很灵活的
测试:
[java]
- package com.weijia.domain;
- import java.util.Date;
- public class TestDemo {
- public static void main(String[] args) throws Exception{
- UserService userService = new UserService();
- System.out.println("添加用户:");
- userService.regist(new User(1,"jiangwei",new Date(System.currentTimeMillis()),300));
- }
- }
package com.weijia.domain; import java.util.Date; public class TestDemo { public static void main(String[] args) throws Exception{ UserService userService = new UserService(); System.out.println("添加用户:"); userService.regist(new User(1,"jiangwei",new Date(System.currentTimeMillis()),300)); } }
这里我们看到其实这些操作真的很简单,就是按照那样的几个步骤来操作即可,同时我们还需要将结构进行分层,以便管理,我们这里面测试的时候,撇开了创建数据库的一个环节,至于那个环节,也是不难的,可以从网上搜索一下即可。
Statement中的sql依赖注入的问题
接着来看一下关于我们上面的例子中使用了Statement进行操作的,其实这里面是存在一个问题的,就是会有sql注入的问题,我们先来看一下这个问题:
查询学生信息:
[java]
- /**
- * 使用Statement读取数据
- * @param name
- * @throws SQLException
- */
- static void read(String name) throws SQLException{
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- try {
- conn = JdbcUtils.getConnection();
- //创建语句
- st = conn.createStatement();
- //执行语句(不建议使用*)
- String sql = "select id,name from user where name=‘"+name+"‘";
- rs = st.executeQuery(sql);
- //根据列名取数据
- while(rs.next()){
- System.out.println(rs.getObject("id") + "\t" + rs.getObject("name") + "\t");
- }
- }catch(SQLException e){
- e.printStackTrace();
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- JdbcUtils.free(rs, st, conn);
- }
- }
/** * 使用Statement读取数据 * @param name * @throws SQLException */ static void read(String name) throws SQLException{ Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); //创建语句 st = conn.createStatement(); //执行语句(不建议使用*) String sql = "select id,name from user where name=‘"+name+"‘"; rs = st.executeQuery(sql); //根据列名取数据 while(rs.next()){ System.out.println(rs.getObject("id") + "\t" + rs.getObject("name") + "\t"); } }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtils.f