第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();
}
浙公网安备 33010602011771号