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);
}
}