第17天(就业班) jdbc连接数据库、statement执行DDL语句、statement执行DQL查询语句、preparedstatement、callablestatement、通讯录改造jdb

一、 课程回顾
mysql加强
1)数据约束(表约束)
默认值: default 默认值
非空:   not null
唯一: unique
主键: primary key (非空+唯一)
自增长: auto_increment
外键: foreign key   约束两种表
2)关联查询(多表查询)
2.1 交叉连接(产生笛卡尔积:原因:连接条件不足够)  表数量-1
2.2 内连接查询: inner join
只有满足连接条件的数据才会显示!!!
2.3 左【外】连接查询:left [outer] join
左表的数据必须全部显示,用左表去匹配右表的数据,如果右表有符号条件的数据则显示符合条件的数据;如果不符合条件,则显示null。
2.4 右【外】连接查询: right [outer] join
右表的数据必须全部显示,用右表去匹配左表的数据,如果左表有符号条件的数据则显示符合条件的数据;如果不符合条件,则显示null。
2.5 自连接查询
3)存储过程
-- 创建存储过程语法
delimeter 结束符号
create procedure 名称(IN/OUT/INOUT  参数名称 参数类型)
begin
带逻辑的sql语句
end 结束符号
--调用存储过程
CALL 存储过程名称(实际参数);
二、 Jdbc链接数据库
2.1 之前操作数据
1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码)
2)编写sql语句
3)发送sql语句到数据库服务器执行
2.2 什么是jdbc?
使用java代码(程序)发送sql语句的技术,就是jdbc技术!!!!
2.3 使用jdbc发送sql前提
登录数据库服务器(连接数据库服务器)
数据库的IP地址 
端口   
数据库用户名

密码

package com.xp.jdbc.connection;

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

import org.junit.Test;

/**
 * jdbc链接数据库
 * @author xiongpan
 * 2017年2月5日
 */
public class JDBCConnectionDBDemo {
	//连接数据库的URL jdbc协议:数据库子协议:主机:端口/连接的数据库   //
	private final String url = "jdbc:mysql://localhost:3306/day17";
	//用户名、密码
	private  String user="root";
	private  String password="xiongpan";
	/**
	 * 第一种方法
	 * @throws SQLException 
	 */
	@Test
	public void test1() throws SQLException{
		//1.创建驱动程序类对象
		Driver driver=null;
		driver=new com.mysql.jdbc.Driver();
		//Driver driver2=new org.gjt.mm.mysql.Driver(); //旧版本
		
		Properties props=new Properties();
		props.setProperty("user", user);
		props.setProperty("password", password);
		//2.连接数据库,返回连接对象
		Connection conn = driver.connect(url, props);
		System.out.println(conn);
	}
	
	/**
	 * 使用驱动管理器类连接数据库(注册了两次,没必要)
	 * @throws Exception
	 */
	@Test
	public void test2() throws Exception{
		Driver driver = new com.mysql.jdbc.Driver();
		//Driver driver2 = new com.oracle.jdbc.Driver();
		//1.注册驱动程序(可以注册多个驱动程序)
		DriverManager.registerDriver(driver);
		//DriverManager.registerDriver(driver2);
		
		//2.连接到具体的数据库
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);
		
	}
	
	/**
	 * (推荐使用这种方式连接数据库)
	 * 推荐使用加载驱动程序类  来 注册驱动程序 
	 * @throws Exception
	 */
	@Test
	public void test3() throws Exception{
		//Driver driver = new com.mysql.jdbc.Driver();
		
		//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
		Class.forName("com.mysql.jdbc.Driver");
		
		//Driver driver2 = new com.oracle.jdbc.Driver();
		//1.注册驱动程序(可以注册多个驱动程序)
		//DriverManager.registerDriver(driver);
		//DriverManager.registerDriver(driver2);
		
		//2.连接到具体的数据库
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);	
	}
}
2.4 jdbc接口核心的API
java.sql.*   和  javax.sql.*
|- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
|- connect(url, properties):  连接数据库的方法。
url: 连接数据库的URL
URL语法: jdbc协议:数据库子协议://主机:端口/数据库
user: 数据库的用户名
password: 数据库用户密码
|- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
|-registerDriver(driver)  : 注册驱动类对象
|-Connection getConnection(url,user,password);  获取连接对象

