JDBC快速入门

简介

今天学习JDBC。重点掌握如何使用Java连接。代码练习基于JDBC/mysql改写用户注册,客户订单

 

1. 什么是JDBC?

1. JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库
2. 组成包:java.sql.*;javax.sql.*;这两个包都包含在了JDK中
3. 最早JDBC是Java EE中的规范,但是现在已经添加到Java SE中了。也就是说,JDBC API在JDK中就已经存在

2. JDBC开发步骤

1、注册驱动	Class.forName(com.mysql.jdbc.Driver)
2、获取与数据库的链接	Connection conn = DriverManager.getConnection(url,username,passwrod)
3、得到代表发送和执行SQL语句的对象 ResultSet rs = conn.createStatement()
4、执行语句	rs.executeQuery("");
5、如果执行的是查询语句,就会有结果集,处理遍历结果集rs.next()
6、释放占用的资源	rs.close(); stmt.close();	conn.close();

3. JDBC的编码规范和工具类的提取

JDBC的编码规范和工具类的提取
1. 编写配置文件
	driverClass=com.mysql.jdbc.Driver
	url=jdbc:mysql://192.168.13.2:3306/day15cus
	username=root
	password=root
2. 抽取了工具类
	static {
		InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("");
		Properties prop = new Properties();
		try {
			prop.load(is);
			driverClass = prop.getProperty("driverClass");
			url = prop.getProperty("url");
			username = prop.getProperty("username");
			password = prop.getProperty("password");
			
			//为了加载驱动只加载一次,放在静态代码块中
			Class.forName(driverClass);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	//获取数据库连接
	public static Connection getConnection() throws Exception {
		
		return DriverManager.getConnection(url,username,password);
	}
	//关闭资源release();

4. JDBC对数据库中的数据进行CRUD

数据库中插入数据
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	try {
		conn = JdbcUtil.getConnection();
		stmt = conn.createStatement();
		stmt.executeUpdate("insert into users (name,password,email,birthday) values('alice','123','alice@itheima.com','1999-09-19')");
	} catch(Exception e) {
		throw new RuntimeException(e);	
	}
数据库中更新数据
	Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            stmt = conn.createStatement();
            stmt.executeUpdate("update users set password='1234' where id=6");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcUtil.release(rs, stmt, conn);
        }
数据库删除数据
	   Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            stmt = conn.createStatement();
            for(int x=8;x<10;x++)
            stmt.executeUpdate("delete from users where id="+x);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcUtil.release(rs, stmt, conn);
        }
数据库查询数据
	try {
		conn = JDBCUtils.getConnection();
		stmt = conn.createStatement();
			
		String sql = "select sid, sname, sage, cid from student where sid='8510'";
		ResultSet rs = stmt.executeQuery(sql);
			
		while(rs.next()) {
			System.out.println(rs.getString(1)+">>"+rs.getString(2)+">>" + rs.getString(3)+">>" + rs.getString(4));
		}
			
		JDBCUtils.close(rs, stmt, conn);
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
            JdbcUtil.release(rs, stmt, conn);
        }

5. PreparedStatement特点和作用

a、指示SQL语句的预编译。提高数据库的执行效率
b、防止SQL注入。给数据库的已经不是字符串了
c、语句中的参数可以使用占位符(?)

6. Dao解耦的好处

好处: 降低了层与层之间的耦合性,大大提高了程序的扩展
如何解耦
	创建一个工厂类用于生产实现类,将实现类的名称放在配置文件中,使用反射创建该对象,便于以后维护和开发

JDBC项目练习

1. 用户注册案例

1. 开发前奏
	1.1 导包commons-beanutils-1.8.3.jar/commons-logging-1.1.1.jar/mysql-connector-java-5.0.8-bin.jar
	1.2 创建组织包
		com.itheima.domain			实体类User
		com.itheima.dao				定义操作数据库接口
		com.itheima.dao.impl		定义操作数据库具体实现
		com.itheima.service			定义业务逻辑接口
		com.itheima.service.impl	实现业务逻辑接口中的方法
		com.itheima.utils			工具类
		com.itheima.web.form		页面实体类和表单信息一致
		com.itheima.web.controller	控制器
		junit.test					测试类
		com.itheima.exception		异常类
		
		数据库中创建User表结构
		
2. 创建数据库user表
	create table user(
		id varchar(100) primary key,
   		username varchar(100) not null unique,
    		password varchar(100) not null,
    		email varchar(100) not null,
   		birthday date not null,
   		nickname varchar(100) not null
	);
	
3. 创建实体类User
	private String id;
	private String username;
	private String password;
	private String email;
	private Date birthday;
	private String nickname;
	
4. 实现UserDaoMySQLImpl类中方法
	4.1 实现方法addUser/find/findByUsername
	4.2 定义JdbcUtils工具类,利用配置文件实现(提高扩展性)
	
5. 实现BusinessServiceImpl类中方法
	5.1 实现方法register/login
	5.2 定义BeanFactory工厂类用来创建实现类实例,利用配置文件实现

