Jdbc基础 工具类 连接池到dbutils
来源:互联网 发布:ff14 npc捏脸数据库 编辑:程序博客网 时间:2024/06/07 04:54
jdbc最基础的就是使用statement 一共有几步
1注册驱动
2.获得连接
3.获得语句执行者平台
4.执行sql语句
5处理结果
6释放资源
当然 得先导包
public class ejdbc { public static final String url = "jdbc:mysql://localhost:3306/chartroom"; public static final String name = "com.mysql.jdbc.Driver"; public static final String user = "root"; public static final String password = "admin"; public static void main(String[] args) { String sql ="select * from user"; try { //获取驱动 Class.forName(name); //获得连接 Connection conn=DriverManager.getConnection(url,user,password); //获取语句执行者 Statement pst =conn.createStatement(); ResultSet rs = pst.executeQuery(sql); while(rs.next()){ System.out.println(rs.getString("username")+" "+rs.getInt("password")); } } catch (Exception e) { e.printStackTrace(); }}}
二 因为有sql注入攻击的问题 而且statement使用起来比较麻烦 ,为了使用sql语句占位符 所以把statement舍弃了 使用preperstatement
public class papresta { public static final String url = "jdbc:mysql://localhost:3306/chartroom"; public static final String name = "com.mysql.jdbc.Driver"; public static final String user = "root"; public static final String password = "admin"; public static void main(String[] args) { String sql ="select * from user where username=?"; try { Class.forName(name); Connection conn =DriverManager.getConnection(url, user, password); PreparedStatement psd = conn.prepareStatement(sql); psd.setString(1, "aaa"); ResultSet rs = psd.executeQuery(); while(rs.next()){ System.out.println(rs.getString("username")+" "+rs.getInt("password")); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
三 后来因为每次使用都得注册驱动 获得连接 还有释放资源 很麻烦 所以把这些抽取出来做成一个工具类 以后使用的时候就可以直接调用方法获得连接 释放资源
public class Jdbcutils_v1 { static Connection conn =null;/** * 获取连接 * */ public static Connection getConnection() { try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/chartroom","root", "admin"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void release(Connection conn,PreparedStatement pst,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
使用起来是这个样子
public void testusername(){ try{ String sql ="select * from user where username=?"; conn =Jdbcutils_v1.getConnection(); pst = conn.prepareStatement(sql); pst.setString(1, "aaa"); rs =pst.executeQuery(); while(rs.next()){ System.out.println(rs.getString("username")+" "+rs.getInt("password")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Jdbcutils_v1.release(conn, pst, rs); } } }
再后来感觉每次换数据库什么的得修改代码 为了不修改代码 所以把这些url什么的抽取出来 到一个文件中 用代码去获取这些文件 每次换数据库就可以直接修改这个文件就行了就不用再修改代码了 所以把
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/chartroom?useUnicode=true&characterEncoding=utf8username=rootpassword=admin
放到jdbc.peoperties文件中 获取方法有两个
第一个使用ResourceBundle bundle = ResourceBundle.getBundle(“Jdbc”);获取
工具类代码是
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ResourceBundle;public class Jdbcutils_v2 { private static String driver; private static String url; private static String username; private static String password; static{ ResourceBundle bundle = ResourceBundle.getBundle("Jdbc"); driver = bundle.getString("driver"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); } static Connection conn =null; /** * 获取连接 * */ public static Connection getConnection() { try { Class.forName(driver); conn=DriverManager.getConnection(url,username, password); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void release(Connection conn,PreparedStatement pst,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
测试
public void testadd(){ try{ String sql ="insert into user values(5,?,?,null)"; conn =Jdbcutils_v2.getConnection(); pst = conn.prepareStatement(sql); pst.setString(1, "你好"); pst.setInt(2, 123); int rows =pst.executeUpdate(); if(rows>0){ System.out.println("成功"); }else{ System.out.println("shibai"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Jdbcutils_v1.release(conn, pst, rs); } }
还有一种获取方法是通过类加载器获得
public class Jdbcutils_v3 { private static String driver; private static String url; private static String username; private static String password; static{ try { //通过当前类获取类加载器 ClassLoader classloader=Jdbcutils_v3.class.getClassLoader(); //通过类加载器获得输入流 InputStream is =classloader.getResourceAsStream("Jdbc.properties"); //创建一个properties对象 Properties pro = new Properties(); //加载输入流 pro.load(is); //获取相关参数值 driver =pro.getProperty("driver"); url = pro.getProperty("url"); username = pro.getProperty("username"); password = pro.getProperty("password"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } static Connection conn =null; /** * 获取连接 * */ public static Connection getConnection() { try { Class.forName(driver); conn=DriverManager.getConnection(url,username, password); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void release(Connection conn,PreparedStatement pst,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
测试
public void dele(){ try{ conn =Jdbcutils_v3.getConnection(); String sql ="delete from user where id=?"; pst = conn.prepareStatement(sql); pst.setInt(1, 6); int rows =pst.executeUpdate(); if(rows>0){ System.out.println("成功"); }else{ System.out.println("shibai"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Jdbcutils_v3.release(conn, pst, null); } }
四 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序.
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池.
c3p0导包 然后设置设置配置文件这个网上一大堆 就不写了
public class ctest { @Test public void adduser(){ Connection conn=null; PreparedStatement pst=null; ComboPooledDataSource DataSource = new ComboPooledDataSource(); try { conn=DataSource.getConnection(); String sql ="insert into user values(6,?,?,null)"; conn =Jdbcutils_v2.getConnection(); pst = conn.prepareStatement(sql); pst.setString(1, "你好"); pst.setInt(2, 123); int rows =pst.executeUpdate(); if(rows>0){ System.out.println("成功"); }else{ System.out.println("shibai"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Jdbcutils_v3.release(conn, pst, null); } }}
这里的释放不是以前的关闭了 c3p0使用装饰者模式重写了connection中的获取连接 这里改变了
五 DButils
我们知道在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口了。
1.MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
2.MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
3.BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
4.BeanListHandler:多行处理器!把结果集转换成List;
5.ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
6.ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
public class dbutils { public void adduser(){ try { //创建核心类QueryRunner QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse()); String sql = "insert into user values(1,?,?,?)"; Object[] params ={"abc","123","admin"}; //执行查询操作 int rows=qr.update(sql, params); if(rows>0){ System.out.println("成功"); }else{ System.out.println("失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void selectuser(){ try { //创建核心类QueryRunner QueryRunner qr = new QueryRunner(C3p0utils.getDataSourse()); String sql = "select * from user "; //执行查询操作 List<User> users=qr.query(sql, new BeanListHandler<User>(User.class)); for(User user:users){ System.out.println(user.toString()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
- Jdbc基础 工具类 连接池到dbutils
- JDBC连接池&DBUtils
- JDBC连接池&DBUtils
- JDBC-DBUtils工具类
- Day11-JDBC连接池&DBUtils
- JDBC : 使用DBUtils 工具类
- (五)JDBC连接池&DBUtils—DBUtils完成CRUD
- JDBC之事务、连接池、dbutils
- JDBC、事物、连接池、DBCP、C3P0、DBUtils
- JDBC之事务、连接池、dbutils
- 开源JDBC工具类之DbUtils解析
- JDBC(12)—DBUtils工具类
- JDBC之DbUtils工具
- JDBC工具-DBUtils
- 【java基础:JDBC】基于DPCP连接池工具包和DBUtils工具包的数据库改查Demonstration
- 【java基础:JDBC】基于DBUtils工具类查询数据库的8种方式!非常重要!
- Druid连接池与DbUtils整合工具类
- (一)JDBC连接池&DBUtils—自定义连接池
- Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.
- SPF算法中的ISPF和PRC介绍
- Java——内部类
- Electron:资源
- thinkphp5.0学习(六): 获取请求类和URL基本信息
- Jdbc基础 工具类 连接池到dbutils
- Android计算器小程序
- 【Shader】Unity Unlit Shader(无光照着色器)
- static关键字
- Keras Tensorflow tutorial: Practical guide from getting started to developing complex deep neural ne
- SLAM+AR 技术与应用的一些思考
- Mysql 中view创建
- spring整合redis缓存
- Trunk(主线), Branch(分支), Tag(标记)