|- Connection接口: 表示java程序和数据库的连接对象。
|- Statement createStatement() : 创建Statement对象
|- PreparedStatement prepareStatement(String sql)  创建PreparedStatement对象
|- CallableStatement prepareCall(String sql) 创建CallableStatement对象

|- Statement接口: 用于执行静态的sql语句
|- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML)
|- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL)

|-PreparedStatement接口:用于执行预编译sql语句
|- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
|-ResultSet executeQuery()  : 执行预编译的查询sql语句(DQL)

|-CallableStatement接口:用于执行存储过程的sql语句(call xxx)
|-ResultSet executeQuery()  : 调用存储过程的方法

|- ResultSet接口:用于封装查询出来的数据
|- boolean next() : 将光标移动到下一行
|-getXX() : 获取列的值
三、使用statement执行DDL语句

package com.xp.jdbc.connection;

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

import org.junit.Test;

/**
 * 使用statement对象执行静态的sql语句
 */
public class StatementDemo {
	private String url="jdbc:mysql://localhost/day17";
	private String user="root";
	private String password="xiongpan";
	/**
	 * 执行DDL语句(创建表)
	 */
	@Test
	public void test(){
		Statement stmt=null;
		Connection conn=null;
		try {
			//1.注册驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//2.获取连接对象
			conn=DriverManager.getConnection(url, user, password);
			//3.创建statement对象
			stmt=conn.createStatement();
			//4.准备sql语句
			String sql="CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";
			//5.返回结果
			int count = stmt.executeUpdate(sql);
			//6.输出返回结果
			System.out.println("影响了"+count+"行");
		}  catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			//7.关闭链接(顺序,后打开的先关闭)
			if (stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
			if (conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}
	}
}
四、使用statement执行DML语句

package com.xp.jdbc.util;
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;

/**
 * jdbc工具类
 */
public class JdbcUtil {
	private static String url = null;
	private static String user = null;
	private static String password = null;
	private static String driverClass = null;
	
	/**
	 * 静态代码块中(只加载一次)
	 */
	static{
		try {
			//读取db.properties文件
			Properties props = new Properties();
			/**
			 *  . 代表java命令运行的目录
			 *  在java项目下,. java命令的运行目录从项目的根目录开始
			 *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
			 *  所以不能使用点.
			 */
			//FileInputStream in = new FileInputStream("./src/db.properties");
			
			/**
			 * 使用类路径的读取方式
			 *  / : 斜杠表示classpath的根目录
			 *     在java项目下,classpath的根目录从bin目录开始
			 *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
			 */
			InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
			
			//加载文件
			props.load(in);
			//读取信息
			url = props.getProperty("url");
			user = props.getProperty("user");
			password = props.getProperty("password");
			driverClass = props.getProperty("driverClass");
			
			
			//注册驱动程序
			Class.forName(driverClass);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("驱程程序注册出错");
		}
	}

