java学习笔记——使用JDBC,对数据库进行增删改查(方案二)
扫描二维码
随时随地手机看文章
工具类BaseDao.java
package com.accp.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; public class BaseDao { // 使用log4j记录日志 private static Logger logger = Logger.getLogger(BaseDao.class); // 连接驱动 private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // 连接路径 private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=test"; // 用户名 private static final String USERNAME = "sa"; // 密码 private static final String PASSWORD = "sa"; //静态代码块 static { try { // 加载驱动 Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); logger.error("加载驱动失败", e); } } /* * 获取数据库连接 */ public Connection getConnection() { Connection conn = null; logger.debug("开始连接数据库"); try{ //与数据库建立连接 conn=DriverManager.getConnection(URL, USERNAME, PASSWORD); }catch(SQLException e){ e.printStackTrace(); logger.error("数据库连接失败!",e); } logger.debug("数据库连接成功"); return conn; } /* * 关闭数据库连接,注意关闭的顺序 */ public void close(ResultSet rs, PreparedStatement ps, Connection conn) { //注意:最后打开的最先关闭 if(rs!=null){ try{ rs.close(); rs=null; }catch(SQLException e){ e.printStackTrace(); logger.error("关闭ResultSet失败",e); } } if(ps!=null){ try{ ps.close(); ps=null; }catch(SQLException e){ e.printStackTrace(); logger.error("关闭PreparedStatement失败",e); } } if(conn!=null){ try{ conn.close(); conn=null; }catch(SQLException e){ e.printStackTrace(); logger.error("关闭Connection失败",e); } } } /* * 查询多个对象的方法 * * sql: 要执行的sql语句 * obj:可变参数列表 */ public List<Map> queryList(String sql,Object... obj){ List<Map> data=new ArrayList<Map>(); Connection conn=getConnection(); //获得连接 PreparedStatement ps=null; ResultSet rs=null; try{ //创建PreparedStatement对象 ps=conn.prepareStatement(sql); //为查询语句设置参数 setParameter(ps, obj); //获得ResultSet结果集 rs=ps.executeQuery(); //获得结果集信息 ResultSetMetaData rsmd=rs.getMetaData(); // 获得列的总数 int columnCount=rsmd.getColumnCount(); Maprow=null; // 遍历结果集,根据信息封装成Map while(rs.next()){ row=new HashMap(); for(int i=0;i<columnCount;i++){ String columnLabel=rsmd.getColumnLabel(i+1); row.put(columnLabel, rs.getObject(columnLabel)); } data.add(row); } }catch(SQLException e){ e.printStackTrace(); logger.error("数据库操作异常",e); }finally{ //关闭连接 close(rs,ps,conn); logger.debug("释放资源成功"); } return data; } /* * 查询一个对象的方法 * * sql: 要执行的sql语句 * obj:可变参数列表 */ public Mapquery(String sql,Object... obj){ Mapdata=null; Connection conn=getConnection(); //获得连接 PreparedStatement ps=null; ResultSet rs=null; try{ //创建PreparedStatement对象 ps=conn.prepareStatement(sql); //为查询语句设置参数 setParameter(ps, obj); //获得ResultSet结果集 rs=ps.executeQuery(); //获得结果集信息 ResultSetMetaData rsmd=rs.getMetaData(); // 获得列的总数 int columnCount=rsmd.getColumnCount(); // 遍历结果集,根据信息封装成Map while(rs.next()){ data=new HashMap(); for(int i=0;i0){ //循环设置参数 for (int i = 0; i < obj.length; i++) { ps.setObject(i+1, obj[i]); } } } }
操作类,进行增删改查 UserDao.java
package com.accp.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Map; import com.accp.entity.User; public class UserDao extends BaseDao { public static void main(String[] args) { UserDao user=new UserDao(); /* //查询id<20的数据 user.queryUser(); //查询单条数据 user.queryUserById(10); //更新数据 User u=new User(); u.setId(2); u.setName("张龙"); u.setAge(22); System.out.println("更新"+user.updateUser(u)+"条数据"); //删除数据 System.out.println("删除"+user.deleteUser(15)+"条数据"); //插入数据 User u1=new User(); u1.setName("张三"); u1.setAge(18); user.insertUser(u1); */ } //查询多条信息 public void queryUser(){ List<Map> dataUser=queryList("select * from users where id<20"); //遍历结果集 for(Mapu:dataUser){ System.out.println(u); } } //查询单条数据 public void queryUserById(int id){ System.out.println(query("select * from users where id=?",id)); } //更新数据 public int updateUser(User user){ String sql="update users set name=?,age=? where id=?"; return update(sql, user.getName(),user.getAge(),user.getId()); } //删除数据 public int deleteUser(int id){ String sql="delete from users where id=?"; return update(sql,id); } //插入数据,并返回自动增长的的主键值 public void insertUser(User user){ Connection conn=getConnection(); //获得连接 PreparedStatement ps=null; ResultSet rs=null; String sql="insert into users values(?,?)"; try{ // 创建能返回自动生成的主键的值的预编译对象 ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setString(1,user.getName()); ps.setInt(2, user.getAge()); int rows=ps.executeUpdate(); // 获得自动增长的的主键值 rs=ps.getGeneratedKeys(); rs.next(); //获得id int id=rs.getInt(1); System.out.println("成功添加:"+rows+"条数据,id是:"+id); }catch(SQLException e){ e.printStackTrace(); }finally{ close(rs,ps,conn); } } }
插入测试数据 InsertTest.java
package com.accp.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class InsertTest extends BaseDao { public static void main(String[] args) { InsertTest user=new InsertTest(); user.insertUser(); } public void insertUser() { String sql = "insert into users values(?,?)"; Connection conn = getConnection(); PreparedStatement ps = null; try { // 禁止自动提交事务 conn.setAutoCommit(false); // 创建能返回自动生成的主键的值的预编译对象 ps = conn.prepareStatement(sql); //开始时间的毫秒数 Long start=System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { ps.setString(1, i+""); ps.setInt(2, 22); ps.addBatch();// 添加到批处理命令中 } ps.executeBatch();// 执行批处理 conn.commit();// 提交事务 //结束时间的毫秒数 Long stop=System.currentTimeMillis(); //得到总耗时 Long ms=stop-start; System.out.println("插入一万记录耗时:"+ms+"毫秒"); } catch (SQLException e) { e.printStackTrace(); //取消事务 try{ conn.rollback(); }catch(SQLException ee){ ee.printStackTrace(); } } finally { //打开自动提交事务 try { conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } close(null, ps, conn); } } }