JAVA jdbc(数据库连接池)学习笔记(转)
学习内容:
1.JDBC的含义...
JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些API...
2.使用JDBC的原因...
那么为什么要使用,这个想必大家也是更为了解了,一个应用程序如果不和数据库进行连接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操作的,那么就需要一个辅助工具去连接数据库,从而操作数据库...那这个辅助的工具就是JDBC了,这个仅限于JAVA应用程序...其实总体的规模就是这样:应用程序——>JDBC——>(mysql driver——>mysql)
JDBC——>(oracle driver——>oracle)
JDBC——>(DB2 driver——>db2)就是这么简单的事...多余的就不罗嗦了...
3.如何使用JDBC...
如何使用JDBC,才是真正的重点...使用JDBC分为几个步骤...
我这里只对链接mysql进行讲解...
i.首先注册驱动
- Class.forName("com.mysql.Driver");//这种方式是最好的,不会对具体驱动产生依赖...
- DriverManager.registerDriver(com.mysql.jdbc.Driver);//会产生两个相同的驱动,并会对具体驱动产生依赖...
- System.setProperty("jdbc.drivers","driver1:driver2");//基本不常用,所以可以不用记,一般就使用第一种就行了...
ii.建立连接
- Connection conn = DriverManager.getConnection(url, user, password);
iii.创建执行SQL语句...

- 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();

iv.处理执行结果...
- ResultSet rs = statement.executeQuery(sql);
- While(rs.next()){
- rs.getString(“col_name”);
- rs.getInt(“col_name”);
- }
v.释放资源...
释放资源这是必须的,使用close()进行关闭...由于数据库的资源是非常珍贵的,因此只要我们不去使用资源的时候,一定要记得释放...
先来个例子:还是例子更加的好理解...

- import java.sql.*;//1.引包是必须的...
- public class JDBC_1_1 {
- static final String JDBC_DRIVER="com.mysql.jdbc.Driver";
- static final String DB_URL ="jdbc:mysql://localhost:3306/emp";//这个链接是我本机的数据库emp...emp里有个表格叫employees....
- /*表格的信息
- *create table employees
- *(
- * id int not null,
- * first varchar(255) not null,
- * last varchar(255) not null,
- * age int not null
- *);
- */
- static final String USER="root";//登陆数据库时的用户名...
- static final String PAS="49681888";登陆时的密码...
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Connection conn=null;
- Statement stmt=null;//
- try {
- //2.注册JDBC驱动程序...
- Class.forName("com.mysql.jdbc.Driver");
- //3.打开一个链接...
- System.out.println("Connection database....");
- conn=DriverManager.getConnection(DB_URL,USER,PAS);
- //4.执行一个操作...
- System.out.println("Creating statement");
- stmt=conn.createStatement();
- // String sql;
- // sql="select id,first,last,age from employees"; 这个是查询操作...
- // ResultSet rs=stmt.executeQuery(sql);
- String sql_1="insert into employees " + "values (7, 'z', 'yh', 20)";//插入操作...
- stmt.executeUpdate(sql_1);
- 5.提取数据...
- // while(rs.next()){ //rs用来保存sql执行后的结果...
- // int id=rs.getInt("id");
- // int age=rs.getInt("age");
- // String first=rs.getString("first");
- // String last=rs.getString("last");
- // System.out.println(id+" "+age+" "+first+" "+last);
- // }
- 6.清理环境
- // rs.close();
- stmt.close();
- conn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- System.out.println("no class");
- }finally{
- if(stmt!=null){
- try {
- stmt.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();
- }
- }
- }
- System.out.println("Goodbye");
- }
- }

其他操作,比如说删除啊,更改啊,这个模式基本都差不多...就不进行解释了...
注意:如果我们使用JDBC的时候,一定要检查检查自己的的jdk的lib文件夹下有没有mysql-connector-java-5.1.18-bin.jar这个压缩文件..如果没有,那么程序运行时会出现错误...解决方法就是我们下一个mysql-connector-java-5.1.18-bin.jar这个文件,几k而已,下载完毕之后直接拷贝到jdk的lib文件夹下即可..
如果使用的是eclipse,我们还要导入这个文件...右击我们建立的项目文件,然后点击build path——>configure build path,弹出对话框以后,点击Libraries——>Add External JARs...找到这个mysql-connector-java-5.1.18-bin.jar文件导入,然后就可以了...
4.使用JDBC实现CURD操作...什么是CURD操作呢?其实就是对数据进行更新,删除等操作...
这里我们采用分层操作...这个代码很长...
首先是User实体...

