今日内容
JDBC概述
JDBC实现CURD操作
单元测试
DAO设计模式
一、JDBC概述
java Database connection java语言连接数据库
是java内部提供一套操作数据库的接口,实现对象数据库的统一访问
组成
DriverManager:驱动管理器,用户注册驱动,获取连接对象
Connection接口:数据库的连接对象
Statement接口:执行SQL语句,操作数据 (使用字符串拼接时可能会造成sql注入不建议使用)
PreparedStatement接口 执行SQL语句,操作数据(预处理机制,使用?占位符传入参数解决sql注入问题)
ResultSet接口:结果集 一张虚拟的表
二、通过JDBC实现CURD操作
1、准备
学习过程中使用的是mysql数据库,使用的IDE工具Eclipse
<1>在mysql数据库中创建表
Student
<2>在Eclipse中创建实体类
创建实体类Student
<3>引入数据厂商提供的驱动(.jar文件的方式)
将文件引入到WebContent下 WEB-INF下lib中
<4>编写代码
使用JDBC访问数据库的步骤:
1、加载数据库的驱动
2、获取数据库的连接对象
3、编写SQL语句
4、获取PrepareStatement对象,执行SQL语句
5、处理结果集ResultSet
6、释放资源colse()
注册数据库驱动
Class.forName("驱动类全权定名");
获取数据库连接对象
Connection conn=Connection DriverManager.getConnetion(url,user,password);
参数一:url统一资源定位 Uniform Resource Locator
标识网络上的一个具体的资源(网页,一张照片,一个视频)
协议+ip地址+端口+资源名称
8.0以前:jdbc:mysql://127.0.0.1:3306/tlxy
8.0以后:jdbc:mysql://127.0.0.1:3306/tlxy?
characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
(增加了时区的参数)
参数二:用户名
参数三:密码
执行sql语句
String sql=" select * from student where name =?";
String name="123";
PreparedStatement ps =conn.prepareStatement(sql);
ps.setString(1, name);
ReusltSet rs =ps.executeQuery();
ReusltSet
作用:封装了查询的结果数据,内部含有一个游标,默认实行数据前
方法:boolean next(),将指向数据的游标下移,返回没有数据的标记
if(rs.next()){
rs.getObject(1);//通过索引值获取value
int sid =rs.getObject("sid");//通过列名称获取值
String name=rs.getObject("name");
int age=rs.getObject("age")
Student stu = Student(sid,name,age); //数据封装到实体类
}
关闭连接
conn.close();
ps.close();
rs.close();
编写JDBC工具类
为了减少代码的冗余编写JDBC工具类
import java.io.FileReader;
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 JDBCUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
static {
try {
Properties p = new Properties();
p.load(new FileReader("db.properties"));
driver=p.getProperty("mysql.dataSource.driver");
url=p.getProperty("mysql.dataSource.url");
username=p.getProperty("mysql.dataSource.username");
password=p.getProperty("mysql.dataSource.password");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn=null;
try {
conn =DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void CloseCon(Connection conn,Statement st,ResultSet rs) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
单元测试
Junit是Java单元测试框架,已经在Eclipse中默认安装
Junit4通过注解的方式来识别测试方法
@Before 在测试方法运行之前运行
@Test 测试方法
@After 在测试方法运行之后运行
DAO设计模式
<1>概念
DAO:data access object 数据库访问对象
是位于业务逻辑和持久化数据之间的一套标准
<2>作用
隔离了业务逻辑代码和数据操作代码,将业务层和数据层进行解耦
实现不同数据的操作
增加了程序的可扩展性和灵活性
<3>组成
1、数据库交互的工具类,负责数据库的开启和关闭操作
2、实体类:主要属性和各种操作属性的set/get方法组成的类型,VO类bean类,entity类
此类中属性和表的字段对应,每一个实体对象表示表中的一条记录
3、DAO接口:定义操作的标准
4、DAO接口是实现类:完成具体的数据操作
5、DAO工厂类:通过工厂类获取一个DAO对象
6、Service类:通过工厂获取DAO对象,执行各种数据操作
获取properties文件的信息
ResourceBundle rb = ResourceBundle.getBundle("com.tlxy.factory.user");
String str = rb.getString("UserDaoInfo");
//通过全限定名获取Class
Class<UserDao> forName = (Class<UserDao>) Class.forName(str);
1.9以后由于Class.newInstance()已经过时使用下面方式替换
//通过Constructor.newInstance()
Constructor<UserDao> dc = forName.getDeclaredConstructor();
dao = dc.newInstance();