	/**
	 * 抽取获取连接对象的方法
	 */
	public static Connection getConnection(){
		try {
			Connection conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	
	/**
	 * 释放资源的方法
	 */
	public static void close(Connection conn,Statement stmt){
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}
	
	public static void close(Connection conn,Statement stmt,ResultSet rs){
		if(rs!=null)
			try {
				rs.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw new RuntimeException(e1);
			}
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}
}

package com.xp.jdbc.connection;

import java.sql.Connection;
import java.sql.Statement;

import org.junit.Test;

import com.xp.jdbc.util.JdbcUtil;

/**
 * 使用statement执行DMLsql语句
 */
public class StatementDMLSql {
	private String url = "jdbc:mysql://localhost:3306/day17";
	private String user = "root";
	private String password = "xiongpan";

	/**
	 * 增加
	 */
	@Test
	public void testInsert() {
		Connection conn = null;
		Statement stmt = null;
		try {
			// 通过工具类获取连接对象
			conn = JdbcUtil.getConnection();
			// 3.创建Statement对象
			stmt = conn.createStatement();

			// 4.sql语句
			String sql = "INSERT INTO student(NAME,gender) VALUES('张三','男')";

			// 5.执行sql
			int count = stmt.executeUpdate(sql);

			System.out.println("影响了" + count + "行");

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源
			/*
			 * if(stmt!=null) try { stmt.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 * if(conn!=null) try { conn.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 */
			JdbcUtil.close(conn, stmt);
		}
	}

	/**
	 * 修改
	 */
	@Test
	public void testUpdate() {
		Connection conn = null;
		Statement stmt = null;
		// 模拟用户输入
		String name = "陈六";
		int id = 3;
		try {
			/*
			 * //1.注册驱动 Class.forName("com.mysql.jdbc.Driver");
			 * 
			 * //2.获取连接对象 conn = DriverManager.getConnection(url, user,
			 * password);
			 */
			// 通过工具类获取连接对象
			conn = JdbcUtil.getConnection();

			// 3.创建Statement对象
			stmt = conn.createStatement();

			// 4.sql语句
			String sql = "UPDATE student SET NAME='" + name + "' WHERE id="
					+ id + "";

			System.out.println(sql);

			// 5.执行sql
			int count = stmt.executeUpdate(sql);

			System.out.println("影响了" + count + "行");

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源
			/*
			 * if(stmt!=null) try { stmt.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 * if(conn!=null) try { conn.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 */
			JdbcUtil.close(conn, stmt);
		}
	}

	/**
	 * 删除
	 */
	@Test
	public void testDelete() {
		Connection conn = null;
		Statement stmt = null;
		// 模拟用户输入
		int id = 3;
		try {
			/*
			 * //1.注册驱动 Class.forName("com.mysql.jdbc.Driver");
			 * 
			 * //2.获取连接对象 conn = DriverManager.getConnection(url, user,
			 * password);
			 */
			// 通过工具类获取连接对象
			conn = JdbcUtil.getConnection();

			// 3.创建Statement对象
			stmt = conn.createStatement();

			// 4.sql语句
			String sql = "DELETE FROM student WHERE id=" + id + "";

			System.out.println(sql);

			// 5.执行sql
			int count = stmt.executeUpdate(sql);

			System.out.println("影响了" + count + "行");

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源
			/*
			 * if(stmt!=null) try { stmt.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 * if(conn!=null) try { conn.close(); } catch (SQLException e) {
			 * e.printStackTrace(); throw new RuntimeException(e); }
			 */
			JdbcUtil.close(conn, stmt);
		}
	}
}
五、statement执行DQL查询语句
package com.xp.jdbc.connection;

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

import org.junit.Test;

import com.xp.jdbc.util.JdbcUtil;
/**
 * 使用Statement执行DQL语句(查询操作)
 */
public class StatementDQLSql {
	@Test
	public void test1(){
		Connection conn = null;
		Statement stmt = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			//创建Statement
			stmt = conn.createStatement();
			//准备sql
			String sql = "SELECT * FROM student";
			//执行sql
			ResultSet rs = stmt.executeQuery(sql);
			
			//移动光标
			/*boolean flag = rs.next();
			
			flag = rs.next();
			flag = rs.next();
			if(flag){
				//取出列值
				//索引
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String gender = rs.getString(3);
				System.out.println(id+","+name+","+gender);
				
				//列名称
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}*/
			
			//遍历结果
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt);
		}
	}
}

六、preparedstatement

package com.xp.jdbc.connection;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.xp.jdbc.util.JdbcUtil;

public class PreparedSQLDemo {
	/**
	 * 增加
	 */
	@Test
	public void testInsert() {
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一个参数的占位符
			
			//3.执行预编译sql语句(检查语法)
			stmt = conn.prepareStatement(sql);
			
			//4.设置参数值
			/**
			 * 参数一: 参数位置  从1开始
			 */
			stmt.setString(1, "李四");
			stmt.setString(2, "男");
			
			//5.发送参数,执行sql
			int count = stmt.executeUpdate();
			
			System.out.println("影响了"+count+"行");
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt);
		}
	}
	
	/**
	 * 修改
	 */
	@Test
	public void testUpdate() {
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "UPDATE student SET NAME=? WHERE id=?"; //?表示一个参数的占位符
			
			//3.执行预编译sql语句(检查语法)
			stmt = conn.prepareStatement(sql);
			
			//4.设置参数值
			/**
			 * 参数一: 参数位置  从1开始
			 */
			stmt.setString(1, "王五");
			stmt.setInt(2, 9);
			
			//5.发送参数,执行sql
			int count = stmt.executeUpdate();
			
			System.out.println("影响了"+count+"行");
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt);
		}
	}
	
	/**
	 * 删除
	 */
	@Test
	public void testDelete() {
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "DELETE FROM student WHERE id=?"; //?表示一个参数的占位符
			
			//3.执行预编译sql语句(检查语法)
			stmt = conn.prepareStatement(sql);
			
			//4.设置参数值
			/**
			 * 参数一: 参数位置  从1开始
			 */
			stmt.setInt(1, 9);
			
			//5.发送参数,执行sql
			int count = stmt.executeUpdate();
			
			System.out.println("影响了"+count+"行");
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt);
		}
	}
	
	/**
	 * 查询
	 */
	@Test
	public void testQuery() {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//1.获取连接
			conn = JdbcUtil.getConnection();
			
			//2.准备预编译的sql
			String sql = "SELECT * FROM student"; 
			
			//3.预编译
			stmt = conn.prepareStatement(sql);
			
			//4.执行sql
			rs = stmt.executeQuery();
			
			//5.遍历rs
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			//关闭资源
			JdbcUtil.close(conn,stmt,rs);
		}
	}
}
PreparedStatement vs Statment
1)语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
2)效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高
3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

