java从入门到弃坑数据库三

1.JDBC:一套专门用于java程序操作数据库的接口。

 发送条件:连接Mysql数据库:数据库主机,端口,数据库用户名,密码,连接的数据库

2.JDBC核心API:Driver接口:数据库驱动程序的接口,所有具体数据库厂商需要驱动的程序均需要实现此接口。

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DriverDm {
	private static String url="jdbc:mysql://localhost:3306/day20";
	// jdbc协议:数据库协议://主机地址:数据库端口号/连接的数据库名称
	private static String user="root";
	private static String password="root";
	public static void main(String[] args) throws Exception {
		//获取数据库连接对象三个方法
		conn1();
		conn2();
		conn3();
	}
	//1.直接连接
	public static void conn1() throws SQLException{
		//创建驱动类对象Driver
		Driver driver=new com.mysql.jdbc.Driver();
		//创建一个properties集合
		Properties prop=new Properties();
		prop.setProperty("user", user);
		prop.setProperty("password", password);
		//获取java与数据库的连接
		Connection conn=driver.connect(url, prop);
		System.out.println(conn);//打印不为空,说明连接成功
	}
	//2.使用驱动管理类,获取驱动并建立连接
	public static void conn2() throws SQLException{
		//注册驱动
		Driver driver=new com.mysql.jdbc.Driver();
		DriverManager.registerDriver(driver);
		//获取连接
		Connection conn=DriverManager.getConnection(url, user, password);
		System.out.println(conn);
	}
	//常用方法
	public static void conn3() throws Exception{
		//mysql驱动程序的Driver实现类会自动完成注册功能,因此只需将Driver实现类加载到内存中
		Class.forName("com.mysql.jdbc.Driver");
		//获取java数据库连接对象
		Connection conn=DriverManager.getConnection(url, user, password);
		System.out.println(conn);
	}
	//可以同时建立多个数据库连接对象
}

2.Connection接口:与具体的数据库的连接对象
   
Statement st=conn.createStatement();//创建静态sql语句对象
PreparedStatement pps=conn.prepareStatement(null);//创建预编译sql语句对象
CallableStatement cst=conn.prepareCall(null);//创建存储过程sql语句对象

3.Statement接口:用于执行静态sql语句
int i=st.executeUpdate("sql语句");
		/*可以执行DDL语句(create/alter/drop)
		 * DML语句(insert/update/delete)
		 */
ResultSet rs=st.executeQuery("sql语句");
		//执行查询操作语句DQL:select
4.preparedstatement接口:用于执行预编译操作语句/是Statement的子接口
		int j=pps.executeUpdate("sql语句");//执行更新操作
		ResultSet rs2=pps.executeQuery("sql语句");//执行查询操作

5.Callablestatement接口:用于执行存储过程的接口/是Statement的子接口
		ResultSet rs3=cst.executeQuery("sql语句");//执行存储操作
6.ResultSet接口:结果集对象,搜索所有查询的结果,用该对象进行遍历
		while(rs.next()){//判断下一行是否有数据
			System.out.println(rs.getInt(1));//输出获取到的字段数据
		}

7.Statement对象执行DDL操作exp:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DDLDemo {
	private static String url="jdbc:mysql://localhost:3306/day20";
	private static String user="root";
	private static String password="root";
	public static void main(String[] args) {
		Connection conn=null;
		Statement st=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(url, user, password);
			st=conn.createStatement();
			String sql="CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20));";
			String sql2="ALTER TABLE student ADD COLUMN age INT;";
			String sql3="DROP TABLE student;";
			int count=st.executeUpdate(sql);
			int count2=st.executeUpdate(sql2);
			int count3=st.executeUpdate(sql3);
			System.out.println(count);
			System.out.println(count2);
			System.out.println(count3);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//关闭资源
		finally{
			if(st!=null){//防止没有输入程序时资源关闭
				try {
					st.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();
				}
			}
		}
		//三个操作均影响0行
	}
}

8.执行DML操作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DMLDemo {
	private static String url="jdbc:mysql://localhost:3306/day20";
	private static String user="root";
	private static String password="root";
	public static void main(String[] args) {
		Connection conn=null;
		Statement st=null;
		String name="jack";
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(url, user, password);
			st=conn.createStatement();
			//添加数据
			String sql="INSERT INTO student(NAME) VALUES ('tom');";
			//更新数据。。还可以这样
			String sql2="UPDATE student SET NAME ='"+name+"'WHERE id =1;";
			//删除数据
			String sql3="DELETE FROM student WHERE id=1;";
			int c1=st.executeUpdate(sql);
			System.out.println(c1);
			int c2=st.executeUpdate(sql2);
			System.out.println(c2);
			int c3=st.executeUpdate(sql3);
			System.out.println(c3);
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(st!=null){
				try {
					st.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();
				}
			}
			//若成功执行,则均影响一行
		}
	}
}

9.执行DQL查询操作

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class EQLDemo {
	private static String url="jdbc:mysql://localhost:3306/day20";
	private static String user="root";
	private static String password="root";
	public static void main(String[] args) {
		Connection conn=null;
		Statement st=null;
		ResultSet rs=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(url, user, password);
			st=conn.createStatement();
			String sql1="SELECT *FROM student;";
			rs=st.executeQuery(sql1);
			while(rs.next()){
				int id=rs.getInt("id");
				String name =rs.getString("name");
				System.out.println(id+"\t"+name);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(st!=null){
				try {
					st.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();
				}
			}
		}
	}
}

