第3.25课 上课 JDBC深入介绍, JDBC回顾, JDBC常用API深入介…

3_25

JDBC深入介绍

 JDBC回顾

  JDBC体系结构

  JDBC操作步骤

 

   

 

  1.注册一个driver;

 

    2. 创建一个到数据库的连接;

 

    3. 创建一个Statement;

 

    4. 执行SQL语句;

 

    5.处理结果;

 

    6.关闭JDBC对象释放资源

 

 

  数据库连接工厂类的开发

   连接MySQL数据库

/**

* 通过JDBC 连接 mysql 数据库

*/

// 创建mysql连接驱动

//Driver driver = new com.mysql.jdbc.Driver();

//驱动注册

Class.forName("com.mysql.jdbc.Driver");

// 数据库连接URL (协议://主机名:端口:数据库实例)

String url = "jdbc:mysql://localhost:3306/yayadou";

// 属性类<key,value>

Properties pro = new Properties();

// 设置连接数据库的名称和密码

pro.setProperty("user", "root");

pro.setProperty("password", "root");

// 根据url和用户名密码进行数据库连接,成功将返回一个Connection对象

Connection conn = driver.connect(url, pro);

System.out.println("连接:" + conn);

// 关闭连接,释放资源

conn.close();

  使用jdbc驱动连接不同的数据库

   常用的URL连接

 

http://127.0.0.1:8080/yayadou

jdbc:mysql://127.0.0.1:3306/city_info_db

 

 

 

1、Oracle8/8i/9i数据库(thin模式)

 

Class.forName("oracle.jdbc.driver.OracleDriver");

String url="jdbc:oracle:thin:@localhost:1521:orcl";

 

 

2、DB2数据库

 

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ");

String url="jdbc:db2://localhost:5000/city_info_db";

 

 

3、Sql Server数据库

 

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=city_info_db";

 

 

4、Sybase数据库

 

Class.forName("com.sybase.jdbc.SybDriver");

String url =" jdbc:sybase:Tds:localhost:5007/city_info_db";

 

 

5、Informix数据库

 

Class.forName("com.informix.jdbc.IfxDriver");

String url = "jdbc:informix-sqli://123.45.67.89:1533/city_info_db:INFORMIXSERVER=myserver;

 

 

6、MySQL数据库

 

//Class.forName("org.gjt.mm.mysql.Driver");

Class.forName("com.mysql.jdbc.Driver");

String url ="jdbc:mysql://localhost:3306/city_info_db?useUnicode=true&characterEncoding=utf-8"

 

 

7、PostgreSQL数据库

 

Class.forName("org.postgresql.Driver");

String url ="jdbc:postgresql://localhost/city_info_db"

 

 

8、access数据库直连用ODBC的

 

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;

String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/city_info_db.mdb");

 JDBC常用API深入介绍

  Statement对象

Statement对象用于执行不带参数的简单SQL语句。

   实例-建表

 

Class.forName("com.mysql.jdbc.Driver");

String url = "jdbc:mysql://localhost:3306/yayadou";

Connection conn = DriverManager.getConnection(url, "root", "root");

// 通过连接对象获取执行SQL语句的Statment对象

Statement stm = conn.createStatement();

// 拼装执行的SQL语句

StringBuilder createSQL = new StringBuilder();

createSQL.append("create table t_user( ");

createSQL.append(" id int primary key auto_increment , ");

createSQL.append(" username varchar(10) , ");

createSQL.append(" userpass varchar(10) , ");

createSQL.append(" logintime datetime default now() ");

createSQL.append(" ) ");

 

// 执行sql语句,如果有返回结果将为true,如果是更新或者没有返回结果将为false

boolean flag = stm.execute(createSQL.toString());

 

System.out.println(flag);

 

stm.close();

conn.close();

 

   实例-新增数据

 

Class.forName("com.mysql.jdbc.Driver");

String url = "jdbc:mysql://localhost:3306/yayadou";

Connection conn = DriverManager.getConnection(url, "root", "root");

// 通过连接对象获取执行SQL语句的Statment对象

Statement stm = conn.createStatement();

//获取发生sql语句的Statment对象

stm = conn.createStatement();

StringBuilder sql = new StringBuilder();

// 注意:sql语句一次只能发送一条,一个分号结尾代表sql语句结束

/*

* sql.append(" INSERT INTO t_user(username,userpass,logintime) ");

* sql.append(" VALUES('tom','321')");

*/

sql.append(" INSERT INTO t_user(username,userpass) ");

sql.append(" VALUES('tiger','1688'),('admin','654321') ");

 

//执行sql,返回影响的行数

int result = stm.executeUpdate(sql.toString());

 

System.out.println("新增[" + result + "]条数据");

 

stm.close();

conn.close();

    实例-新增数据获取ID

 

Class.forName("com.mysql.jdbc.Driver");

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/city_info_db", "root", "root");

 

//3,基于数据库连接对象创建Statement对象

Statement sta= conn.createStatement();

 

//4,通过Statement对象操作数据库表数据

String insertSQL = "insert into city_info_user(name,password) values('tiger2',123456);";

int id = 0;

/**

* 执行插入语句

* 参数1 需要执行的SQL

* 参数2 需要获取新增数据自动增长的id值(注意并不是所有的数据库都支持)

*/