七、callablestatement

创建存储过程
DELIMITER $
CREATE PROCEDURE	pro_findById(IN sid INT)
BEGIN 
	SELECT * FROM student WHERE id=sid;
END $;
DELIMITER $
CREATE PROCEDURE pro_findById2(IN sid INT,sname VARCHAR(20))\
BEGIN 
	SELECT NAME INTO sname FROM student WHERE id=sid;
END $

CALL pro_findById2(1,@NAME);

SELECT @NAME;
package com.xp.jdbc.connection;

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

import org.junit.Test;

import com.xp.jdbc.util.JdbcUtil;

public class CablleStatementDemo {
	/**
	 * 调用带有输入参数的存储过程
	 * CALL pro_findById(4);
	 */
	@Test
	public void test1(){
		Connection conn = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			//获取连接
			conn = JdbcUtil.getConnection();
			
			//准备sql
			String sql = "CALL pro_findById(?)"; //可以执行预编译的sql
			
			//预编译
			stmt = conn.prepareCall(sql);
			
			//设置输入参数
			stmt.setInt(1, 6);
			
			//发送参数
			rs = stmt.executeQuery(); //注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!
			
			//遍历结果
			while(rs.next()){
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String gender = rs.getString("gender");
				System.out.println(id+","+name+","+gender);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
	
	/**
	 * 执行带有输出参数的存储过程
	 * CALL pro_findById2(5,@NAME);
	 */
	@Test
	public void test2(){
		Connection conn = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			//获取连接
			conn = JdbcUtil.getConnection();
			//准备sql
			String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数
			
			//预编译
			stmt = conn.prepareCall(sql);
			
			//设置输入参数
			stmt.setInt(1, 6);
			//设置输出参数(注册输出参数)
			/**
			 * 参数一: 参数位置
			 * 参数二: 存储过程中的输出参数的jdbc类型    VARCHAR(20)
			 */
			stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
			
			//发送参数,执行
			stmt.executeQuery(); //结果不是返回到结果集中,而是返回到输出参数中
			
			//得到输出参数的值
			/**
			 * 索引值: 预编译sql中的输出参数的位置
			 */
			String result = stmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数
			
			System.out.println(result);

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
}

九、各种数据库连接

JDBC的URL=协议名+子协议名+数据源名。

a协议名总是“jdbc”。

b子协议名由JDBC驱动程序的编写者决定。

c数据源名也可能包含用户与口令等信息;这些信息也可单独提供。

几种常见的数据库连接

-------------------------------oracle------------------

驱动:oracle.jdbc.driver.OracleDriver

URL:jdbc:oracle:thin:@machine_name:port:dbname

注:machine_name:数据库所在的机器的名称;

      port:端口号,默认是1521

 

-------------------------------mysql-------------------

驱动:com.mysql.jdbc.Driver

URL:jdbc:mysql://machine_name:port/dbname

注:machine_name:数据库所在的机器的名称;

      port:端口号,默认3306   

 

---------------------------SQLServer------------------

驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver

URL:jdbc:microsoft:sqlserver://<:port>;DatabaseName=

注:machine_name:数据库所在的机器的名称;

      port:端口号,默认是1433

 

--------------------------DB2--------------------------

驱动:com.ibm.db2.jdbc.app.DB2Driver

URL:jdbc:db2://<:port>/dbname

注:machine_name:数据库所在的机器的名称;

      port:端口号,默认是5000

-------------------------------------------------------

十、通讯录jdbc版

package com.xp.contactsys_web.util;

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 JdbcUtil {
	private static String url = null;
	private static String user = null;
	private static String password = null;
	private static String driverClass = null;
	
	/**
	 * 静态代码块中(只加载一次)
	 */
	static{
		try {
			//读取db.properties文件
			Properties props = new Properties();
			/**
			 *  . 代表java命令运行的目录
			 *  在java项目下,. java命令的运行目录从项目的根目录开始
			 *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
			 *  所以不能使用点.
			 */
			//FileInputStream in = new FileInputStream("./src/db.properties");
			
			/**
			 * 使用类路径的读取方式
			 *  / : 斜杠表示classpath的根目录
			 *     在java项目下,classpath的根目录从bin目录开始
			 *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
			 */
			InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
			
			//加载文件
			props.load(in);
			//读取信息
			url = props.getProperty("url");
			user = props.getProperty("user");
			password = props.getProperty("password");
			driverClass = props.getProperty("driverClass");
			
			
			//注册驱动程序
			Class.forName(driverClass);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("驱程程序注册出错");
		}
	}

	/**
	 * 抽取获取连接对象的方法
	 */
	public static Connection getConnection(){
		try {
			Connection conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	
	/**
	 * 释放资源的方法
	 */
	public static void close(Connection conn,Statement stmt){
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}
	
	public static void close(Connection conn,Statement stmt,ResultSet rs){
		if(rs!=null)
			try {
				rs.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw new RuntimeException(e1);
			}
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}
}


package com.xp.contactsys_web.entity;
/**
 * 联系人类
 * @author xiongpan
 */
public class Contact {
	private String id;
	private String name;
	private String gender;
	private int age;
	private String phone;
	private String email;
	private String qq;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getQq() {
		return qq;
	}
	public void setQq(String qq) {
		this.qq = qq;
	}
	@Override
	public String toString() {
		return "Contact [age=" + age + ", email=" + email + ", gender="
				+ gender + ", id=" + id + ", name=" + name + ", phone=" + phone
				+ ", qq=" + qq + "]";
	}
}

package com.xp.contactsys_web.dao;

import java.util.List;

import com.xp.contactsys_web.entity.Contact;

/**
 * 联系人接口
 * @author xiongpan
 * 2017年2月5日
 */
public interface ContactDao {
	public void addContact(Contact contact);//添加联系人
	public void updateContact(Contact contact);//修改联系人
	public void deleteContact(String id);//删除联系人
	public List findAll();  //查询所有联系人
	public Contact findById(String id);//根据编号查询联系人
	public boolean checkContact(String name);//根据姓名查询是否重复
}

package com.xp.contactsys_web.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.xp.contactsys_web.dao.ContactDao;
import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.util.JdbcUtil;

public class ContactDaoImpl implements ContactDao {
	/**
	 * 添加联系人
	 */
	@Override
	public void addContact(Contact contact) {
		Connection conn = null;
		PreparedStatement stmt = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			String sql = "INSERT INTO contact(id,NAME,gender,age,phone,email,qq) VALUES(?,?,?,?,?,?,?)";
			//创建PreparedStatement
			stmt = conn.prepareStatement(sql);
			String id = UUID.randomUUID().toString().replace("-", "");
			//设置参数
			stmt.setString(1, id);
			stmt.setString(2, contact.getName());
			stmt.setString(3, contact.getGender());
			stmt.setInt(4, contact.getAge());
			stmt.setString(5, contact.getPhone());
			stmt.setString(6, contact.getEmail());
			stmt.setString(7, contact.getQq());
			//执行
			stmt.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt);
		}
	}
	/**
	 * 修改联系人
	 */
	@Override
	public void updateContact(Contact contact) {
		Connection conn = null;
		PreparedStatement stmt = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			
			String sql = "UPDATE contact SET NAME=?,gender=?,age=?,phone=?,email=?,qq=? WHERE id=?";
			
			//创建PreparedStatement
			stmt = conn.prepareStatement(sql);

			//设置参数
			stmt.setString(1, contact.getName());
			stmt.setString(2, contact.getGender());
			stmt.setInt(3, contact.getAge());
			stmt.setString(4, contact.getPhone());
			stmt.setString(5, contact.getEmail());
			stmt.setString(6, contact.getQq());
			stmt.setString(7, contact.getId());
			
			//执行
			stmt.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt);
		}

	}
	/**
	 * 删除联系人
	 */
	@Override
	public void deleteContact(String id) {
		Connection conn = null;
		PreparedStatement stmt = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			
			String sql = "DELETE FROM contact WHERE id=?";
			
			//创建PreparedStatement
			stmt = conn.prepareStatement(sql);
			
			//设置参数
			stmt.setString(1, id);
			
			//执行
			stmt.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt);
		}
	}
	/**
	 * 查询所有联系人
	 */
	@Override
	public List findAll() {
		Connection conn=null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//获取链接
			conn=JdbcUtil.getConnection();
			String sql = "SELECT * FROM contact";
			stmt=conn.prepareStatement(sql);
			rs=stmt.executeQuery();
			List list=new ArrayList();
			while(rs.next()){
				Contact c = new Contact();
				c.setId(rs.getString("id"));
				c.setName(rs.getString("name"));
				c.setGender(rs.getString("gender"));
				c.setAge(rs.getInt("age"));
				c.setPhone(rs.getString("phone"));
				c.setEmail(rs.getString("email"));
				c.setQq(rs.getString("qq"));
				list.add(c);
			}
			return list;
		} catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
	/*
	 * 根据id编号查找联系人
	 */
	@Override
	public Contact findById(String id) {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			
			String sql = "SELECT * FROM contact where id=?";
			
			//创建PreparedStatement
			stmt = conn.prepareStatement(sql);
			
			stmt.setString(1, id);
	
			//执行
			rs = stmt.executeQuery();
			Contact c = null;
			if(rs.next()){
				c = new Contact();
				c.setId(rs.getString("id"));
				c.setName(rs.getString("name"));
				c.setGender(rs.getString("gender"));
				c.setAge(rs.getInt("age"));
				c.setPhone(rs.getString("phone"));
				c.setEmail(rs.getString("email"));
				c.setQq(rs.getString("qq"));
			}
			return c;
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
	/**
	 * 检测是否存在重名的联系人
	 */
	@Override
	public boolean checkContact(String name) {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			//获取连接
			conn = JdbcUtil.getConnection();
			
			String sql = "SELECT * FROM contact where name=?";
			
			//创建PreparedStatement
			stmt = conn.prepareStatement(sql);
			
			stmt.setString(1, name);
	
			//执行
			rs = stmt.executeQuery();
			if(rs.next()){
				return true;
			}else{
				return false;
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			JdbcUtil.close(conn, stmt ,rs);
		}
	}
}

