Detalles en JDBC

1. ¿Por qué utilizar JDBC?
Debido a que los datos deben conservarse, la mejor forma de conservarlos es guardarlos en la base de datos, y Java necesita usar JDBC para guardar los datos en los datos.

2. La única tecnología para persistir en la base de datos es JDBC. La capa inferior de todos los demás marcos es JDBC, por ejemplo, Hibernate, MyBatis, JPA, SpringData JDBC

3. ¿Qué es JDBC?
JDBC (Java DataBase Connectivity, Java database connection):
es una API de Java que se utiliza para ejecutar declaraciones SQL (DML, DDL, DQL), puede proporcionar acceso unificado a una variedad de bases de datos relacionales (Oracle, mysql, SQL Server), es Un conjunto de clases e interfaces escritas en lenguaje Java. JDBC proporciona un punto de referencia a partir del cual se pueden construir herramientas e interfaces más avanzadas para permitir que los desarrolladores de bases de datos escriban aplicaciones de bases de datos.

4. Conclusión: No importa qué tipo de base de datos usemos en el futuro, necesitamos importar el paquete jar de implementación jdbc proporcionado por esta base de datos (como mysql: mysql-connector-java-5.1.7-bin.jar)

5. Pasos de uso de JDBC: agregar (cargar el controlador), conectar (conectarse a la base de datos), pre (obtener objetos precompilados), ejecutar (ejecutar SQL), liberar (liberar la conexión)

	//添加示例
	public void testAdd() throws ClassNotFoundException, SQLException {
    
    
		//1.注册驱动[反射机制:jvm 拿到Mysql已经写好的驱动类] 
		Class.forName("com.mysql.jdbc.Driver");
		//2.获得连接对象
		//url可简写为jdbc:mysql:///数据库名
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "用户名", "密码");
		//3.获得预编译对象,准备执行Sql
		Statement statement = conn.createStatement();
		//4执行Sql 
		String sql = "insert into user(name,sex,phoneNum) value ('孙孙',false,'666')";
		System.out.println(sql);
		statement.execute(sql);//执行sql语句
		//5.释放资源
		statement.close();//关闭  
		conn.close();
	}

6. ResultSet: guarda los datos devueltos por la consulta
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

7. La diferencia entre PreparedStatement y createStatement
(1) Statement no necesita pasar en sql al crear un objeto de declaración; mientras que PreparedStatement es una declaración preparada y debe pasarse en sql. En este momento, la base de datos ha recibido la declaración sql y está compilada (¿usar? El parámetro ocupa un lugar, por lo que se llama marcador de posición), esperando que el parámetro opere, por lo que es más rápido que createStatement;
(2) Por lo tanto, cuando se ejecuta la instrucción SQL, la instrucción debe pasarse en sql; PreparedStatement está en la ejecución de la instrucción sql, No es necesario pasar en sql;
(3) PreparedStatement usa el marcador de posición? Para asignar valor (ps.setObject (index, value)), y createStatement es mediante empalme +
(4) Por lo tanto, PreparedStatement es seguro y createStatement es Inseguro (contraseña universal: 'o 1 = 1 o'), hay
conexión de inyección SQL (5): PreparedStatement es una subinterfaz de Statement

8. Herramienta de extracción de capa de Dao: agregar, eliminar, verificar y cambiar un método

	public List<User> execute(String sql, Object... arr) {
    
    
		ArrayList<User> userList = new ArrayList<User>();
		Connection connection = null;
		PreparedStatement ps =null;
		try {
    
    
			connection = DBCPUtil2.getConnection();
			ps = connection.prepareStatement(sql);
			
			for (int i = 0; i < arr.length; i++) 
				ps.setObject(i+1, arr[i]);
			
			if (sql.contains("select")) {
    
    //是select,获取结果集,放到集合里,返回集合
				ResultSet eq = ps.executeQuery();
				while (eq.next()) {
    
    
					userList.add(new User(eq.getInt("id"), eq.getString("name"), eq.getBoolean("sex"), eq.getString("phoneNum"), eq.getString("pwd")));
				}
				return userList;
			} 
			ps.execute();//是DML操作,执行即可,最后返回null
		} catch (SQLException e) {
    
    
			e.printStackTrace();
		}
		return null;
	}

9. Transacción: se
refiere a un grupo de unidades de operación lógica que transforman datos de un estado a otro.
Atributos ACID: Atomicidad atómica, Consistencia de consistencia, Aislamiento de aislamiento y Durabilidad durabilidad

	/**
	*	转账示例
	*/
	public void testTransaction() {
    
    
		Connection conn = null;
		Statement cs =null;
		try {
    
    
			conn = JDBCUtil.getConnection();//一个连接就是一个事务
			conn.setAutoCommit(false);//事务默认是自动提交,所以设置为手动提交
			
			cs = conn.createStatement();
			
			String sql="update user set money=money-10 where name=shp";//转钱:转方
			cs.execute(sql);
			
			System.out.println(1/0);//模仿异常发生
			
			sql="update user set money=money+10 where name=heping";//转钱:收方
			cs.execute(sql);
			
			conn.commit();//在操作完成后提交事务
		} catch (Exception e) {
    
    
			try {
    
    
				conn.rollback();//发生异常就事务回滚
			} catch (SQLException e1) {
    
    
				e1.printStackTrace();
			}
		}finally {
    
    
			JDBCUtil.close(conn, cs, null);
		}
	}

10. Resuelva el problema de codificación rígida de la información de configuración de la base de datos, realice el grupo de conexiones a través de DHCP y analice los archivos de recursos.
Paquete de guía commons-dbcp-1.3.jar y commons-pool-1.5.6.jar
(1) Grupo de conexiones

public class DBCPUtil {
    
    
	static Properties properties = new Properties();
	
	static BasicDataSource bds = new BasicDataSource();//BasicDataSource
	static{
    
    
		try(
			InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		) {
    
    
			properties.load(is);//解析资源文件,解决硬编码问题
			
			bds.setDriverClassName(properties.getProperty("driverClassName"));
			bds.setUrl(properties.getProperty("url"));
			bds.setUsername(properties.getProperty("username"));
			bds.setPassword(properties.getProperty("password"));
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
    
    
		try {
    
    
			return bds.getConnection();//向连接池获取连接
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		return null;
	}
}

(2) Modelo de fábrica

public class DBCPUtil2 {
    
    
	static Properties properties = new Properties();
	
	static DataSource bds;
	static{
    
    
		try(
			InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
		) {
    
    
			properties.load(is);//解析资源文件,解决硬编码问题
			
			//工厂已定义好字段名,所以想要正确获取,就应该在配置文件中的配置参数写对应的名字
			bds=BasicDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
    
    
		try {
    
    
			return bds.getConnection();//向连接池获取连接
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		return null;
	}
}

Supongo que te gusta

Origin blog.csdn.net/ExceptionCoder/article/details/108294259
Recomendado
Clasificación