10.JDBC工具类抽取:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {
	private static String url="jdbc:mysql://localhost:3306/day20";
	private static String user="root";
	private static String password="root";
	private static String forname="com.mysql.jdbc.Driver";
	static{
		try {
			Class.forName(forname);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Connection getConnectioin(){
		try {
			Connection conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException();
		}
	}
	public static void close(ResultSet rs,Statement st,Connection conn){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(st!=null){
			try {
				st.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();
			}
		}
	}
}

11.PreparedStatement对象执行SQL操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.edu_03.JDBCUtil;
//插入操作
public class Demo1 {
	public static void main(String[] args) {
		//test1();
		//test2();
		//test3();
		test4();
	}
	public static void test1(){
		Connection conn=null;
		PreparedStatement ppst=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="insert into student (name) values(?);";
			ppst=conn.prepareStatement(sql);
			ppst.setString(1, "faker");
			int count=ppst.executeUpdate();
			System.out.println(count);
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null,ppst,conn);
		}
	}
	//修改操作
	public static void test2(){
		Connection conn=null;
		PreparedStatement ppst=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="UPDATE student SET NAME=? WHERE id=?;";
			ppst=conn.prepareStatement(sql);
			ppst.setString(1, "saber");
			ppst.setInt(2, 3);
			int count =ppst.executeUpdate();
			System.out.println(count);
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null, ppst, conn);
		}
	}
	//删除数据
	public static void test3(){
		Connection conn=null;
		PreparedStatement ppst=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="DELETE FROM student WHERE id=?;";
			ppst=conn.prepareStatement(sql);
			ppst.setObject(1, 4);
			int count =ppst.executeUpdate();
			System.out.println(count);
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null, ppst, conn);
		}
	}
	//查询数据
	public static void test4(){
		Connection conn=null;
		PreparedStatement ppst=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="SELECT *FROM student;";
			ppst=conn.prepareStatement(sql);
			ResultSet rs=ppst.executeQuery();
			while(rs.next()){
				System.out.println(rs.getInt("id")+" "+rs.getString("name"));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null, ppst, conn);
		}
	}
}

12.statement和Preparedstatement的区别:

A:语法结构不同:Statement执行静态sql语句,且sql可以拼接。

                               Preparedstatement可以执行预编译sql语句,在语句中使用?来赋值。

B:原理不同:Statement不能进行sql缓存。

                        Preparedstatement可以进行sql缓存,执行效率比前者快。

C:安全性不同:Statement存在sql注入的风险

                            Preparedstatement可以避免sql注入

-- 创建user表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
PASSWORD VARCHAR(20)
);
-- 向表中插入用户数据
INSERT INTO USER(NAME,PASSWORD) VALUES('james','123456');
INSERT INTO USER(NAME,PASSWORD) VALUES('mayun','123456');
-- sql注入:在查询表的时候先添加单引号分隔字符,导致后边字符失效,然后在
-- 传入 OR 1=1改变逻辑关系,就会显示全部数据,导致用户数据泄露
-- 所以用PreparedStatement可以先执行预编译,规定好数据格式,防止sql注入。
SELECT * FROM USER WHERE NAME='james' OR 1=1-- ' AND PASSWORD='123456';

13.CallableStatement执行存储过程:

CREATE PROCEDURE pro_testwhile(IN num INT,OUT SUM INT)
BEGIN
	DECLARE i INT DEFAULT 1; -- 定义局部变量
	DECLARE result INT DEFAULT 0;
	WHILE i<num DO
		SET result=result+i;
		SET i=i+1;
	END WHILE;
	SET SUM=result;
END $
DELIMITER $ -- 输入id查看员工信息
CREATE PROCEDURE pro_testid(IN ide INT)
BEGIN
	SELECT * FROM employee WHERE id=ide;
END $

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

import com.edu_03.JDBCUtil;

public class InputDemo {
	public static void main(String[] args) {
		//test1();
		test2();
	}
	//执行带有输入参数的存储过程
	public static void test1(){
		Connection conn=null;
		CallableStatement stmt=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="CALL pro_testid(2);";
			stmt=conn.prepareCall(sql);
			ResultSet rs=stmt.executeQuery();// 执行存储过程必须使用exeuteQuery
			while(rs.next()){
				System.out.println(rs.getInt("id")+" "+rs.getString("name"));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null, stmt, conn);
		}
	}
	//执行带有输出参数的存储过程
	public static void test2(){
		Connection conn=null;
		CallableStatement stmt=null;
		try {
			conn=JDBCUtil.getConnectioin();
			String sql="CALL pro_testwhile(?,?);";
			stmt=conn.prepareCall(sql);
			stmt.setObject(1, 153);
			stmt.registerOutParameter(2,java.sql.Types.INTEGER);
			//注册一个输出参数,第一个参数是该参数在存储过程中的位置,第二个参数是out参数的数据库类型
			stmt.executeQuery();
			//获取存储过程的返回值
			String s=stmt.getString(2);//该数据和预编译中的参数位置保持一致
			System.out.println(s);
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			JDBCUtil.close(null, stmt, conn);
		}
	}
}

14.优化jdbc工具类
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class EXJDBCUtil {
	private static String url;
	private static String user;
	private static String password;
	private static String className;
	static{//静态代码块注册驱动
		//给成员变量赋值,将文件中的键值对加载到集合中
		try {
			Properties prop=new Properties();
			InputStream is=new FileInputStream("db.Porperties");
			prop.load(is);
			url=prop.getProperty(url);
			user=prop.getProperty(user);
			password=prop.getProperty(password);
			className=prop.getProperty(className);
			System.out.println(url);
			System.out.println(user);
			System.out.println(password);
			System.out.println(className);
			Class.forName(className);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//获取连接
	public static Connection getconnention(){
		try {
			Connection conn=DriverManager.getConnection(url, user, password);
			return conn;
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException();
		}
	}
	//释放资源
	public static void close(ResultSet rs,Statement stmt,Connection conn){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		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();
			}
		}
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值