package com.xp.contactsys_web.service;

import java.util.List;

import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.exception.NameRepeatException;

public interface ContactService {
	public void addContact(Contact contact)throws NameRepeatException;//添加联系人
	public void updateContact(Contact contact);//修改联系人
	public void deleteContact(String id);//删除联系人
	public List findAll();  //查询所有联系人
	public Contact findById(String id);//根据编号查询联系人
}

package com.xp.contactsys_web.service.impl;

import java.util.List;

import com.xp.contactsys_web.dao.ContactDao;
import com.xp.contactsys_web.dao.impl.ContactDaoImpl;
import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.exception.NameRepeatException;
import com.xp.contactsys_web.service.ContactService;

public class ContactServiceImpl implements ContactService{
	//ContactDao dao = new ContactDaoImpl();
		ContactDao dao = new ContactDaoImpl();
		
		public void addContact(Contact contact) throws NameRepeatException {
			//执行业务逻辑判断
			if(dao.checkContact(contact.getName())){
				//重复
				/**
				 * 注意: 如果业务层方法出现任何业务异常,则返回标记(自定义异常)到servlet
				 */
				throw new NameRepeatException("姓名重复,不可使用");
			}
			//如果不重复,才执行添加方法
			dao.addContact(contact);
		}

		public void deleteContact(String id) {
			dao.deleteContact(id);
		}

