当前位置: 首页 > 后端技术 > Java

JAVA学习笔记02——JDBC

时间:2023-04-01 15:18:37 Java

JAVA操作数据库规范,调用JDBC导入包:java.sqljavax.sql数据库驱动包:mysql-connector-java-5.1.47.jar下载地址:https://mvnrepository.com/art...MacOS10.12对应Docker下载地址(2.2.1.0):https://docs.docker.com/deskt...DockerinstallMysql5vimdocker-compose.ymldocker-composeup-dversion:'3.5'服务:dbm:图像:mysql:5.7命令:--default-authentication-plugin=mysql_native_password重新启动:始终环境:MYSQL_ROOT_PASSWORD:123456卷:-'./storage/mysql:/var/lib/mysql'端口:-3306:3306注:mysql5.7.11对应的JDBC驱动是5.1版本。第一个JDBC程序创建一个普通工程,导入数据库驱动:驱动包放在lib文件夹下(与src同级),AddasLibrary写入测试代码importjava.sql.*;publicclassApplication{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//2。配置连接信息Stringurl="jdbc:mysql://localhost:3306/testDB?useUnicode=true&characterEncoding=utf8&useSSL=false";字符串用户名=“root”;字符串密码=“root”;//3。连接成功,获取连接对象Connectionconnection=DriverManager.getConnection(url,username,password);//4。获取执行Sql语句的对象Statementstatement=connection.createStatement();//5。执行SqlStringsql="SELECT*FROMusers";结果集resultSet=statement.executeQuery(sql);while(resultSet.next()){System.out.println("id="+resultSet.getObject("id"));}//6。释放资源resultSet.close();语句.close();connection.close();}}JDBC对象解释statementstatement.executeQuery(sql);//查询操作返回resultSetstatement.execute(sql);//执行任何Sqlstatement.executeUpdate(sql);//update,insert,Delete操作,返回受影响的行数遍历,指针resultSet.beforeFirst();//移到前面resultSet.afterLast();//移到后面resultSet.next();//下一行数据resultSet.previous();//上一行resultSet.absolute(row);//移动到指定行语句对象JDBC中的语句对象用于向数据库发送Sql语句配置文件db.propertiesdriver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=falseusername=rootpassword=root工具类JdbcUtilspackagecom.oop.demo;importjava.io.InputStream;importjava.sql.*;importjava.util.Properties;publicclassJdbcUtils{privatestaticStringdriver=null;私有静态字符串url=null;私有静态字符串用户名=空;私人静态字符串密码=空;static{try{//getClassLoader类加载器InputStreamin=JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");属性properties=newProperties();属性.load(in);driver=properties.getProperty("驱动程序");url=properties.getProperty("url");username=properties.getProperty("用户名");password=properties.getProperty("密码");Class.forName(driver);//驱动只需要要加载一次}catch(Exceptione){e.printStackTrace();}}//获取连接publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager.getConnection(url,username,password);}//释放连接publicstaticvoidrelease(Connectionconn,Statementst,ResultSetrs){try{if(conn!=null){conn.close();}if(st!=null){st.close();}if(rs!=null){rs.close();}}catch(Exceptione){e.printStackTrace();}}}使用工具类packagecom.oop.demo;importjava.sql.*;publicclassApplication{publicstaticvoidmain(String[]args)throwsSQLException{Connectionconn=null;语句st=null;结果集rs=null;尝试{conn=JdbcUtils.getConnection();st=conn.createStatement();字符串平方l="INSERTINTOusers(id,name)VALUES(3,'xxx')";inti=st.executeUpdate(sql);if(i>0){System.out.println("插入成功");}}catch(Exceptione){e.printStackTrace();}最后{JdbcUtils.release(conn,st,rs);}}}prepareStatement对象更高效,可以防止Sql注入包com.oop.demo;importjava.sql.*;publicclassApplication{publicstaticvoidmain(String[]args)throwsSQLException{Connectionconn=null;PreparedStatementst=null;结果集rs=null;尝试{conn=JdbcUtils.getConnection();Stringsql="INSERTINTOusers(id,name)VALUES(?,?)";//?placeholderst=conn.prepareStatement(sql);//预编译sqlst.setInt(1,4);st.setString(2,"xxx");//st.setDate(3,newjava.sql.Date(newDate().getTime()));inti=st.executeUpdate();//直接执行if(i>0){System.out.println("插入成功");}}catch(Exceptione){e.printStackTrace();}最后{JdbcUtils.release(conn,st,rs);JDBC操作事务ACID原则:原子性ConsistencyConsistencyIsolationPersistence原子性:要么完整要么不存在一致性:总数不变隔离性:多个进程互不干扰持久性:提交后不可逆,持久化到数据库隔离常见问题:脏读:一个事务读取另一个未提交的事务。不可重复读:在同一个事务中,重复读取表数据,表数据发生变化(不知道用哪个数据)。幻读(phantomreads):在事务中读取了别人插入的数据,导致前后结果不一致(读取和读取更多数据)packagecom.oop.demo;importjava.sql.*;publicclassApplication{publicstaticvoidmain(String[]args)throwsSQLException{Connectionconn=null;PreparedStatementst=null;结果集rs=null;尝试{conn=JdbcUtils.getConnection();//关闭数据库的自动提交功能,事务会自动开启conn.setAutoCommit(false);Stringsql1="UPDATEusersSETname='xxx'WHEREid=1";st=conn.prepareStatement(sql1);st.executeUpdate();Stringsql2="UPDATEusersSETname='yyy'WHEREid=2";st=conn.prepareStatement(sql2);st.executeUpdate();//业务完成,提交事务conn.commit();}catch(Exceptione){try{//失败回滚conn.rollback();}catch(SQLExceptione1){e1.printStackTrace();}e.printStackTrace();}最后{JdbcUtils.release(conn,st,rs);}}}数据库连接池池化技术:预先准备一些资源,请求连接预先准备资源的常用概念:最小连接数,最大连接数,等待超时原则:写连接池,实现DataSource接口开源数据实现:DBCP、C3P0、DruidDBCP需要的jar包:commons-dbsp-1.4.jarcommons-pool-1.6.jar//加载配置文件InputStreamin=JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Propertiesproperties=newProperties();properties.load(in);//创建数据源dataSOurce=BasicDataSSourceFactory.createDataSource(properties);//获取连接publicstaticConnectiongetConnection()throwsSQLException{returndataSource.getConnection();//使用数据源获取连接}C3P0需要使用的jar包:c3p0-0.9.5.5.jarmchange-commons-java-0.2.19.jar/src/c3p0-config.xml...//代码版本dataSource=newComboPooledDataSource();dataSource.setDriverClass();dataSource.setUser();dataSource.setPassword();dataSource.setJdbcUrl();//配置文件dataSource=newComboPooledDataSource("MYSQL");//获取连接publicstaticConnectiongetConnection()throwsSQLException{returndataSource.getConnection();}结论:无论是哪种连接池,DataSource接口都不会变,方法不会变