6. 创建控制器ControllerServlet类
	6.1 首先解决乱码问题
	6.2 根据用户传递的操作类型,创建不同操作类型的方法
	6.3 创建业务操作方法
		1) login方法
			#1.1 获取用户登录传递过来的用户名和密码
			#1.2 调用业务逻辑层中login方法验证是否登录成功,
			如果成功重定向到首页(如果重定向的话,这里需要将user设置session域,主页中调用)
			#1.3 否则验证失败提示信息,1秒后刷新到登录页
			
		2) register方法
			#2.1 将用户录入的数据注入到页面实体类formBean中
			#2.2 调用formBean中validate方法验证是否有效
			#2.3 拷贝formBean到user实体类中
			#2.4 设置user的id
			#2.5 调用业务层中register注册方法如果注册成功,提示信息,1秒后跳到登录页
			#2.6 否则抛异常,将错误信息加入到集合中,转发到注册页
		
		3) logout方法
			#3.1 将session域中的user移除
			#3.2 提示信息注销成功,1秒后刷新到登录页
			
页面设计
	1. indext.jsp主页
		1.1 判断session域中user值是否为空,不为空就提示欢迎界面,提供注销功能
		1.2 若为空就提示注册或者登录界面
	2. login.jsp登录页
		2.1 用户登录表单提交到总控制器中
		2.2 加入一个隐藏域,为该提交操作类型的参数
	3. register.jsp注册页面
		3.1 用户注册表单,提交操作参数
		3.2 注意:隐藏域id,日期控件,设置value值,<span>区域

2. 客户信息管理系统

1. 开发前奏
	1.1 导包
		commons-beanutils-1.8.3.jar
		commons-logging-1.1.1.jar
		mysql-connector-java-5.0.8-bin.jar
	1.2 创建组织包
		com.itheima.domain
		com.itheima.dao
		com.itheima.dao.impl
		com.itheima.service
		com.itheima.service.impl
		com.itheima.utils
		com.itheima.web.controller
		junit.test
		
		dfcg.properties配置文件
	1.3 开发步骤
		DB-->domain-->BusinessService(test)-->CustomerDao(test)
		-->controller(utils)<-->view
		
		
2. 创建数据库customer表
	create table customer(
		id varchar(100) primary key,
		name varchar(100) not null unique,
		gender varchar(100) not null,
		birthday date not null,
		phone varchar(100) not null,
		email varchar(100) not null,
		hobby varchar(100) not null,
		type varchar(100) not null,
		description text
	);

3. 创建实体类
	private String id;
	private String name;
	private String gender;
	private Date birthday;
	private String phone;
	private String email;
	private String hobby;
	private String type;
	private String description;
	
4. 创建业务逻辑层实现类(BusinessServiceImpl),实现业务中方法
	List findAll()返回所有客户					saveCustomer(customer)添加一个客户
	deleteCustomer(customerid)			Customer 	findOne(customerid)查找一个客户
	updateCustomer(customer)更新客户
	
5. 创建数据访问层实现类(CustomerDaoImpl),实现CRUD方法,以便业务层调用
	findAll()返回所有客户				save保存一个客户
	delete删除一个客户					findOne查找一个客户
	update更新一个客户
	
6. 创建一个控制器ControllerServlet控制表单信息CRUD
	6.1 首先解决乱码问题
	6.2 获取客户传递的操作类型,根据操作类型操作客户信息
	6.3 控制器中操作类型方法
		addCustomer()添加一个客户
			1). 日期类型不一致,CoonverterUtils注册类型转换器
				register(DateLocaleConverter(),Date.class)
			2). 创建一个工具类,用作拷贝表单请求的值到JavaBean中
				因为请求的表单信息和JavaBean一致,所以这里可以省略页面实体类
			3). hobby有多个值,所以这里需要对hobby进行拼接字符串,设置到hobby中
			4). 调用业务逻辑实现添加功能
			5). 转发到listCustomer.jsp中--
		showAllCustomers()查看所有信息
			1). 调用业务逻辑实现查看所有信息,得到一个集合
			2). 将集合设置到request域中
			3). 转发到listCustomer.jsp中
		delOneCustomer()删除指定id信息
			1). 获取操作删除的id
			2). 调用业务逻辑方法实现删除
			3). 执行查看所有方法
		delMultiCustomer()删除多选的ID
			1). 首先获取ids一组值
			2). 遍历,调用业务层中deleteCustomer方法删除
			3). 再执行查看所有信息方法

页面设计
	1. 添加客户信息addCustomer.jsp
		用户注册表单信息,提交到ControllerServlet?op=addCustomer
		日期控件、返回主页
	2. index.jsp-->jsp:forward 转发到ControllerServlet-->jsp:param value="listAll" name= op
	3. list客户信息表
		1. 表单头部:添加(链接添加jsp)/删除(删除事件)
		2. 信息标题<全选/取消功能>
		3. 遍历客户信息