JDBC学习笔记(二)

package day01pm.dao;

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

import dayo1pm.entity.Student;

/**
 * DAO数据连接对象
 * StudentDAO用于操作数据库Student表
 * 
 * @author Administrator
 *
 */
public class StudentDAO extends BaseDAO{
/**
 * 根据学生名字查询学生信息
 */
	public Student findStudentByName(String name){
		Connection conn = null;
		try{
			//通过父类BaseDAO的getConnection()方法获取数据库连接
			conn = getConnection();
//			Statement state = conn.createStatement();
			String sql = "SELECT * FROM student WHERE name=?";
			PreparedStatement state = conn.prepareStatement(sql);
			state.setString(1,name);
			/**
			 * 根据用户名查询该用户信息
			 * 并将这条数据转化为一个Student对象并返回
			 */
//			ResultSet rs = state.executeQuery(sql);
			ResultSet rs = state.executeQuery();
			if(rs.next()){
				Student student = new Student();
				student.setId(rs.getString("id"));
				student.setName(rs.getString("name"));
				student.setAge(rs.getInt("age"));
				student.setSex(rs.getString("sex"));
				return student;
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//调用父类的关闭连接方法
			closeConnection(conn);
		}
		return null;
	}
	/**
	 * 持久化Student对象
	 * 将Student对象的数据保存到数据库中
	 */
	public boolean saveStudent(Student student){
		Connection conn = null;
		try{
			//通过父类BaseDAO的getConnection()方法获取数据库连接
			conn = getConnection();
//			Statement state = conn.createStatement();
			/**
			 * Statement的缺点:
			 * 1:维护代码困难,编写sql语句复杂
			 * 2:Statement每次执行sql语句时都要在传送前编译,效率低
			 * 3:不安全,可能出现sql注入攻击
			 */
//			String sql = "INSERT INTO student VALUES(" + "sys_guid()," + "'"+student.getName()+"',"+
//			student.getAge()+","+"'"+student.getSex()+"'"+")";
			/**
			 * 预编译SQL将sql中变化的内容用“?”代替,然后通过PreparedStatement
			 * 执行该sql时用给定的参数代替?来达到插入不同数据的目的预编译SQL更像是一个
			 * 格式或者模板
			 */
			String sql = "INSERT INTO student VALUES(sys_guid(),?,?,?";
			PreparedStatement state = conn.prepareStatement(sql);
			//将第一个问号替换为学生的名字
			state.setString(1, student.getName());
			state.setInt(2,student.getAge());
			state.setString(3, student.getSex());
			System.out.println(sql);
			/**
			 * PreparedStatement也包含execute(),executeQuery()
			 * 和executeUpdate()方法。只不过都是无参数的。
			 * 因为我们在获取PreParedStatement时已经将sql语句
			 * 传入了。所以执行就可以。不需要再传入Sql。
			 */
			if(state.executeUpdate()>0){
				return true;
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//调用父类的关闭连接方法
			closeConnection(conn);
		}
		return false;
	}
}
jdbc.driver = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@192.168.0.26:1521:tarena
jdbc.user = scott
jdbc.pwd = tiger
db.properties
package day01pm.dao;

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

/**
 * DAO父类
 * 基础类
 * 提供所有DAO都需要具备的特性
 * @author Administrator
 *
 */
public class BaseDAO {
	/**
	 * java.util.Properties类
	 * 用于读取.properties文本文件的类
	 * properties文件是一个纯文本文件,里面定义的内容格式有要求
	 * 必须是key=value的形式,并且以行为单位
	 * 一行只记录一条数据
	 * Properties类可以方便的读取properties文件,并将内容以类似HashMap的形式进行读取。
	 * 注意!读取的都是字符串!
	 * Properties通常都是当做配置文件而使用的。
	 */
	private static Properties properties = new Properties();
	private static String driver = "oracle.jdbc.driver.OracleDriver";
	private static String url = "jdbc:oracle:thin:@192.168.0.26:1521:tarena";
	private static String user = "jak";
	private static String pwd = "666666";
	/**
	 * 在静态初始化中注册驱动
	 * 驱动不需要重复注册,所以静态初始化最适合注册驱动
	 */
	static{
		try{
			/**
			 * 加载配置文件,读取配置信息
			 */
			properties.load(BaseDAO.class.getClassLoader().getResourceAsStream(""+
			 "day01pm/dao/db.properties"));
			System.out.println(properties.getProperty("jdbc.driver"));
			/**
			 * 通过Properties的方法getProperty(String key)
			 * 方法可以将properties文件中
			 * jdbc.driver=oracle.jdbc.driver.OracleDriver
			 * 数据获取。获取方式是将jdbc.driver以key作为参数调用方法
			 * 返回的就是等号右面的值oracle.jdbc.driver.OracleDriver了 
			 */
			driver = properties.getProperty("jdbc.driver");
			url = properties.getProperty("jdbc.url");
			user = properties.getProperty("jdbc.user");
			pwd = properties.getProperty("jdbc.pwd");
			//加载驱动
			Class.forName(driver);//反射机制
			/**
			 * Oracle.jdbc.driver.OracleDriver类
			 * 在Class.forName()的时候被载入JVM
			 * OracleDriver是JDBC中Driver的子类
			 * 它被要求在静态初始化的时候要将自身驱动的信息通过
			 * DriverManager的静态方法注册进去,这样DriverManager
			 * 就知道应该如何通过OracleDriver去连接该数据库了。
			 * 所以之后就可以通过DriverManager的另一个静态方法:
			 * getConnection()来根据之前注册的驱动信息获取连接了。
			 */
			
		}catch(Exception e){
			e.printStackTrace();
			//若注册失败,我们要通知调用者
			throw new RuntimeException(e);
		}
	}
	/**
	 * 获取数据库连接对象Connection
	 * @return
	 * @throws SQLException
	 */
	protected static Connection getConnection() throws SQLException{
		return DriverManager.getConnection(url,user,pwd);
	}
	/**
	 * 将给定的数据库连接关闭
	 * @param conn
	 */
	protected static void closeConnection(Connection conn){
		if(conn != null){
			try{
				conn.close();
			}catch (SQLException e){
				e.printStackTrace();
			}
		}
	}
}
package day01.pm;
/**
 * 测试类
 * @author Administrator
 *
 */
public class TestStudent {
	public static void main(String[] args) {
		String studentName = "jak";
		int age = 16;
		String sex = "1";
		StudentService service = new StudentService();
//		service.findStudentByName(studentName);
		service.reg(studentName, age, sex);
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值