一、JDBC
1、JDBC(JAVA数据库连接技术)能实现JAVA语言对数据库的访问及各种操作
2、JDBC API 使用JDBC访问数据库就要用JDBC API完成3件事: 与数据库链接,返送sql语句 和 处理结果。
工作的4个重要环节:
(1).DriverManager类:依据数据库的不同,管理JDBC驱动;
(2).Connection接口:负责链接数据库并担任传送数据的任务。
(3).Statement接口:由Connection产生,负责执行SQL语句。
(4).ResultSet接口:负责保存Statement执行后所参数的查询结果
3、JDBC访问数据库的步骤
(1).class…forName(“jdbc:mysql://localhost:3306/students”);//加载驱动
(2).Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,“用户名”,“用户密码”);//连接数据库
(3).Statement stmt=conn.createStatement();//创建Statement对象
String sql=“sql语句”;
ResultSet rs= Stmt.executeQuery(sql);//执行sql语句
(4).while(rs.next()){int id=rs.getInt(1);
Timestamp time=rs.getTimestamp(“createdate”);}//循环读取结果集
4、资源的释放
conn.close();
rs.close();
st.close();
代码操作:
publc class DataBase{
public static void (String [] args){
connection conn = null;
statement st = null;
resultset rs = nll;
try{
//加载驱动
class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
String username = "root";
String password = "123";
conn = DriverManager.getConnection(url,username,password);
st = conn.createStatement();
//查询数据并打印
rs = stmt.executeQuery("select * from test");
while(rs.next()) { //next()方法控制行数,一行一行读出返回结果集,直到null
int id = rs.getInt("id");//获取id这一列的数据
String name = rs.getString(2);//获取第二列数据
String sex = rs.getString("sex");
int age = rs.getInt("age");
System.out.println("编号="+id+",姓名="+name+",性别="+sex+",年龄="+age);
}
//添加一行数据
//使用SQL语句:INSERT INTO `students`.`students_1` (`id`, `name`, `sex`, `age`) VALUES ('1','小七', '女', '10'); 添加数据
/*String sql1 = "INSERT INTO `students`.`students_1` (`id`,`name`, `sex`, `age`) VALUES ('1','小七', '女', '10');";
int result1 = stmt.executeUpdate(sql1);
//修改一个数据
//使用SQL语句:UPDATE `students`.`students_1` SET `name` = '康纳' WHERE `age` = 12 AND `sex` = '男':修改age=12和sex=男的数据的name为康纳
String sql2 = "UPDATE `students`.`students_1` SET `name` = '康纳' WHERE `id`= '4' AND `age` = '12' AND `sex` = '男'; ";
int result2 = stmt.executeUpdate(sql2);
//删除一行数据
//使用SQL语句:DELETE FROM `students`.`students_1` WHERE `id` = '5' ; 删除id=5的一行
/*String sql3 = "DELETE FROM `students`.`students_1` WHERE `id` = '8' ; ";
int result3 = stmt.executeUpdate(sql3);*/
} catch(SQLException){
e.printStackTrace();
}finally{//依次关闭数据库接口
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(con!=null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
二、封装上述代码为Javabean
1.创建jdbc.properites配置文件保存连接数据库所需的相关信息
jdbc.properites:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.password=123
2.创建JDBCTest类,提取建立数据库连接的通用方法
JDBCTese:
import java.io.*;
import java.sql.*;
import java.util.*;
public abstract class JDBCTest{
private static Properties properties = new Properties();
private static String user = null;
private static String password = null;
private static String url = null;
static{
try {
//读取配置值文件内的相关信息
InputStream is =JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properites");
properties.load(is);
String driver = properties.getProperty("driver");
user = properties.getProperty("user");
password = properties.getProperty("password");
url = properties.getProperty("url");
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, user, password);//加载驱动
}
public static void close(Connection conn, Statement st, ResultSet rs){
//释放资源
try {
if(conn != null){
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(st!=null){
st.close();
st = null;
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(rs!=null){
rs.close();
rs = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public Object queryByOne(String sql){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
Object obj = null;
try {
conn = getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
obj = rsToObj(rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn, st, rs);
}
return obj;
}
public List<Object> queryByAll(String sql){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
List<Object> list = null;
try {
conn = getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
list = rsToList(rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn, st, rs);
}
return list;
}
// resultSet 转换成 Users---Object
public abstract Object rsToObj(ResultSet rs);
// resultSet 转换成 List<Users> List<Object>
public abstract List<Object> rsToList(ResultSet rs);
}
3.创建EmpDao接口
package demo.mysql.dao;
import java.sql.Date;
public interface EmpDao {
/**
* 查询
*/
public void empList();
/**
* 添加
*/
public void add(int empno,String ename,String job,int mgr,Date hireDate,double sal,double comm,int deptno);
/**
* 删除
*/
public void delete(int empno);
/**
* 修改
*/
public void update(int empno,String ename);
}
4…创建EmpDaoImpl实现类:
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import demo.mysql.dao.BaseDao;
import demo.mysql.dao.EmpDao;
public class EmpDaoImpl extends BaseDao implements EmpDao {
/**
* 查询
*/
public void empList() {
try {
// (3).创建statement 对象执行sql
String sql = "select * from emp";
Object[] params = {};
ResultSet rs = this.executeSQL(sql, params);
// 处理结果集
while (rs.next()) {
int empno = rs.getInt("EMPNO");
String ename = rs.getString("ENAME");
String job = rs.getString("JOB");
int mgr = rs.getInt("MGR");
Timestamp time = rs.getTimestamp("HIREDATE");
int sal = rs.getInt("SAL");
double comm = rs.getInt("COMM");
int deptno = rs.getInt("DEPTNO");
System.out.println(empno + "\t" + ename + "\t" + job + "\t"
+ mgr + "\t" + time + "\t" + sal + "\t" + comm + "\t"
+ deptno);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.closeResource();
}
}
/**
* 添加
*/
public void add(int empno,String ename,String job,int mgr,Date hireDate,double sal,double comm,int deptno){
try {
//(3).创建statement 对象执行sql
String sql="insert into emp values(?,?,?,?,?,?,?,?)";
Object[] params={empno,ename,job,mgr,new java.sql.Timestamp(hireDate.getTime()),sal,comm,deptno};
int i=this.executeUpdate(sql, params);
if(i>0){
System.out.println("插入新闻成功");
}
}finally{
this.closeResource();
}
}
/**
* 删除
*/
public void delete(int empno){
try {
String sql="delete from emp where empno=?";
Object[] params={empno};
int i=this.executeUpdate(sql, params);
if(i>0){
System.out.println("删除信息成功");
}
}finally{
this.closeResource();
}
}
/**
* 修改
*/
public void update(int empno,String ename){
try {
String sql="update emp set ename=? where empno=?";
Object[] params={ename,empno};
int i=this.executeUpdate(sql, params);
if(i>0){
System.out.println("修改信息成功");
}
}finally{
this.closeResource();
}
}
}
MVC设计模式概念(三层模式):
1、 表示层
职责:位于最上层,用户能够直接访问,用与显示数据和接收用户数据的数据,为用户提供一种交互式操作界面,一般为web应用程序,以jsp文件,HTML文件为主。
2、业务逻辑层:
职责:提供对业务逻辑处理的封装,通常会定义一些接口,通常放在biz包下。
3、 数据库链路层:
职责:实现对数据的保存和读取操作,数据访问,可以访问数据库,文本文件或xml文挡,通常放在dao包中。
MVC:一般把业务逻辑层和数据访问层称Modle层,把表示层称View层,在V层和M层中间还有Control层。