java数据库链接JDBC入门基础_第1页
java数据库链接JDBC入门基础_第2页
java数据库链接JDBC入门基础_第3页
java数据库链接JDBC入门基础_第4页
java数据库链接JDBC入门基础_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JDBC:通过jdbc把java代码和DB链接起来要是使用JDBC链接数据库,就必须导入数据库相对应的驱动包 ojdbc.jarDriverManager : 管理JDBC驱动服务Connection :与特定数据库的连接(会话)。(链接数据库)Statement : 用于执行静态 SQL 语句并返回它所生成结果的对象ResultSet :结果集(表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 )PreparedStatement:表示预编译的 SQL 语句的对象(执行sql)public static Connection getConnection(String url, S

2、tring user, String password) throws SQLException url:代表链接数据库,(每个数据库链接是不一样的)user:用户名password:密码1)加载驱动类Class.forName(String str);2)链接数据库public static Connection getConnection(String url, String user, String password) throws SQLException public static final String DRIVER = oracle.jdbc.driver.OracleDriv

3、er;/orcale驱动public static final String URL = jdbc:oracle:thin:localhost:1521:XE;/数据库的urlpublic static final String USER = system;/用户名public static final String PASSWORLD= gqk;/密码1 JDBC概述JDBC是Java语言访问数据库的解决方案,也就是说,只要应用使用数据库存储数据,都会使用到JDBC编程。(也可以使用一些框架进行数据处理,本课程不涉及) JDBC包括两部分 第一部分是提供给程序员使用的API,与具体数据库无关

4、,也就是编写程序时使用API第二部分是数据库厂商根据规范实现的API,称为SPI,与具体数据库有关。也就是程序运行时,会调用到SPI。在SPI中,有一个关键的类,这个类能够帮助Java程序与数据库创建连接,称为驱动类(driver class) API JDBC的API在JavaSE中,安装JDK即可以使用 JDBC的API都存在于java.sql及javax.sql中,多数时候使用java.sql中的类和接口 SPI 下载数据库驱动包 拷贝到工程的WEB-INF/lib目录下 熟悉JDBC相关API DriverManager Connection Statement ResultSet S

5、QL语句,保证正确并高效 2 DriverManager类DriverManager类能够自动在内存中找到符合需求的的驱动类,主要用来获得与数据库的链接对象 url每个数据库有不同的规范,DriverManager类根据url能够确定需要链接的数据库类型,找到合适的驱动类,获得链接。 Connection是与特定数据库的链接对象,通过DriverManager类取得。通常使用链接对象获得语句对象,常用的语句对象有两种,所以有两个方法获得。 Statement对象可以用来执行SQL语句,使用executeQuery执行查询语句,返回结果集,使用executeUpdate执行增删改,返回操作的行数

6、。 如果要多次执行相似的SQL语句,可以使用PreparedStatemend(预编译语句对象)对象来执行,进行了预编译,效率较高;可以执行带?的SQL语句,?使用setX方法赋值。ResultSet对象用来封装查询得到的结果集,常用的方法有next以及getXXX方法。注意:必须使用next()方法,才能处理结果集。 3 使用JDBC进行增删改使用MySQL数据库 创建数据库demo,demo中创建表user username:用户名 pwd:密码 status:状态(0,正在审核;1:审核通过;2:审核未通过) qq:QQ号码 registtime:注册时间准备驱动程序包要使用JDBC编程

7、,必须把相关数据库的驱动程序包导入到当前工程 每个数据库的驱动程序包不同,可以搜索下载。 把驱动程序包拷贝到WEB-INF/lib下即可 1:加载驱动类使用TestJDBC类做演示。 在进行JDBC编程时,有一个很重要的类,叫驱动类。存在于数据库的驱动包中,首先要把驱动类加载到内存中。每个数据库的驱动类不同。 Connection conn=null;try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace(); 2:获得Connection连接对象使用DriverM

8、anager获得链接对象。获得链接时,需要指定url连接串,每个数据库不同,以及用户名、密码。 Connection conn=null;try Class.forName(com.mysql.jdbc.Driver);conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/demo?useUnicode=true&characterEncoding=utf8,root,123); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException

9、 e) e.printStackTrace();3:获得Statement语句对象得到链接对象后,就可以获得语句对象。语句对象常用的有两种,我们先使用Statement。 Connection conn=null;Statement stmt=null;try Class.forName(com.mysql.jdbc.Driver);conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/demo?useUnicode=true&characterEncoding=utf8,root,123);stmt=conn.create