- package JDBC_3;
- import java.util.Date;
- class User{ //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层,就是接口...

- package JDBC_3;
- interface UserDao{
- public abstract void addUser(User user);
- public abstract User getUserById(int userid);
- public abstract int update(User user);
- public abstract int delete(User user);
- }

然后是实现接口的类...

- package JDBC_3;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.sql.Date;
- import java.sql.ResultSet;
- /*
- * JDBC实现crud操作
- * crud操作就是对数据进行增删改查...
- * */
- public class JDBC_3_1_server implements UserDao{
- static final String DB_URL="jdbc:mysql://localhost:3306/emp";
- static final String user_1="root";
- static final String pas="49681888";
- static{
- try {
- Class.forName("com.mysql.jdbc.Driver");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public void addUser(User user){
- Connection cn=null;
- PreparedStatement ps=null;
- try {
- cn=DriverManager.getConnection(DB_URL,user_1,pas);
- String sql="insert into userr values(2,'clearlove','1995-01-26',200)";
- //String sql="insert into userr values(?,?,?,?)";这句话是传参数是未知的,需要我们进行获取...
- ps=cn.prepareStatement(sql);
- //这四个函数就是为了获取我们插入的信息...上面采用了直接在sql里写入我们要插入的数据,其实我们也可以在主函数里进行传参...见下面主函数...
- // ps.setInt(1,user.getid());
- // ps.setString(2,user.getName());
- // ps.setDate(3, new Date(user.getBirthday().getTime()));
- // ps.setFloat(4, 20);
- int count=ps.executeUpdate();
- System.out.println("添加的记录数"+count);
- ps.close();
- cn.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- if(ps!=null){
- try {
- ps.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- if(cn!=null){
- try {
- cn.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
- public User getUserById(int userid){
- Connection cn=null;
- PreparedStatement ps=null;
- ResultSet rs=null;
- try {
- cn=DriverManager.getConnection(DB_URL,user_1,pas);
- String sql="select * from userr where id=1";
- //导入sql语句...
- ps=cn.prepareStatement(sql);
- //保存执行sql语句后的结果对象...
- rs=ps.executeQuery();
- ps.close();
- cn.close();
- rs.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- if(ps!=null){
- try {
- ps.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if(rs!=null){
- try {
- rs.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if(cn!=null){
- try {
- cn.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return null;
- }
- public int update(User user){
- Connection cn=null;
- PreparedStatement ps=null;
- try {
- cn=DriverManager.getConnection(DB_URL,user_1,pas);
- String sql="update userr set name='clearlove',birthday='1994-12-19',money=60 where id=1";
- ps=cn.prepareStatement(sql);
- int count=ps.executeUpdate();
- return count;
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- try {
- cn.close();
- ps.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return 0;
- }
- public int delete(User user){
- Connection cn=null;
- PreparedStatement ps=null;
- try {
- cn=DriverManager.getConnection(DB_URL,user_1,pas);
- String sql="delete from userr where id=1";
- ps=cn.prepareStatement(sql);
- int count=-1;
- count=ps.executeUpdate();
- return count;
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- try {
- cn.close();
- ps.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return 0;
- }
- }

接着是服务层...

- package JDBC_3;
- class userserves {
- private UserDao userDao;
- public userserves(){
- userDao =DaoFactory.getInstance().createUserDao();//通过工厂实例化一个例子。。
- System.out.println("userDao "+userDao);
- }
- public void regist(User user){
- if(user==null){
- System.out.println("注册表信息无效...");
- }else{
- userDao.addUser(user);
- }
- }
- 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);
- }
- public void update(User user){
- if(user.getid()<0){
- System.out.println("用户id无效,重新输入");
- }else{
- userDao.update(user);
- }
- }
- public void delete(User user){
- if(user.getid()<0){
- System.out.println("用户id无效,重新输入");
- }else{
- userDao.delete(user);
- }
- }
- }

定义一个工厂模式来实例化对象UserDao。。。

- package JDBC_3;
- class DaoFactory{
- private static UserDao userdao=null;
- private static DaoFactory instance= new DaoFactory();
- private DaoFactory(){
- try {
- userdao=(UserDao)Class.forName("JDBC_3.JDBC_3_1_server").newInstance();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static DaoFactory getInstance(){
- return instance;
- }
- public UserDao createUserDao(){
- return userdao;
- }
- }

最后是测试类...

- package JDBC_3;
- import java.sql.Date;
- public class JDBC_3_1_ceshi {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- userserves userse=new userserves();
- System.out.println("添加用户");
- userse.regist(new User()); //这句话我们也可以这样
- //userse.regist(new User(1,"clearlove","1995-01-26",300));这样写我们可以固定传参...但是上面的一些代码就要进行修改了...
- }
- }

上面的代码估计是有点长,但是也没关系...一名优秀的程序员这点代码对于我们来说算什么呢?其实上面的例子是很好理解的...都是一些基本的东西...
我们除了上述那种方式可以对类名进行加载,我们还可以使用proprties...是一种很灵活的方式...

- 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(Exception e){
- }
- }

这里的数据库就是一个简单的数据库...

- create table userr
- (
- id int not null,
- name varchar(255) not null,
- birthday Date,
- money float not null
- );
http://www.cnblogs.com/RGogoing/p/4515521.html
JAVA jdbc(数据库连接池)学习笔记(转)的更多相关文章
- JAVA jdbc(数据库连接池)学习笔记(二) SQL注入
PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念... 所谓SQL注 ...
- JAVA jdbc(数据库连接池)学习笔记(一)
学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些 ...
- Java jdbc数据库连接池总结!(转)
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
- day13_Mysql事务与数据库连接池学习笔记
一.Mysql事务 事务: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功(数据回滚). 例如:A给B转帐,对应于如下两条sql语句 : update account ...
- Java -- JDBC 数据库连接池
1. 原理代码示例 public class JdbcPool implements DataSource { private static LinkedList<Connection> ...
- Java自学-JDBC 数据库连接池
数据库连接池 与线程池类似的,数据库也有一个数据库连接池. 不过他们的实现思路是不一样的. 本章节讲解了自定义数据库连接池类:ConnectionPool,虽然不是很完善和健壮,但是足以帮助大家理解C ...
- JAVA之JDBC数据库连接池总结篇
JDBC数据库连接池 一.JDBC数据库连接池的必要性 二.数据库连接池技术 三.多种开源的数据库连接池 3.1 C3P0数据库连接池 3.2 DBCP数据库连接池 3.3 Druid(德鲁伊)数据库 ...
- JAVA基础知识之JDBC——JDBC数据库连接池
JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...
- JDBC 数据库连接池
http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html JDBC 数据库连接池 小结 当对数据库的访问不是很频繁时,可以在每次 ...
随机推荐
- CentOS6-釋放ip重新分配,centos7 ifconifg没有ip
http://bbs.csdn.net/topics/390725823 系统win7 ,dhcp自动获取ip虚拟机是10.0 安装之后我装了ubuntu 选用 NAT网络, 刚装完我能上网 ,但是 ...
- VC生成的DLL给QT的EXE调用时lib路径问题小结
VC生成的DLL给QT调用,有两种方式,一种是隐式调用调用(使用.lib文件方式): ① 在*.pro工程文件中添加VC生成的lib文件路径时,或者使用一个绝对路径,如: LIBS += " ...
- Linux 技巧之 Grub 超实用技巧
1. 简单介绍 什么是 GRUB?GRUB 全名Grand Unified Boot Loader,它是一个引导装入器 -- 它负责装入内核并引导 Linux 系统.GRUB 还能够引导其他操作系统, ...
- OpenCV HaarTraining代码解析(二)cvCreateMTStumpClassifier(建立决策树)
HaarTraining关键的部分是建立基分类器classifier,OpenCV中所採用的是CART(决策树的一种):通过调用cvCreateMTStumpClassifier来完毕. 这里我讨论利 ...
- 浏览器url传参中文时得到null的解决方法
在写一个中文参数需求的时候遇到了以下问题,经过半天的测试和各种编码,以及网上一些有用没用的资料尝试终于解决 比如下面的url地址:http://travel.widget.baike.com:8 ...
- Android开发 更改返回button的图标
非常多的Android应用左上角都有返回button 在默认的情况下 ADT会默认给一个返回图标 而作为开发需求 非常多都要求定制一个新的图标 在Android的站点上 发现了2种能够更改的方法 1. ...
- TMS320F28335项目开发记录5_28335之CCS编程基础
CCS开发环境已经为我们封装好了很多片内外设寄存器的结构体,我们仅仅须要包括对应的官方的头文件就能够使用了,那么它的内部详细是怎样实现的呢? 以下来一个典型的样例: 1.使用结构体和联合体 A.用st ...
- CRL 版本2.1.0.0下载
此次更新完善了部份功能,详情见UpdateLog,重新整理了开发文档,更美档,更详细 百度盘下载 下载地址: 百度盘下载
- 大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网
大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网 大兴雷克萨斯深度剖析2013款LS460L
- [LeetCode] Search for a Range [34]
题目 Given a sorted array of integers, find the starting and ending position of a given target value. ...