int count = sta.executeUpdate(insertSQL, Statement.RETURN_GENERATED_KEYS);

//5,如果有返回ResultSet结果,进行接收

//通过getGeneratedKeys()获取一个包含的id的结果集

ResultSet rs = sta.getGeneratedKeys();

//判断结果集中有没有返回结果,next()方法返回true表示有数据

if(rs.next()){

//获取id,根据列的位置来获取列数据,从1开始

id = rs.getInt(1);

}

System.out.println("插入数据:"+count+"---id:"+id);

 

//6,关闭数据库连接释放资源

//注意,最晚获取的资源最早关闭

rs.close();//关闭结果集

sta.close();//关闭执行对象

conn.close();//关闭数据库连接

 

   实例-查询数据

/**

* 查询

* 步骤:

* 1 注册driver;

* 2 建立数据库的连接;

* 3 创建statement;

* 4 执行SQL语句;

* 5 处理结果;

* 6 关闭连接,释放资源;

*/

 

 

Class.forName("com.mysql.jdbc.Driver");

String url = "jdbc:mysql://localhost:3306/yayadou";

Connection conn = DriverManager.getConnection(url, "root", "root");

Statement stm = conn.createStatement();

 

StringBuilder sql = new StringBuilder();

sql.append(" SELECT * FROM t_user ");

 

System.out.println("查询语句:"+sql.toString());

//执行SQL

ResultSet rs = stm.executeQuery(sql.toString());

//处理数据

// 如果有下一条数据rs.next()将会返回true,否则返回false

while (rs.next()) {

//通过返回数据列的类型来对应的调用getXxx()方法获取数据,其中Xxx表示列的类型

int id = rs.getInt("id");

String username = rs.getString("username");

String password = rs.getString("userpass");

Date logintime = rs.getTimestamp("logintime");

System.out.println(id + " " + username + " " + password + " "

+ logintime);

}

 

rs.close();

stm.close();

conn.close();

 

   实例-更新数据

 

Class.forName("com.mysql.jdbc.Driver");

String url = "jdbc:mysql://localhost:3306/yayadou";

Connection conn = DriverManager.getConnection(url, "root", "root");

Statement stm = conn.createStatement();

 

StringBuilder sql = new StringBuilder();

 

sql.append(" UPDATE t_user SET username = 'admin', userpass ='0000'");

sql.append(" WHERE id = 1 ");

 

System.out.println("更新语句:" + sql.toString());

 

int result = stm.executeUpdate(sql.toString());

 

System.out.println("更新[" + result + "]条数据");

 

stm.close();

conn.close();

 

   实例-删除数据

 

Class.forName("com.mysql.jdbc.Driver");

String url = "jdbc:mysql://localhost:3306/yayadou";

Connection conn = DriverManager.getConnection(url, "root", "root");

Statement stm = conn.createStatement();

 

StringBuilder sql = new StringBuilder();

 

sql.append(" DELETE FROM t_user where id = 1");

 

System.out.println("删除语句:" + sql.toString());

 

int result = stm.executeUpdate(sql.toString());

 

System.out.println("删除[" + result + "]条数据");

 

stm.close();

conn.close();

  ResultSet对象

1.ResultSet对象完全依赖 Statement对象和Connection对象;

 

2.每次执行 SQL 语句时,都会用新的结果重写结果集;

 

3.当相关的Statement关闭时,ResultSet对象会自动关闭;

 

4.ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行。因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。 如果新的当前行有效,则返回 true;如果不存在下一行,则返回false。 

 

5.获取数据库表的字段值

getXxx(int columnIndex):columnIndex指查询的列的索引,索引值从下标1开始;

getXxx(String columnLabel):columnLabel查询的列的名称(推荐);

 

6.如果ResultSet已经到最后一行,还要next去拿数据,会抛出异常:

java.sql.SQLException: After end of result set

   获取数据方法列表

   SQL与Java数据类型的对应关系

  DTO&DAO

   DTO

    什么是DTO

DTO (Data transmission Object ) 的全称是“数据传输对象”。它的作用是:与数据库表做映射,用作数据传输。

 

    创建DTO的条件

     对象属性和数据库表的列作对应,一般情况下属性名应该和列名一致,一个实例对象对应数据库表一条记录

     对象属性必须提供相应的get和set方法

     对象必须提供无参数的构造器

     如果需要在网络传输,还要实现Serializable接口

   DAO

    什么是DAO

DAO (Data Access Object):数据访问对象。它封装了对数据库表的操作(比如:最基本的增删改查(CRUD)操作)。

 

    创建DAO

//用户DAO

public interface UserDao {

User getUserById(int id);

List<User> getAllUser();

boolean addUser(User user);

boolean removeUser(User user);

boolean updateUser(User user);

}

UserDao ---> UserDaoImpl (Impl = implements )

 

//图书DAO

public interface BookDAO {

Book getBookById(int id);

List<Book> getAllBook();

boolean addBook(Book user);

boolean removeBookById(int id);

Book getBookByName(String bookName);

}

 

 

 

public interface OrderDao{

 

boolean addOrder(Order order);

boolean updateOrder(Order order);

boolean deleteOrder(Order order);

Order getOrderById(int orderId);

List<Order> getOrders();

 

}

posted on 2018-01-31 22:55  東風★破  阅读(218)  评论(0)    收藏  举报

导航