10、Statement(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();4:执行SQL语句要执行insert语句,因此使用Statement中的executUpdate方法 Connection conn=null;Statement stmt=null;try Class.forName(com.mysql.jdbc.Driver);conn = DriverManager.getConnection(jdbc:mysql:/localhost:

11、3306/demo?useUnicode=true&characterEncoding=utf8,root,123);stmt=conn.createStatement();String sql=insert into user values(wangxh,1,1,29097443,2015-01-15 16:37:00);stmt.executeUpdate(sql); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); 5:关闭资源语句对象、链接对

12、象都是占资源的对象,使用后要在finally语句块中关闭。 finallyif(stmt!=null)try stmt.close(); catch (SQLException e) e.printStackTrace(); if(conn!=null)try conn.close(); catch (SQLException e) e.printStackTrace();执行测试类TestJDBC.java,可以查看数据库,插入了一条记录。修改测试数据,插入多条记录。 目前TestJDBC.java的testInsert()方法,每次insert的数据值都是写在SQL语句中,不灵活 我们需要

13、设计一个新的方法 testInsert(String username,String pwd, String status,String QQ,String time),通过参数插入记录。 当SQL语句中需要使用变量作为参数时,可以考虑使用PreparedStatment 使用PreparedStatment步骤1-2与之前例子相同 步骤3:获得PreparedStatment语句对象。创建PreparedStatement时,需要使用一个SQL语句字符串,SQL语句中需要使用到变量的参数之处,可以使用?占位。 String sql=insert into user values(?,?,?,

14、?,?);pstmt=conn.prepareStatement(sql); 步骤4:使用PreparedStatment的setX方法,为?赋值。并执行。 pstmt.setString(1,username);pstmt.setString(2, pwd);pstmt.setString(3,status);pstmt.setString(4, qq);pstmt.setString(5, time);pstmt.executeUpdate(); 步骤5:关闭资源,与之前例子相同 在做JDBC编程过程中,主要使用JDBC的API编程,其中只有驱动类名称、连接串写法,与具体数据库有关,其他都

15、有数据库无关。 主要步骤: 加载驱动类 获得连接对象 获得语句对象 执行SQL语句 关闭资源 语句对象:常用的语句对象有两种,分别是Statement,PreparedStatement。其中PreparedStatement多次执行相同SQL语句时,效率会较高。往往在实际工作中,SQL语句中的参数是变量时,会使用PreparedStatement。 4 使用JDBC进行查询查询与增删改有哪些区别查询与增删改的前三个步骤完全相同,即加载驱动类、获得连接对象、获得语句对象,完全相同。 查询也可以使用Statement和PreparedStatement两种,此处只演示Statement。 查询比