		public List findAll() {
			return dao.findAll();
		}

		public Contact findById(String id) {
			return dao.findById(id);
		}

		public void updateContact(Contact contact) {
			dao.updateContact(contact);
		}
}

package com.xp.contactsys_web.exception;

public class NameRepeatException extends Exception {
	private static final long serialVersionUID = 1L;

	public NameRepeatException(String msg){
		super(msg);
	}
}

package com.xp.contactsys_web.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.service.ContactService;
import com.xp.contactsys_web.service.impl.ContactServiceImpl;

public class ListContactServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

				//1.从xml中读取出联系人数据
				ContactService service = new ContactServiceImpl();
				List list = service.findAll();
				
				//2.把结果保存到域对象中
				request.setAttribute("contacts", list);
				
				//3.跳转到jsp页面
				request.getRequestDispatcher("/listContact.jsp").forward(request, response);		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

package com.xp.contactsys_web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.exception.NameRepeatException;
import com.xp.contactsys_web.service.ContactService;
import com.xp.contactsys_web.service.impl.ContactServiceImpl;

public class AddContactServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//1.接收参数
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String age = request.getParameter("age");
		String phone = request.getParameter("phone");
		String email = request.getParameter("email");
		String qq = request.getParameter("qq");
		
		//封装成Contact对象
		Contact contact = new Contact();
		contact.setName(name);
		contact.setGender(gender);
		contact.setAge(Integer.parseInt(age));
		contact.setPhone(phone);
		contact.setEmail(email);
		contact.setQq(qq);
		
		ContactService service = new ContactServiceImpl();
		//2.调用dao类的添加联系人的方法
		try {
			service.addContact(contact);
		} catch (NameRepeatException e) {
			//处理自定义业务异常
			request.setAttribute("msg", e.getMessage());
			request.getRequestDispatcher("/addContact.jsp").forward(request, response);
			return;
		} 		
		
		//3.跳转到查询联系人的页面
		response.sendRedirect(request.getContextPath()+"/ListContactServlet");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

