前言------ 经过了两天的整理,终于把jdbc连接数据库的知识整理完了,继续加油!
JDBC
jdbc:java database connectivity java 数据库连接池
为什么使用jdbc:
jdbc是SUN公司提供的一种访问数据库的一种规范,因为数据库的种类非常的多,并且java语言使用非常的广泛,所 以 就出现了jdbc,sun公司要求其他数据库公司都去实现jdbc的底层的访问规则,而我们java程序员只需要sun公司提 供的jdbc驱动就可以。
使用JDBC
1、注册驱动
//为防止二次驱动不这样写
//DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
2、完成数据库的链接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/hou","root","123456");
3、创建Statement对象,与数据库打交道
st = conn.createStatement();
4、执行写入的sql语句,返回ResultSet结果集
String sql = "select * from student";
rs = st.executeQuery(sql);
5、遍历结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id+" "+name+" "+age);
}
6、释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
构建Util工具类:
1、释放资源
//关闭资源,向外提供一个公共的方法
public static void closeResource(Connection conn ,Statement st , ResultSet rs){
closeRs(rs);
closeStatement(st);
closeConnection(conn);
}
//关闭ResultSet
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭Statement
private static void closeStatement(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭Connection
private static void closeConnection(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
2、防止二次注册驱动
Class.forName("com.mysql.jdbc.Driver");
//当类加载的时候就静态的执行了静态代码块,DriverManager.registerDriver(new Driver());
Driver类中的static静态代码块中有注册驱动的,当类加载的时候,就给注册了驱动,所以为防止二次驱动,写以下代码 即可
Class.forName("com.mysql.jdbc.Driver");
3、使用文件名.properties配置文件
建立Properties类,放在static代码块中
Properties pro = new properties();
读取properties配置文件,当文件在src目录下时候使用,当类加载时候,会把properties文件一块加载
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
加载properties文件
pro.load(is);
读取properties文件中的属性
pro.getProperty("属性名");
static {
try {
Properties properties = new Properties();
//当文件位于项目工程根目录底下的时候,写相对路径,
//参照物为:D:\idea\idea_project\javahou
//InputStream is = new FileInputStream("mysql-all/jdbc.properties");
//当文件位于src目录底下的时候
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(is);
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
System.out.println(driverClass+" "+url +" "+username+" "+password);
} catch (IOException e) {
e.printStackTrace();
}
}
数据库的CRUD sql
增加
public static void textInsert(){
try {
//连接数据库
Connection conn = JDBCUtil.getConn();
//创建Statement
Statement st = conn.createStatement();
//执行查询语句返回ResultSet结果集
String sql = "insert into student values(6,'哈哈',15)";
int row = st.executeUpdate(sql);
if(row > 0){
System.out.println(row+"插入成功");
}else{
System.out.println(row+"插入失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
删除
public static void textDelete(){
try {
//连接数据库
Connection conn = JDBCUtil.getConn();
//创建Statement
Statement st = conn.createStatement();
//执行查询语句返回ResultSet结果集
String sql = "delete from student where id = 5 or id = 6";
int row = st.executeUpdate(sql);
if(row > 0){
System.out.println(row+"删除成功");
}else{
System.out.println(row+"删除失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
改
public static void textUpdate(){
try {
//连接数据库
Connection conn = JDBCUtil.getConn();
//创建Statement
Statement st = conn.createStatement();
//执行查询语句返回ResultSet结果集
String sql = "update student set age=23 where name = 'zhangsan'";
int row = st.executeUpdate(sql);
if(row > 0){
System.out.println(row+"更新成功");
}else{
System.out.println(row+"更新失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
查
public static void textQuery(){
try {
//连接数据库
Connection conn = JDBCUtil.getConn();
//创建Statement
Statement st = conn.createStatement();
//执行查询语句返回ResultSet结果集
String sql = "select * from student";
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String age = rs.getString("age");
System.out.println(id+" "+" "+name+" "+age );
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Dao模式
Dao层实现业务的逻辑
implDao层实现具体的业务
text层进行测试
util层是各种工具,比如连接数据库等
1、新建一个dao接口,里面生命数据库的访问规则,比如增删改查
/**
* 执行添加
* @param userName
* @param password
*/
void insert(int id,String userName , int age);
2、新建一个dao的实现类,具体实现在dao接口中定义的规则
@Override
public void insert(int id,String userName, int age) {
try {
//连接数据库
Connection conn = JDBCUtil.getConn();
//创建Statement
Statement st = conn.createStatement();
//执行查询语句返回ResultSet结果集
String sql = "insert into student values("+id+",'"+userName+"',"+age+")";
int row = st.executeUpdate(sql);
if(row > 0){
System.out.println(row +"插入成功");
}else{
System.out.println(row+"插入失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
3、在text里面直接使用
public static void textInsert(){
UserDaoImpl d = new UserDaoImpl();
d.insert(4,"haha",24);
}
PrepareStatement对象的使用
Statement安全问题
Statement执行 ,其实是拼接sql语句的。 先拼接sql语句,然后在一起执行。
String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'";
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1");
SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1'
/*前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 */
rs = st.executeQuery(sql);
PreporeStatement
相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递 进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
比如:String sql = "insert into student values(?,?,?);"
String sql = "insert into student valiues(?,?,?)";
//预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select
PreparedStatement ps = conn.preporeStatement(sql);
//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setString(1,username);
pa.setString(2,password);
//执行sql语句
ps.execQuery();
idea使用junit单元测试的配置
https://blog.csdn.net/u010569419/article/details/87539995