一、前言:

还是力推一下,小马哥的JAVA学习!!!

学习需要一个循循渐进,或许后面这种原生的sql语句会少打。

阶段一:

Java面向对象(五)学习笔记 JDBC下_测试类

阶段二:采用预编译可有效防止SQL注入攻击


二、Coding:

Java面向对象(五)学习笔记 JDBC下_java_02


一:基础步骤:

六大步骤:见注释

package ch2020.com.ydl.jdbc;

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

public class DbUtill {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "root";
public static final String PASSWORD = "123456";
private static Connection conn = null;//选用的java的接口而不是mysql的!!!
static {
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}

public static Connection getConnection(){
return conn;
}
public static void main(String[] args) throws Exception {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//3.操作数据库,实现增删改---executeUpdate() 查executeQuery,发送SQL语句
Statement stmt = conn.createStatement();
//4.如果有数据,rs.next()返回true
String sql = "insert into imooc_goddess(id,user_name,email) values(2,'xxx','xx@sina.com')";
int num=stmt.executeUpdate(sql);
if (num>0) {
System.out.println("插入成功");
}
ResultSet rs = stmt.executeQuery("SELECT user_name, id FROM imooc_goddess");
//5.处理结果
while(rs.next()){
System.out.println(rs.getString("user_name")+" id:"+rs.getInt("id"));
}
//释放数据,有顺序要求 先关ResultSet,再关Statement,最后关Connection
stmt.close();
conn.close();
}
}

做一个登录测试

public static void login() throws ClassNotFoundException, SQLException {
System.out.println("请输入学生的姓名");
String name=input.next();
System.out.println("请输入学生的密码");
String password=input.next();
queryLoin(name,password);
}

public static void queryLoin(String name,String pa) throws ClassNotFoundException, SQLException {
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt=conn.createStatement();
String sql="SELECT user_name, id FROM imooc_goddess where user_name='"+name+"'and password='"+pa+"'";
rSet=stmt.executeQuery(sql);
//光标指向下一行
while(rSet.next()){
//获取当前行数据,(可以根据列名,也可以根据索引来获取)
System.out.println(rSet.getString("user_name")+" id:"+rSet.getInt("id"));
System.out.println("编号"+rSet.getInt(2));
}
stmt.close();
conn.close();
}

Note:


1.注意SQL 语句中 当出现字符类型的量时应该加单引号,否则会当成数据库列表,导致​未定义列名这种报错

2.‘1’=1 SQL注入,​解决措施

与PHP一样,​JAVA也有预编译​ PrepareStatement接口​下的预编译


二、使用myClipse工具测试 JDBC:

Java面向对象(五)学习笔记 JDBC下_java_03


三、为什么要使用Dao层:

代码存在于客户端,我们操作是在客户端的,所以当多个客户时,就会出现代码重复,因此我们要清除代码

代码重复没有对错,但是影响维护成本,在遵循DRY原则

Java面向对象(五)学习笔记 JDBC下_ JDBC_04

比如上述数组的例子,将容​量检查和扩容​存储存在add方法中,从而​减少数据库代码重复

什么是DAO:

Data Access Object 就是一个对象就是叫DAO

!!!!!!NOTE:!!!!!!!!

1.DAO的设计规范:

DAO组件包含DAO接口和DAO实现类以及DAO的测试类:

分包规范: ​   

package    域名倒写.模块名称.组件名;    

com._520it.smis.domain;    

存储的domain文件    com._520it.smis.dao;            

存储dao接口文件    com._520it.smis.dao.impl;  

存储dao实现类文件    com._520it.smis.test;            

临时存储测试类 起名规范:  

domain类   :   描述对象的,一把使用英文单词来表示:Xxx,比如:Employee.  

DAO 接 口:   IXxxDAO/IXxxDao, 如:IEmployeeDAO/IEmployeeDao.    

DAO实现类:   XxxDAOImpl/XxxDaoImpl, 如:EmployeeDAOImpl,EmployeeDaoImpl.

         ​注意​:实现类​一定要实现​DAO接口.,否则就废了,,,

DAO测试类:  

根据DAO接口生成测试类, XxxDAOTest/XxxDaoTest,如:EmployeeDAOTest,EmplyeeDaoTest.

创建DAO对象规范:              

 1):DAO对象起名,统统叫做xxxDAO.              

  2):面向接口编程,把DAO对象赋给DAO接口类型.      IEmployeeDAO employeeDAO= new  EmployeeDAOImpl();


2.DAO操作步骤:    

1:先创建一张表.    

2:根据表的结构,创建domain对象.    

3:创建DAO接口,并提供DAO方法(CRUD).    

4:创建DAO实现类,覆盖接口中的方法,但是暂时不实现.    

5:根据DAO接口​生成DAO测试类.  ​    ​单元测试

6:完成DAO实现类中的方法,并测试通过.