16、增删改多一个重要步骤:处理结果集。查询的主要目的就是要查看返回的结果,因此查询的必要步骤就是对结果集的处理。 查询步骤1-4:步骤1-3省略,在TestJDBC.java类中的testSelectByStatus(String status)方法中测试查询 步骤4:执行查询 String sql=select * from user where status=+status;ResultSet rs=stmt.executeQuery(sql); 步骤5:处理结果集查询后返回ResultSet,先使用next()方法,然后使用getXXX方法获取每一个字段。 while(rs.next()Sy

17、stem.out.println(rs.getString(1)+ +rs.getString(2)+ +rs.getString(3)+ +rs.getString(4)+ +rs.getString(5); 用JDBC进行查询,比起增删改,主要的区别是必须处理结果集 处理结果集时,必须先调用next()方法,即使返回一条记录,也必须调用该方法 getXXX方法可以返回结果集中不同类型的字段值,可以通过索引返回,注意从1开始,也可以使用字段名返回。 5 使用JDBC修改登录步骤1:创建工具类ConnectionFactory在进行JDBC操作时,每次都需要获得数据库连接,因此,可以先写一个工

18、具类,用来获得数据库连接、关闭数据库连接。 public class ConnectionFactory / 声明一个静态连接对象,即ConnectionFactory每次获得的连接对象都是同一个对象private static Connection conn = null;/ 声明静态方法,获得数据库连接public static Connection getConnection() try Class.forName(com.mysql.jdbc.Driver);conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/de

19、mo?useUnicode=true&characterEncoding=utf8,root, 123);/省略其他代码 return conn;步骤2:修改User类本节中的用户多了两个属性,即QQ号码、注册时间,因此VO类User应该修改,增加这个两个属性,并增加对应的getter/setter,以及构造方法 注意注册时间在MySQL中使用Datetime,对应的JDBC类型是Timestamp public class User private String username;private String pwd;private String status;private String

20、qq;private Timestamp registtime; 步骤3:重新编写UserDAO类上一章的UserDAO通过读文本文件,查询文本文件中的记录,确定是否存在用户名和密码。 本节的UserDAO,通过使用JDBC编程,查询User表。 public User selectByNamePwd(String username,String pwd)User user=null;String sql=select * from User where username=? and pwd=?;PreparedStatement pstmt=null;ResultSet rs=null;tr

21、y pstmt=conn.prepareStatement(sql);pstmt.setString(1, username);pstmt.setString(2, pwd); rs=pstmt.executeQuery(); if(rs.next() user=new User(rs.getString(1),rs.getString(2),rs.getString(3); /省略其他代码 步骤4:重用上一章的视图和控制器及Service类可以直接重用上一章中的JSP和Servlet、以及Model中的LoginService 部署应用ch05,访问测试。 可以得到与上一章相同的效果。 进一

22、步理解MVC的优点,代码的可维护性较高:只需要修改DAO即可。 6 JDBC编程步骤JDBC编程步骤 把数据库的驱动程序包拷贝到WEB-INF/lib下 使用Class.forName加载驱动类,每个数据库驱动类不同 使用DriverManager.getConnection获得连接对象,每个数据库的连接串不同 使用Connection中的createStatement方法获得Statement对象;或者preparedStatement方法获得PreparedStatement 使用语句对象中的方法执行SQL语句,查询使用executeQuery方法,增删改使用executeUpdate方法

23、 查询返回ResultSet结果集,使用next方法进行迭代 关闭资源:连接对象、语句对象、结果集对象 获得连接对象的方法连接对象是比较占用资源的对象,目前的方法是使用一个工具类获得连接,使用后即关闭。这种方法显然不合理,会频繁创建连接对象。 在JavaEE应用中,往往使用连接池管理数据库连接,在后续学习中将使用,目前使用工具类。 JDBC编程注意事项连接对象使用后一定要关闭。 数据库中的数据类型,在JDBC中都有对应的类型。例如varchar对应String,Datetime对应Timestamp等。不同的数据库系统数据类型有所区别,具体编程时可以进行查询。 PreparedStatemen

24、t的setXXX方法,以及ResultSet的getXXX方法,索引都是从1开始。 引入类的时候,都引入java.sql包的,不要引入和数据库有关的包,例如com.mysql等。 案例1 java链接数据库JDBCutil.javapackage com.wwww.eec.jdbc;import java.sql.Connection;import java.sql.DriverManager;public class ConnectionJdbc public static final String DRIVER = oracle.jdbc.driver.OracleDriver;/orca

25、le驱动public static final String URL = jdbc:oracle:thin:localhost:1521:XE;/数据库的urlpublic static final String USER = SCOTT;/用户名public static final String PASSWORLD = SCOTT;/密码public static void main(String args) Connection conn = null; /声明Connection try Class.forName(DRIVER);/加载驱动conn = DriverManager.g

26、etConnection(URL,USER,PASSWORLD);System.out.println(conn);System.out.println(链接成功);conn.close(); catch (Exception e) / TODO: handle exceptione.printStackTrace(); 2 PreparedStatement和Statement的区别数据库插入数据ConnectionJdbc.javapackage com.wwwwww.eec.jdbc;import java.sql.Connection;import java.sql.Date;impo

27、rt java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;import java.text.ParseException;import java.text.SimpleDateFormat;import com.chinasofti.eec.jdbcutil.JDBCutil;import com.chinasofti.eec.vo.User;public class ConnectionJdbc2 static Connection conn = null;/获取数据库链接 sta

28、tic Statement s = null;/执行静态sql static PreparedStatement ps = null;/预编译执行sql语句public static void main(String args) throws ParseException java.util.Date d = null;/声明util类的dated = new SimpleDateFormat(yyyy-MM-dd).parse(1989-11-15);/格式化Date date = new java.sql.Date(d.getTime();insertInfo1(new User(李四,

29、date);public static void insertInfo(User user)String sql = INSERT INTO t_user VALUES+(myseq.nextval,+user.getName()+,+TO_DATE(1990-11-15,yyyy-MM-dd)+);/String sql = INSERT INTO t_user VALUES+(myseq.nextval,+user.getName()+,+d+);System.out.println(sql);conn = JDBCutil.getConnection();/链接数据库try s = co

30、nn.createStatement();/获得Statement对象int count = s.executeUpdate(sql);/返回的是改变的行记录数if(count=1)System.out.println(插入成功);elseSystem.out.println(插入失败); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();public static void insertInfo1(User user)conn = JDBCutil.getConnection();Strin

31、g sql = INSERT INTO t_user VALUES+(myseq.nextval,?,?);try ps = conn.prepareStatement(sql);ps.setString(1, user.getName();ps.setDate(2, user.getDate();int count = ps.executeUpdate();if(count=1)System.out.println(插入成功);elseSystem.out.println(插入失败); catch (SQLException e) / TODO Auto-generated catch bl

32、ocke.printStackTrace();User.javapackage com.wwwwww.eec.vo;import java.sql.Date;public class User private int id;private String name;private Date date;public User(String name, Date date) = name;this.date = date;public int getId() return id;public void setId(int id) this.id = id;public Strin

33、g getName() return name;public void setName(String name) = name;public Date getDate() return date;public void setDate(Date date) this.date = date;连续插入多个数据package com.chinasofti.eec.jdbc;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.SQLExc

34、eption;import java.sql.Statement;import java.text.ParseException;import java.text.SimpleDateFormat;import com.chinasofti.eec.jdbcutil.JDBCutil;import com.chinasofti.eec.vo.User;public class ConnectionJdbc2 static Connection conn = null;/获取数据库链接 static Statement s = null;/执行静态sql static PreparedState

35、ment ps = null;/预编译执行sql语句public static void main(String args) throws ParseException java.util.Date d = null;/声明util类的dated = new SimpleDateFormat(yyyy-MM-dd).parse(1989-11-15);/格式化Date date = new java.sql.Date(d.getTime();/insertInfo1(new User(李四, date);insertInfo(new User(李四, date); public static

36、void insertInfo(User user)String sql = INSERT INTO t_user VALUES+(myseq.nextval,+user.getName()+,+TO_DATE(1990-11-15,yyyy-MM-dd)+);/String sql = INSERT INTO t_user VALUES+(myseq.nextval,+user.getName()+,+d+);System.out.println(sql);conn = JDBCutil.getConnection();/链接数据库try s = conn.createStatement()

37、;/获得Statement对象s.addBatch(sql);s.addBatch(sql);s.addBatch(sql);s.addBatch(sql);s.addBatch(sql);int count = s.executeBatch();if(count.length=1)System.out.println(插入成功);System.out.println(count.length);elseSystem.out.println(插入失败); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTr

38、ace();public static void insertInfo1(User user)conn = JDBCutil.getConnection();String sql = INSERT INTO t_user VALUES+(myseq.nextval,?,?);try ps = conn.prepareStatement(sql);ps.setString(1, user.getName();ps.setDate(2, user.getDate();int count = ps.executeUpdate();if(count=1)System.out.println(插入成功)

39、;elseSystem.out.println(插入失败); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();MVC下java连接数据库Package jdbcutil/数据库在util里面放JDBCutil.javapackage com.chinasofti.eec.jdbcutil;/数据库在util里面放/* * 链接数据库的工具类,链接数据库 */import java.sql.Connection;import java.sql.DriverManager;public clas

40、s JDBCutil public static final String DRIVER = oracle.jdbc.driver.OracleDriver;/orcale驱动public static final String URL = jdbc:oracle:thin:localhost:1521:XE;/数据库的urlpublic static final String USER = system;/用户名public static final String PASSWORLD= gqk;/密码public static Connection getConnection()Connec

41、tion conn = null;/声明Connectiontry Class.forName(DRIVER);/加载驱动conn = DriverManager.getConnection(URL,USER,PASSWORLD);System.out.println(链接成功); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();return conn;Package vo 实体package com.chinasofti.eec.vo;/实体类封装import java.sql.Date;pub

42、lic class User private int id;private String name;private Date date;public User() super();public User(String name, Date date) = name;this.date = date;public int getId() return id;public void setId(int id) this.id = id;public String getName() return name;public void setName(String name) thi

43、 = name;public Date getDate() return date;public void setDate(Date date) this.date = date;Overridepublic String toString() return User id= + id + , name= + name + , date= + date + ;Package dao 工具类UserDao.javapackage com.chinasofti.eec.dao;/创建接口daoimport java.util.List;import com.chinasofti.eec

44、.vo.User;public interface UserDao public abstract int insert(User user); /User来接收List queryAllUser();/查询语句User queryUserById(int id);UserDaoImpl.javapackage com.chinasofti.eec.dao;/实现接口import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException

45、;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import com.chinasofti.eec.jdbcutil.JDBCutil;import com.chinasofti.eec.vo.User;public class UserDaoImpl implements UserDao static Connection conn = null;/获取数据库链接 static Statement s = null;/执行静态sql static PreparedStatement ps

46、= null;/预编译执行sql语句 static ResultSet rs = null;/声明查询的结果集Overridepublic int insert(User user) / TODO Auto-generated method stubreturn 0;Overridepublic List queryAllUser() List list = new ArrayList();/创建List对象用来存放查询出来的数据/链接数据库conn = JDBCutil.getConnection();/链接数据库需要conn来接收一下String sql = SELECT * FROM t_user; /查询sql语句try s = conn.prepareStatement(sql);/ps预编译rs = ps.executeQuery();/结果集返回值resultset来接受pswhile(rs.next()/没有不执行看数据查完没有,next返回数据User user = new User();user.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论