JSP (3)------JDBC编程1

发布时间:2019-08-09 09:14:30编辑:auto阅读(1423)


    JDBC API :

    是一系列的编程接口,可以用来连接数据库,访问数据等。

    DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持。

    Connection:用于连接某一指定的数据库

    Statement : 提供了执行sql语句,获取查询结果的方法。有两个子接口。分别是:

    • PrepareStatement:用于执行预编译的sql语句


    ResultSet : 提供了对结果集处理的方法



    JDBC Driver API

    是面向驱动程序开发商的接口,JDBC驱动程序主要有四种类型:

    • JDBC-ODBC bridge : 将JDBC的调用全部委托给其他其他编程接口调用

    • 部分Java技术的本地API驱动程序: 部分基于java,其他的委托给本地客户端的代码实现

    • 全部基于java技术的本地API驱动程序

    • 全部基于java技术的本地协议驱动。





    写一个JDBC的应用程序:

    首先,在mysql中创建表:

    /*创建用户表*/
    create table tbl_user(
    	id int(11) unsigned not null auto_increment,
    	name varchar(50) not null default '',
    	password varchar(50) not null default '',
    	email varchar(50) default '',
    	primary key (id)
    )
    engine = InnoDB	   /*mysql存储引擎的一种,支持事务*/
    default charset = utf8;
    
    /*创建地址表*/
    create table tbl_address(
    	id int(11) unsigned not null auto_increment,
    	city varchar(20) default null,
    	country varchar(20) default null,
    	user_id int(11) unsigned not null,  /*用户表的主键*/
    	primary key(id)
    )
    engine = InnoDB
    default charset = utf8;


    在数据库中显示如下:

    wKiom1V1X2rQyupBAAA7DZ4IoFo049.jpg

    wKiom1V1X-XwqV3eAADX1QSglL0293.jpg

    wKioL1V1YYnRN9LlAADN0HsV_xw343.jpg

    /*向表中插入数据*/
    insert into tbl_user(id, name, password, email) values
    (1,'xiaoming', '123456', 'xiaom@sina.com'),
    (2, 'daming', '654321','daming@163.com');
    
    insert into tbl_address(city, country, user_id) values
    ('beijing', 'china', 1),
    ('NewYork', 'USA', 2);


    JDBC 编程的步骤:

    • 加载驱动

    • 打开连接

    • 执行查询

    • 处理结果

    • 清理环境


    添加java代码测试:将user表中的数据输出

    package com.jike.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class JDBCTest {
    	public static void main(String[] args) {
    		String sql = "SELECT * FROM tbl_user";
    		Connection conn = null;   // 当前的数据连接
    		Statement st = null;   // 向数据库发送sql语句
    		ResultSet rs = null;   // 封装从数据库里查询到的数据
    		// 用ctrl+shift+o自动导入以上用到的三个接口
    		try {
    			Class.forName("com.mysql.jdbc.Driver"); // 注册MySQL的jdbc驱动程序  
    			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******", "*******");// 获取数据库连接,后面两个分别是数据库用户名和密码
    			st = conn.createStatement();
    			rs = st.executeQuery(sql);   // 发送sql语句
    			
    			while(rs.next()){
    				System.out.print(rs.getInt("id")+" ");
    				System.out.print(rs.getString("name")+" ");
    				System.out.print(rs.getString("password")+" ");
    				System.out.print(rs.getString("email")+" ");
    				System.out.println();
    				
    			}
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}finally{ // 关闭顺序由小到大
    			try{
    				rs.close();
    			}catch(Exception e2){
    			}
    			try {
    				st.close();
    			} catch (Exception e3) {
    				// TODO: handle exception
    			}
    			try {
    				conn.close();
    			} catch (Exception e4) {
    				// TODO: handle exception
    			}
    		}
    	}
    }


    JDBC数据库的插入,更新,删除


    package com.jike.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class JDBCTest {
    	
    	// 获取数据库连接
    	public static Connection getConnection(){
    		Connection conn = null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");  
    			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "********", "*********");
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	
    	// 向数据库表中插入数据
    	public static void insert(){
    		Connection conn = getConnection();
    		try {
    			String sql = "insert into tbl_user(name, password, email)"+
    							"values('deci', '2255225', 'deci@mail.com')";
    			Statement st = conn.createStatement();
    			int count = st.executeUpdate(sql);
    			System.out.println("向数据库中插入了" + count + "条记录");
    			conn.close();
    			
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    	
    	// 更新内容
    	public static void update(){
    		Connection conn = getConnection();
    		try {
    			String sql = "update tbl_user set email='dddd@123.com' where name = 'deci'";
    			Statement st = conn.createStatement();
    			int count = st.executeUpdate(sql);
    			System.out.println("向数据库中更新了" + count + "条记录");
    			conn.close();
    			
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    	
    	//删除记录
    	public static void delete(){
    		Connection conn = getConnection();
    		try {
    			String sql = "delete from tbl_user where name = 'deci'";
    			Statement st = conn.createStatement();
    			int count = st.executeUpdate(sql);
    			System.out.println("向数据库删除了" + count + "条记录");
    			conn.close();
    			
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    	
    	public static void main(String[] args) {
    		//insert();
    		//update();
    		delete();
    	}
    }


    依次调用定义的方法,得到如图结果:

    wKiom1V8Ya3Ty8hqAAIrJraJzDA435.jpg





    JDBC 编程 ----事务处理:

    事务:维护数据一致性的工作单位,要么全部执行,要么全部不执行。

    事务的基本特征:

    • 原子性

    • 一致性

    • 隔离性

    • 持久性


    与事务相关的sql语句

    开始事务: begin transaction

    提交事务: commit transaction

    回滚事务:rollback transaction


    举例:在用户表和地址表中分别插入数据:

    用户表 插入:

    "insert into tbl_user(id, name, password, email)"+
             "values(10, 'Tom', '2525252', 'tom@123.com')"

    地址表插入:

    "insert into tbl_address(id, city, country, user_id)"+
    	"values(1, 'shanghai', 'china', '10')";


    可以看出,原有的数据库中地址表中已经有主键id=1的数据,程序会报出主键冲突的错误,具体代码如下:

    package com.jike.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class TransactionTest {
    	public static Connection getConnection(){
    		Connection conn = null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******","*******");
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	
    	// 向用户表中插入数据
    	public static void insertUserData(){
    		Connection conn = getConnection();
    		try {
    			String sql = "insert into tbl_user(id, name, password, email)"+
    						"values(10, 'Tom', '2525252', 'tom@123.com')";
    			Statement st = conn.createStatement();
    			int count = st.executeUpdate(sql);
    			System.out.println("向用户表中插入了"+count+"条数据");
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    	
    	// 向地址表中插入数据
    	public static void insertAddressData(){
    		Connection conn = getConnection();
    		try {
    			String sql = "insert into tbl_address(id, city, country, user_id)"+
    						"values(1, 'shanghai', 'china', '10')";
    			//这里注意, 因为这条语句规定插入地址表中的数据id号为1,但是地址表中已经有id=1的数据,因此会抛出异常
    			// 这是一个很严重的问题,因为数据只有部分被插入。需要采用事务保证数据要么完全插入,要么全部回滚。
    			Statement st = conn.createStatement();
    			int count = st.executeUpdate(sql);
    			System.out.println("向地址表中输入了"+count+"条记录");
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    	}
    	
    	public static void main(String[] args) {
    		insertUserData();
    		insertAddressData();
    	}
    	
    	
    }


    程序报出异常如图:

    wKioL1V8bWPz3blyAAPCUg8UNTg851.jpg


    这是,数据表中的插入结果如下:

    wKioL1V8baPR-rVSAAEyfIe30qs590.jpg


    可见,地址表中的信息没有正确插入,而用户表中的信息插入成功,这种插入是非常危险的,其无法保持数据的完整性。因此使用事务来处理这类问题。




    极客学院地址:http://www.jikexueyuan.com/course/625.html

关键字

上一篇: 3秒返回

下一篇: krypton系列0-3