package com.xp.contactsys_web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.service.ContactService;
import com.xp.contactsys_web.service.impl.ContactServiceImpl;

public class QueryContactServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.接收id
				String id = request.getParameter("id");
				
				//2.调用service根据id查询联系人的方法
				ContactService service = new ContactServiceImpl();
				Contact contact = service.findById(id);
				
				//3.把查询的结果保存到request域中
				request.setAttribute("contact", contact);
				
				//4.跳转到修改联系人的页面
				request.getRequestDispatcher("/updateContact.jsp").forward(request, response);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		super.doPost(req, resp);
	}

}

package com.xp.contactsys_web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xp.contactsys_web.entity.Contact;
import com.xp.contactsys_web.service.ContactService;
import com.xp.contactsys_web.service.impl.ContactServiceImpl;

public class UpdateContactServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//1.接收参数
		String id = request.getParameter("id");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String age = request.getParameter("age");
		String phone = request.getParameter("phone");
		String email = request.getParameter("email");
		String qq = request.getParameter("qq");
		
		//封装成Contact对象
		Contact contact = new Contact();
		contact.setId(id);
		contact.setName(name);
		contact.setGender(gender);
		contact.setAge(Integer.parseInt(age));
		contact.setPhone(phone);
		contact.setEmail(email);
		contact.setQq(qq);
		
		//2.调用service修改联系人的方法
		ContactService service = new ContactServiceImpl();
		service.updateContact(contact);
		
		//3.跳转到查询联系人的页面
		response.sendRedirect(request.getContextPath()+"/ListContactServlet");
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

