zoukankan      html  css  js  c++  java
  • 第十八章、JDBC操作

    第十八章、JDBC操作

    一、JDBC概述

    1. 概述

    JDBC:java database connection 使用java语言连接数据库
    是java内部提供的一套操作数据库的接口(标准),实现对象数据库的统一访问
    

    2. 功能

    一个java应用程序和数据库交互的桥梁
    one write,run anywhere的思想
    

    3. 组成

    # 1.DriverManage类:驱动管理器,用户注册驱动,获取连接对象
    # 2.Connection接口:数据库的连接对象
    # 3.Statement接口:执行SQL语句,操作数据库
    # 4.PrepareStatement接口:执行SQL语句,操作数据库
    # 5.ResultSet接口:结果集(一张虚拟表)
    

    4. 图示

    image-20210105134105276

    image-20210105133941263

    二、通过JDBC实现CURD操作

    1. 操作准备

    # <1>创建表
        create table student(
            sid int primary key auto_increment,
            sname varchar(32) not null,
            age int,
            hobby varchar(32),
            shows varchar(32)
        );
    
    # <2>创建实体类
        class Student{
    
        }
    
    # <3> 引入数据库厂商提供的驱动 (.jar文件的方式)
            将文件引入到 WebContent 下 WEB-INF 下 lib 中
        	这是通过创建一个动态Javaweb项目
    
    # <4>编码
            使用JDBC访问数据库的步骤:
                1. 加载数据库的驱动
                2. 获取数据库的连接对象
                3. 编写SQL语句
                4. 获取Statement对象,执行sql语句
                5. 处理结果集
                6. 释放资源
    

    2. 步骤介绍

    ①、DriverManager介绍

    # 作用
    	注册数据库驱动,获取数据库链接对象
    # 注册数据库驱动方式 (推荐使用)
    	1.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        2.Class.forName("驱动类全程:包名+类名");
    

    ②、Connection介绍

    # 作用
    	数据库的连接对象,控制事务的实施
    # 具体方法
    	void setAutoCommit(boolean autoCommit);  设置事务的事务的提交方式 ,默认是true,自动提交
        void commit();  提交事务
        void rollback(); 回滚事务
    
    # 获取数据库连接对象
    
    Connection getConnection(url, user, password);
        参数一:URL,统一资源定位符,标识网络上的一个具体的资源(网页,一张照片,一个视频等等)
    
                协议+ip地址+端口+资源名称
                jdbc:mysql://   127.0.0.1 : 3306 /tlxy
    
        第二个参数: 用户名
        第三个参数: 密码   
    
    
    Connection getConnection(String path);
        url+username+password
        例如: jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=root
        注意:用户名和密码传输的key是固定的
    
    
    Connection getConnection(url, properties)
        参数二:属性对象
            Properties p = new Properties();
            p.setProperty("user","root");
            p.setProperty("password","root");
    

    ③、Statement & PrepareStatement介绍

    # 作用
    	获取执行SQL语句的对象
    # Statement
    	是静态的,会出现SQL注入问题
    # PrepareStatement
    	是动态的,避免了SQL注入问题,性能更高,更灵活
    	具有预处理操作的Statement接口对象
    	使用占位符?来实现对数据库的各种操作
    # 方法
    	statement.executeQuery(sql)   执行查询SQL语句	返回ResultSet结果集
    	statement.executeUpdate(sql)  执行增删改SQL语句   	int类型
    

    ④、ResultSet介绍

    # 作用:封装乐查询的结果数据,内部含有一个游标,默认执行数据前。
    # 方法:
        boolean next() ,将指向数据的游标下移,返回有没有数据的标记
    
        Object getObject(int ColIndex)
        Object getObject(String ColName);//推荐使用
    

    3. 代码示例

    • 学生实体
    package com.tlxy.entity;
    
    public class Student {
    	private int sid;
    	private String sname;
    	private int age;
    	private String hobby;
    	private String shows;
    	
    	// 无参构造
    	public Student() {
    		super();
    	}
    
    	// 有参构造
    	public Student(int sid, String sname, int age, String hobby, String shows) {
    		super();
    		this.sid = sid;
    		this.sname = sname;
    		this.age = age;
    		this.hobby = hobby;
    		this.shows = shows;
    	}
    	
    	// 设置获取实体类中的值
    	public int getSid() {
    		return sid;
    	}
    	public void setSid(int sid) {
    		this.sid = sid;
    	}
    	public String getSname() {
    		return sname;
    	}
    	public void setSname(String sname) {
    		this.sname = sname;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getHobby() {
    		return hobby;
    	}
    	public void setHobby(String hobby) {
    		this.hobby = hobby;
    	}
    	public String getShows() {
    		return shows;
    	}
    	public void setShows(String shows) {
    		this.shows = shows;
    	}
    	
    	// 重写toString方法
    	@Override
    	public String toString() {
    		return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + ", hobby=" + hobby + ", shows=" + shows
    				+ "]";
    	}
    }
    
    • 实现数据查询
    package com.tlxy.test;
    
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.tlxy.entity.Student;
    
    /*
     * 通过JDBC实现数据交互
     * 		
     * 		使用JDBC访问数据
     * 			1.加载数据库的驱动
     * 			2.获取数据库的连接对象
     * 			3.编写SQL语句
     * 			4.获取Statement对象,执行sql语句
     * 			5.处理结果集
     * 			6.释放资源	
     */
    public class JDBCSelect {
    	public static void main(String[] args){
    		Connection conn = null;
    		Statement statement = null;
    		ResultSet resultSet = null;
    		
    		// 创建一个用于存储学生信息的集合
    		List<Student> list = new ArrayList<Student>();
    		
    		try {
    			// 1.加载驱动
    			Class.forName("com.mysql.jdbc.Driver");
    
    			// 2.获取连接
    			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy", "root", "123456");
    			
    			// 3.获取执行SQL语句对象
    			statement = conn.createStatement();
    			/*
    			 * 两个方法:
    			 * 		statement.executeQuery(sql)   执行查询SQL语句	返回ResultSet结果集
    			 * 		statement.exevuteUpdate(sql)  执行增删改SQL语句   	int类型
    			 */
    			
    			String sql = "select * from Student";
    			
    			// 4.执行SQL语句,如果是查询,返回的是ResultSet结果集
    			resultSet = statement.executeQuery(sql);
    			
    			// 5.遍历结果集
    			while(resultSet.next()){
    				// 第一种方式获取数据 	基本不用
    				/*Object sid = resultSet.getObject(1);
    				Object sname = resultSet.getObject(2);
    				Object age = resultSet.getObject(3);
    				Object hobby = resultSet.getObject(4);
    				Object shows = resultSet.getObject(5);*/
    			
    				// 第二种方式获取数据       推荐使用 	方法中参数名称要与数据表中字段名一致
    				// 注意:如果表中字段类型是Date类型的,建议用你String类型去接收
    				int sid = resultSet.getInt("sid");
    				String sname = resultSet.getString("sname");
    				int age = resultSet.getInt("age");
    				String hobby = resultSet.getString("hobby");
    				String shows = resultSet.getString("shows");
    				
    				// 通过对象的方式存储从数据库中获取到的数据
    				Student student = new Student(sid, sname, age, hobby, shows);
    				list.add(student);
    				
    				//System.out.println(sid+"  "+sname+"  "+age+"  "+hobby+"  "+shows+"  ");
    			}
    			for (Student student : list) {
    				System.out.println(student);
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			// 6.释放资源
    			if(conn != null){
    				try {
    					conn.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    			if(statement != null){
    				try {
    					statement.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    			if(resultSet != null){
    				try {
    					resultSet.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    
    • 实现数据添加
    package com.tlxy.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import com.tlxy.entity.Student;
    
    /*
     * 通过JDBC实现数据添加
     */
    public class JDBCInsert {
    	public static void main(String[] args) {
    		Student stu = new Student(0, "李四", 25, "吃生蚝", "一个不一样的美男子");
    		Connection conn = null;
    		Statement st = null;
    		try {
    			// 1. 加载驱动
    			Class.forName("com.mysql.jdbc.Driver");
    			
    			// 2.建立连接
    			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
    			
    			// 3.获取执行SQL语句对象
    			st = conn.createStatement();
    			
    			// 4.执行SQL语句
    			String sql = "insert into Student (sname,age,hobby,shows) values('"+stu.getSname()+"','"+stu.getAge()+"','"+stu.getHobby()+"','"+stu.getShows()+"')";
    			System.out.println(sql);
    			// 5.如果是结果集,遍历
    			int insert = st.executeUpdate(sql);
    			
    			if(insert > 0){
    				System.out.println("插入成功!");
    			}
    			// 6.关闭资源
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			// 6.释放资源
    			if(conn != null){
    				try {
    					conn.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    			if(st != null){
    				try {
    					st.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    
    • 实现数据修改
    package com.tlxy.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import com.tlxy.entity.Student;
    
    /*
     * 通过JDBC实现数据更新
     */
    public class JDBCUpdate {
    	public static void main(String[] args) {
    		
    		// 通过Student对象来操作数据库
    		Student stu = new Student(3, "jason", 25, "喝营养快线", "虹桥第一炮王");
    		Connection conn = null;
    		Statement st = null;
    		
    		try {
    			// 1.加载驱动
    			Class.forName("com.mysql.jdbc.Driver");
    			
    			// 2.获取连接
    			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=123456");
    			
    			// 3.获取执行SQL语句的对象
    			st = conn.createStatement();
    			
    			// 4.执行SQL语句获取结果集
    			String sql = "update student set sname = '"+stu.getSname()+"',age = "+stu.getAge()+",hobby = '"+stu.getHobby()+"',shows = '"+stu.getShows()+"' where sid = "+stu.getSid()+";";
    			int update = st.executeUpdate(sql);
    			
    			// 5.遍历结果集
    			if(update > 0){
    				System.out.println("修改成功!");
    			}
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			// 6.释放资源
    			if(conn != null){
    				try {
    					conn.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    			if(st != null){
    				try {
    					st.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    		}		
    	}
    }
    
    • 实现数据删除
    package com.tlxy.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /*
     * 通过JDBC实现数据删除
     */
    public class JDBCDelete {
    	public static void main(String[] args) {
    		Connection conn = null;
    		Statement st = null;
    		
    		try {
    			// 1.加载驱动
    			Class.forName("com.mysql.jdbc.Driver");
    			
    			// 2. 获取连接
    			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tlxy","root","123456");
    			
    			// 3.获取执行SQL语句的对象
    			st = conn.createStatement();
    			
    			// 4.执行SQL语句获取结果集
    			String sql = "delete from student where sid = " + "3";
    			int delete = st.executeUpdate(sql);
    			
    			// 5.遍历结果集
    			if(delete > 0){
    				System.out.println("删除成功!");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			// 6.释放资源
    			if(conn != null){
    				try {
    					conn.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    			if(st != null){
    				try {
    					st.close();
    				} catch (SQLException e) {
    					
    					e.printStackTrace();
    				}
    			}
    		}		
    	}
    }
    

    三、封装JDBC工具类

    1. 简单的封装

    package com.tlxy.utils;
    
    import java.io.FileReader;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    
    /*
     * JDBCg工具类
     * 
     * 		1.封装加载驱动
     * 		2.建立连接
     * 		3.释放资源
     */
    public class JDBCUtil {
    
    	// 静态块
    	static{		
    		try {			
    			// 1.加载驱动
    			Class.forName("com.mysql.jdbc.Driver");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	// 2.获取连接对象
    	public static Connection getCOnnection(){
    		Connection conn = null;
    		try {
    			conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
    		} catch (SQLException e) {				
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	// 3.释放连接资源
    	public static void close(Connection conn,Statement st,ResultSet rs){
    		if(conn != null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(st != null){
    			try {
    				st.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(rs != null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

    2. 高级封装

    // 使用Properties进行动态配置相关资源信息
    package com.tlxy.utils;
    
    import java.io.FileReader;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    
    /*
     * JDBCg工具类
     * 
     * 		1.封装加载驱动
     * 		2.建立连接
     * 		3.释放资源
     */
    public class JDBCUtil {
    	
    	public static String DRIVER;
    	public static String URL;
    	public static String USERNAME;
    	public static String PASSWORD;
    	
    
    	// 静态块
    	static{		
    		try {
    			
    			Properties p = new Properties();
    			p.load(new FileReader("db.properties"));
    			DRIVER = p.getProperty("mysql.datasource.driver");
    			URL = p.getProperty("mysql.datasource.url");
    			USERNAME = p.getProperty("mysql.datasource.username");
    			PASSWORD = p.getProperty("mysql.datasource.password");
    
    			// 1.加载驱动
    			Class.forName(DRIVER);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	// 2.获取连接对象
    	public static Connection getCOnnection(){
    		Connection conn = null;
    		try {
    			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
    		} catch (SQLException e) {				
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	
    	// 3.释放连接资源
    	public static void close(Connection conn,Statement st,ResultSet rs){
    		if(conn != null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(st != null){
    			try {
    				st.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(rs != null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

    3. 补充:单元测试

    单元测试是白那些测试代码
    Junit是Java单元测试框架,已经在Eclipse中默认安装。
    
    Junit4通过注解的方式来识别测试方法
    @Before  在测试方法运行之前运行
    @Test   测试方法
    @After  在测试方法运行之后运行
    
    package javatest;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class SequenceTest {
        @Before
        public  void TestBefore(){
            System.out.println("Before");
        }
        
    	@Test
        public void TestTest(){
            System.out.println("Test");
        }
     
        @After
        public void TestAfterClass(){
            System.out.println("After");
        }
    }
    
  • 相关阅读:
    SpringMVC拦截器
    SpringMVC异常
    SpringMVC文件上传
    SpringMVC返回值类型
    JVM字节码
    使用Apache JMeter进行测试
    Tomcat优化
    垃圾收集器
    GC常见算法
    VisualVM远程连接Tomcat
  • 原文地址:https://www.cnblogs.com/borntodie/p/14236674.html
Copyright © 2011-2022 走看看