package com.xp.contactsys_web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xp.contactsys_web.service.ContactService;
import com.xp.contactsys_web.service.impl.ContactServiceImpl;

public class DeleteContactServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//在火狐浏览器中以Get方式提交带参数的数据,会重复提交两次。
		System.out.println("删除联系人");
		//1.接收id
		String id = request.getParameter("id");
		
		//2.调用service删除联系人的方法
		ContactService service = new ContactServiceImpl();
		service.deleteContact(id);
		
		//3.跳转到查询联系人的页面
		response.sendRedirect(request.getContextPath()+"/ListContactServlet");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

<%@ page language="java" import="java.util.*,com.xp.contactsys_web.entity.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


  

查询所有联系人




查询所有联系人(jsp版本)

编号 姓名 性别 年龄 电话 邮箱 QQ 操作
${varSta.count } ${con.name } ${con.gender } ${con.age } ${con.phone } ${con.email } ${con.qq } 修改 删除
[添加联系人]
<%@ page language="java" import="java.util.*,com.xp.contactsys_web.entity.*" pageEncoding="utf-8"%> 添加联系人

添加联系人

姓名 ${msg }
性别
年龄
电话
邮箱
QQ
 
<%@ page language="java" import="java.util.*,com.xp.contactsys_web.entity.*" pageEncoding="UTF-8"%> My JSP 'updateContact.jsp' starting page

修改联系人

姓名
性别 checked="checked" />男 checked="checked" />女
年龄
电话
邮箱
QQ
 








你可能感兴趣的:(第17天(就业班) jdbc连接数据库、statement执行DDL语句、statement执行DQL查询语句、preparedstatement、callablestatement、通讯录改造jdb)