时间:2021-07-01 10:21:17 帮助过:2人阅读
- <span style="color: #008000;">//</span><span style="color: #008000;">加载JDBC驱动,通过反射机制加载</span>
- Class.forName("com.mysql.cj.jdbc.Driver"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">连接路径,用于连接数据库</span>
- //String url = "jdbc:mysql://localhost:3306/test"<span style="color: #000000;">;
- </span><span style="color: #008000;">String url = "jdbc:mysql:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false";</span>
- String userName = "LYH"; <span style="color: #008000;">//</span><span style="color: #008000;">默认用户名 </span>
- String userPwd = "SYSTEM"; <span style="color: #008000;">//</span><span style="color: #008000;">密码
- </span><span style="color: #008000;">//</span><span style="color: #008000;">建立连接</span>
- Connection conn =<span style="color: #000000;"> DriverManager.getConnection(url, userName, userPwd);
- 注:
- mySql连接方式:
- jdbc:mysql:</span><span style="color: #008000;">//</span><span style="color: #008000;"><IP地址>:<port端口号>/<dbname相当于SID></span>
- <span style="color: #000000;">
- JDBC连接mysql 5需用com.mysql.jdbc.Driver
- 即:
- Class.forName(</span>"com.mysql.jdbc.Driver"<span style="color: #000000;">);
- url</span>=jdbc:mysql:<span style="color: #008000;">//</span><span style="color: #008000;">localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false</span>
- <span style="color: #008000;">//</span><span style="color: #008000;">加载JDBC驱动,通过反射机制加载</span>
- Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">连接路径,用于连接数据库 tempdb</span>
- String url = "jdbc:sqlserver://localhost:1433;DatabaseName=tempdb"<span style="color: #000000;">;
- String userName </span>= "sa"; <span style="color: #008000;">//</span><span style="color: #008000;">默认用户名 </span>
- String userPwd = "123456"; <span style="color: #008000;">//</span><span style="color: #008000;">密码
- </span><span style="color: #008000;">//</span><span style="color: #008000;">建立连接</span>
- Connection conn = DriverManager.getConnection(url, userName, userPwd);
(1)Statement主要用于执行静态SQL语句(不带参数),即内容固定不变的SQL语句。
(2)Statement每执行一次都要对传入的SQL语句编译一次,效率较差。
- <span style="color: #000000;">创建Statement的方式:
- Connection conn </span>= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "LYH", "SYSTEM"<span style="color: #000000;">);
- Statement state </span>=<span style="color: #000000;"> conn.createStatement();
- </span>1<span style="color: #000000;">、执行DDL语句:
- 格式:
- </span><span style="color: #0000ff;">boolean</span> flag =<span style="color: #000000;"> state.execute(sql);
- </span>2<span style="color: #000000;">、执行DML语句:(返回值为DML影响的数据库中的数据总条数)
- 格式:
- </span><span style="color: #0000ff;">int</span> length =<span style="color: #000000;"> state.executeUpdate(sql);
- </span>3<span style="color: #000000;">、执行DQL语句:(SELECT语句)
- 格式:
- ResultSet rs </span>=<span style="color: #000000;"> state.executeQuery(sql);
- 注:sql语句中不要带分号(;)。</span>
(1) PreparedStatement可用于动态SQL语句,即SQL部分参数改变,其余条件不变。适用于多次执行SQL语句的时候,以提高效率。
(2)PreparedStatement是一个接口,继承Statement。但其execute等三个方法不需要参数了。
(3)PreparedStatement实例包含已编译的SQL语句。以符号(?)作为占位符,?表示一个任何类型的参数。
- <span style="color: #000000;">创建PreparedStatement的方式:
- Connection conn </span>= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "LYH", "SYSTEM"<span style="color: #000000;">);
- prepareStatement pstate </span>=<span style="color: #000000;"> conn.createStatement();
- sql </span>= "select * from where id = ?"<span style="color: #000000;">;
- pstate </span>= conn.prepareStatement(sql); <span style="color: #008000;">//</span><span style="color: #008000;">预编译sql语句</span>
- <span style="color: #000000;">
- 设定参数
- pstate.setString(</span>1, "12345"<span style="color: #000000;">);
- </span>1<span style="color: #000000;">、执行DDL语句:
- 格式:
- </span><span style="color: #0000ff;">boolean</span> flag =<span style="color: #000000;"> pstate.execute();
- </span>2<span style="color: #000000;">、执行DML语句:(返回值为DML影响的数据库中的数据总条数)
- 格式:
- </span><span style="color: #0000ff;">int</span> length =<span style="color: #000000;"> pstate.executeUpdate();
- </span>3<span style="color: #000000;">、执行DQL语句:(SELECT语句)
- 格式:
- ResultSet rs </span>=<span style="color: #000000;"> pstate.executeQuery();
- 注:sql语句中不要带分号(;)。</span>
提供了用来调用数据库存储过程的接口,如果有输出参数需要注册,则说明是输出参数。其调用存储过程有两种方式:带结果参数(一种输出参数,是存储过程的返回值) 与 不带结果参数。CallableStatement继承了PreparedStatement处理输入参数的方法,且还增加了调用数据库的存储过程和函数以及设置输出类型参数的功能。
ResultSet表示的是DQL语句的结果集,但其结果集仍在数据库上(每次只取一定数量的数据放入内存,具体数量由不同的数据库驱动决定),若想取数据,需使用next方法每次取一条,其是与数据库一直连接的,当查询结束后,最好将其关闭,要不然可能会抛出异常。
- <span style="color: #000000;">ResultSet获取结果集
- 格式:
- ResultSet Statement.executeQuery(sql);
- ResultSet PreparedStatement.executeQuery();
- ResultSetMetaData获取结果集的元数据,元数据指数据的数据,用于描述数据的属性、信息。
- 格式:
- ResultSetMetaData ResultSet.getMetaData();</span>
(1)效率更高。
使用PreparedStatement对象执行SQL语句时,命令会被数据库进行编译和解析,并将其放在命令缓冲区。每次执行PreparedStatement对象时,由于在缓冲区可以找到预编译命令,虽然会被解析一次,但是不会被再次编译,可以重复使用,从而提高了效率。
(2)代码可读性与可维护性更高。
由于PreparedStatement使用setInt()或者setString()方法为参数进行赋值,而Statement需要在SQL语句中写出,相比之下PreparedStatement更加清晰。
(3)安全性更好。
使用PreparedStatement可以有效防止SQL注入攻击。所谓SQL注入攻击,通常指的是将SQL语句通过插入到Web表单提交输入域名或者查询页面请求的查询字符串,最终达到欺骗服务器并且执行恶意SQL命令的目的。由于Statement是将输入的字符串当成SQL语句进行拼接,再进行编译,所以其不能防范SQL注入攻击,而PreparedStatement是将输入的字符串当成一个值来处理,避免了SQL注入攻击的问题。
- <span style="color: #000000;">【sql注入举例:】
- SQL语句为:
- String </span><span style="color: #ff00ff;">str</span> <span style="color: #808080;">=</span> " <span style="color: #0000ff;">SELECT</span> <span style="color: #808080;">*</span>
- <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> emp
- </span><span style="color: #0000ff;">WHERE</span> name <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">"
- + name + "</span><span style="color: #ff0000;">‘</span> <span style="color: #808080;">AND</span> password <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">"
- + password</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">";
- 即相当于SQL语句
- </span><span style="color: #0000ff;">SELECT</span> <span style="color: #808080;">*</span>
- <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> emp
- </span><span style="color: #0000ff;">WHERE</span> name <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">?</span><span style="color: #ff0000;">‘</span> <span style="color: #808080;">AND</span> password <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">?</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">
- 如果输入name </span><span style="color: #808080;">=</span> "aa", password <span style="color: #808080;">=</span> "bb<span style="color: #ff0000;">‘</span><span style="color: #ff0000;"> OR </span><span style="color: #ff0000;">‘</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;"> = </span><span style="color: #ff0000;">‘</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">"
- 那么相当于SQL语句:
- </span><span style="color: #0000ff;">SELECT</span> <span style="color: #808080;">*</span>
- <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> emp
- </span><span style="color: #0000ff;">WHERE</span> name <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">aa</span><span style="color: #ff0000;">‘</span> <span style="color: #808080;">AND</span> password <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">bb</span><span style="color: #ff0000;">‘</span> <span style="color: #808080;">OR</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span> <span style="color: #808080;">=</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">1</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">
- 那么不管输入是否正确,此WHERE条件均是成立的。即SQL注入攻击成功。</span>
连接池是管理与创建数据库连接的缓冲池技术,将连接提前准备好,方便使用。连接池也是一个接口,具体由不同厂商进行实现。
一次数据库连接对应着一次物理连接,而每次操作数据都要打开、关闭这个连接,会消耗大量资源。
系统启动并连接数据库后,会自动创建一定数目的连接,并将这些连接组成一个连接池。每次连接时,会从连接池中取出一个连接,使用完后,将该连接放回连接池(注:此处不是关闭连接)。这样可以使连接重复使用,提高程序运行效率。
(1)系统启动时,连接到数据库后,会初始化创建一定数目的连接,并将其组成一个池。
(2)每次连接时,从池内取出已有连接,使用完后,将连接归还(不是关闭连接)给连接池。
(3)若池内无连接或达到最小连接数时,按增量增加新连接。
(4)保持最小连接数,其有动态检查、静态检查的方法。
动态检查:定时检查池,若数量小于最小连接数,则补充连接。
静态检查:当连接不足时,才检查数量是否小于最小连接数。
使用连接池,需要导包。
- commons-dbcp-1.4<span style="color: #000000;">.jar ;用于连接池的实现
- commons</span>-pool-1.5<span style="color: #000000;">.jar ;连接池实现的依赖库
- commons</span>-collections4-4.0.jar ;
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.DriverManager;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.ResultSet;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Statement;
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 使用JDBC连接Oracle数据库
- * 涉及I/O操作,需要捕获异常,可以写在try-catch中。
- *
- * 如果抛出异常:java.lang.ClassNotFoundException,
- * 那么表示未导入包,比如:Oracle 11g JDBC_ojdbc6.jar。
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">1、加载驱动 </span>
- Class.forName("oracle.jdbc.driver.OracleDriver"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">建立连接,并返回Connection连接</span>
- Connection conn =<span style="color: #000000;"> DriverManager.getConnection(
- </span>"jdbc:oracle:thin:@localhost:1521:xe", "LYH", "SYSTEM"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">2、创建Statement对象</span>
- Statement state =<span style="color: #000000;"> conn.createStatement();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">定义sql语句</span>
- String sql = "SELECT * FROM emp"<span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">执行SQL查询语句,结果集由ResultSet保存</span>
- ResultSet rs =<span style="color: #000000;"> state.executeQuery(sql);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">循环输出结果集</span>
- <span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()) {
- </span><span style="color: #0000ff;">int</span> id = rs.getInt("id"<span style="color: #000000;">);
- String name </span>= rs.getString("name"<span style="color: #000000;">);
- </span><span style="color: #0000ff;">double</span> salary = rs.getDouble("salary"<span style="color: #000000;">);
- System.out.println(</span>"id = " + id + ",name = " + name + ",salary = " +<span style="color: #000000;"> salary);
- }
- rs.close();</span><span style="color: #008000;">//</span><span style="color: #008000;">关闭SQL连接</span>
- conn.close();<span style="color: #008000;">//</span><span style="color: #008000;">关闭数据库连接</span>
- }<span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e) {
- e.printStackTrace();
- }
- }
- }</span>
通过修改配置文件来实现代码功能的改变,可以不用修改class文件,便于开发。
- <span style="color: #000000;">【格式:】
- string1 </span>=<span style="color: #000000;"> string2 # 尾部没有分号(;)
- # 表示注释
- java.util.Properties;该类用于读取properties文件,并以Map集合的形式存储文件内容。
- 【读取文件步骤:】
- </span>1<span style="color: #000000;">、先使用InputStream is(或其他输入流)读取文件。
- </span>2<span style="color: #000000;">、再使用load(is) 加载文件。
- </span>3<span style="color: #000000;">、使用getProperty(String key),通过等号左边(key)值,获取等号右边(value)值。
- </span>4、有一个线程ThreadLocal<Connection>,其内部操作的为一个Map集合,相当于<Thread, Connection><span style="color: #000000;">,将线程作为key。
- ThreadLocal有个set方法,会将当前线程作为key,并将给定的值放入Map中,这样便于知道具体某个值是哪个线程所调用的,方便操作。
- 【举例:】
- </span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个连接数据库,并可以关闭数据库的类。
- </span><span style="color: #008000;">//</span><span style="color: #008000;">DefineConnection.class</span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStream;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.DriverManager;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Properties;
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 自定义一个连接数据库的类,
- * 写在Static块中,用于从properties文件中获取值,并加载驱动。
- *
- * 声明一个连接数据库方法,一个关闭数据库方法。
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DefineConnection {
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String driver; <span style="color: #008000;">//</span><span style="color: #008000;">保存驱动</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String url; <span style="color: #008000;">//</span><span style="color: #008000;">保存路径</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String user; <span style="color: #008000;">//</span><span style="color: #008000;">保存数据库(用户)名</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String password; <span style="color: #008000;">//</span><span style="color: #008000;">保存密码(口令)</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> ThreadLocal<Connection> tl = <span style="color: #0000ff;">new</span> ThreadLocal<Connection>(); <span style="color: #008000;">//</span><span style="color: #008000;">用于管理不同的线程获取的连接。</span>
- <span style="color: #0000ff;">static</span><span style="color: #000000;"> {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">实例化一个Properties类,用于读取properties文件</span>
- Properties prop = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Properties();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">通过相对路径获取文件</span>
- InputStream is = DefineConnection.<span style="color: #0000ff;">class</span>.getClassLoader().getResourceAsStream("config.properties"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">加载文件,并以类似Map的形式保存</span>
- <span style="color: #000000;"> prop.load(is);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭输入流</span>
- <span style="color: #000000;"> is.close();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">从文件中将等号左边作为Key,获取等号右边的值</span>
- driver = prop.getProperty("driver"<span style="color: #000000;">);
- url </span>= prop.getProperty("url"<span style="color: #000000;">);
- user </span>= prop.getProperty("user"<span style="color: #000000;">);
- password </span>= prop.getProperty("password"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">加载驱动</span>
- <span style="color: #000000;"> Class.forName(driver);
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 用于连接数据库
- * </span><span style="color: #808080;">@return</span><span style="color: #008000;">
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> Connection getConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- Connection conn </span>=<span style="color: #000000;"> DriverManager.getConnection(url, user, password);
- tl.set(conn);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> conn;
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span> e; <span style="color: #008000;">//</span><span style="color: #008000;">通知调用者,调用出错</span>
- <span style="color: #000000;"> }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 用于关闭数据库
- * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> conn
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> closeConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">
- * 通过ThreadLocal指定的线程,获取指定的连接,并将其断开。
- * 使用ThreadLocal可以不给方法加指定参数,就能获取该值。
- * 适用于多个线程混合调用,获取具体值的时候。
- </span><span style="color: #008000;">*/</span><span style="color: #000000;">
- Connection conn </span>=<span style="color: #000000;"> tl.get();
- </span><span style="color: #0000ff;">if</span>(conn != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
- conn.close();
- tl.remove();
- }
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> e;
- }
- }
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个测试类:
- </span><span style="color: #008000;">//</span><span style="color: #008000;">Test.class</span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.ResultSet;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Statement;
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">获取连接</span>
- Connection conn =<span style="color: #000000;"> DefineConnection.getConnection();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">获取Statement对象</span>
- Statement state =<span style="color: #000000;"> conn.createStatement();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">定义SQL语句</span>
- String sql = "SELECT * FROM emp"<span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">执行SQL语句,得结果集</span>
- ResultSet rs =<span style="color: #000000;"> state.executeQuery(sql);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">遍历结果集</span>
- <span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()) {
- </span><span style="color: #0000ff;">int</span> id = rs.getInt("id"<span style="color: #000000;">);
- String name </span>= rs.getString("name"<span style="color: #000000;">);
- </span><span style="color: #0000ff;">double</span> salary = rs.getDouble("salary"<span style="color: #000000;">);
- System.out.println(</span>"id = " + id + ", name = " + name + ", salary = " +<span style="color: #000000;"> salary);
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭SQL连接</span>
- <span style="color: #000000;"> rs.close();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭数据库连接</span>
- <span style="color: #000000;"> DefineConnection.closeConnection();
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- }</span>
- <span style="color: #008000;">//</span><span style="color: #008000;">config.properties
- </span><span style="color: #008000;">//</span><span style="color: #008000;">配置文件,用于存储数据库的一些信息</span>
- driver=<span style="color: #000000;">oracle.jdbc.driver.OracleDriver
- user</span>=<span style="color: #000000;">LYH
- password</span>=<span style="color: #000000;">SYSTEM
- url</span>=jdbc:oracle:thin:@localhost:1521<span style="color: #000000;">:xe
- max</span>=30<span style="color: #000000;">
- initialsize</span>=10
- <span style="color: #008000;">//</span><span style="color: #008000;">自定义一个类,定义一个数据库连接池,用于连接数据库.
- </span><span style="color: #008000;">//</span><span style="color: #008000;">DefineConnection.class </span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStream;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Properties;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.apache.commons.dbcp.BasicDataSource;
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 自定义一个数据库连接池,并使用其连接数据库
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DefineConnection {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">声明连接池</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> BasicDataSource dbs;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">声明线程</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> ThreadLocal<Connection> tl = <span style="color: #0000ff;">new</span> ThreadLocal<Connection><span style="color: #000000;">();;
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">实例化一个Properties类</span>
- Properties prop = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Properties();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">读取一个类</span>
- InputStream is = DefineConnection.<span style="color: #0000ff;">class</span>.getClassLoader().getResourceAsStream("config.properties"<span style="color: #000000;">);
- prop.load(is);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">初始化连接池</span>
- dbs = <span style="color: #0000ff;">new</span><span style="color: #000000;"> BasicDataSource();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置驱动</span>
- dbs.setDriverClassName(prop.getProperty("driver"<span style="color: #000000;">));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置连接路径</span>
- dbs.setUrl(prop.getProperty("url"<span style="color: #000000;">));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置数据库(用户)名</span>
- dbs.setUsername(prop.getProperty("user"<span style="color: #000000;">));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置密码(口令)</span>
- dbs.setPassword(prop.getProperty("password"<span style="color: #000000;">));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置连接最大值</span>
- dbs.setMaxActive(Integer.parseInt(prop.getProperty("max"<span style="color: #000000;">)));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">设置初始连接数</span>
- dbs.setInitialSize(Integer.parseInt(prop.getProperty("initialsize"<span style="color: #000000;">)));
- is.close();
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 使用连接池连接数据库
- * </span><span style="color: #808080;">@return</span><span style="color: #008000;">
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> Connection getConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">连接数据库</span>
- Connection conn =<span style="color: #000000;"> dbs.getConnection();
- tl.set(conn);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> conn;
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> e;
- }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 返回数据库连接进连接池
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> closeConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- Connection conn </span>=<span style="color: #000000;"> tl.get();
- </span><span style="color: #0000ff;">if</span>(conn != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
- conn.close();</span><span style="color: #008000;">//</span><span style="color: #008000;">归还连接给连接池,并关闭连接</span>
- tl.remove();<span style="color: #008000;">//</span><span style="color: #008000;">删除不需要的线程</span>
- <span style="color: #000000;"> }
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> e;
- }
- }
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个测试类,使用自定义数据库连接类,连接数据库进行测试
- </span><span style="color: #008000;">//</span><span style="color: #008000;">Test.class;</span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.ResultSet;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Statement;
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- Connection conn </span>=<span style="color: #000000;"> DefineConnection.getConnection();
- Statement state </span>=<span style="color: #000000;"> conn.createStatement();
- String sql </span>= "SELECT id, name FROM emp"<span style="color: #000000;">;
- ResultSet rs </span>=<span style="color: #000000;"> state.executeQuery(sql);
- </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()) {
- </span><span style="color: #0000ff;">int</span> id = rs.getInt("id"<span style="color: #000000;">);
- String name </span>= rs.getString("name"<span style="color: #000000;">);
- System.out.println(</span>"id = " + id + ", name = " +<span style="color: #000000;"> name);
- }
- rs.close();
- DefineConnection.closeConnection();
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- }</span>
为了解决多个线程请求相同数据的情况,事务间通常用锁进行隔离,从而衍生出事务隔离级别。事务隔离级别越高,避免冲突的操作越繁琐。可以通过Connection对象的setTransactionLevel()方法来设置隔离级别,通过conn.getTransactionLevel()方法确定当前事务级别。
(1)读“脏”数据:指一个事务读取了另一个事务尚未提交的数据,即读取到无效数据。比如:A与B事务并发执行,事务A进行更新操作后,B读取A尚未提交的数据,此时A由于某原因进行回滚,那么此时B读到的数据即为无效的脏数据。
(2)不可重复读:指一个事务的操作导致另一个事务前后两次读取的数据不一致。比如:事务A与B并发执行,某时刻事务A更新了事务B读取的数据,当B再次读取数据时,会得到不同的数据。
(3)虚读:指一个事务的操作导致另一个事务前后两次查询的数据量不同。比如:事务A与B并发执行,某时刻事务A删除或增加了事务B所查询的表的记录,那么当事务B再次查询该表时,会得到不存在或者缺少的记录。
(1)TRANSACTION_NONE_JOB(transaction_none_job):不支持事务。
(2)TRANSACTION_READ_UNCOMMITTED(transaction_read_uncommitted):未提交的读,说明此时一个事务未提交前,可以看到另外一个事务的变化。允许 读“脏”数据,不可重复读,虚读。
(3)TRANSACTION_READ_COMMITTED(transaction_read_committed):已提交的读,此时不能读取未提交的数据(即不能读脏数据),但仍允许不可重复读,虚读。
(4)TRANSACTION_REPEATABLE_READ(transaction_repeatable_read):可重复读,此时读取相同数据不会失败,但仍允许虚读。
(5)TRANSACTION_SERIALIZABLE(transaction_serializable):可序列化,最高事务隔离级别。防止读脏数据、不可重复读、虚读。
(1)批处理:将一组发送到数据库的语句(多条语句)作为一个单元处理。
(2)批处理降低了应用程序和数据库间的相互调用。
(3)相比单个SQL语句处理,批处理更加高效。
(4)批处理一般用于DML操作。
- <span style="color: #000000;">Statement方法:
- Statement.addBatch(String sql);将多条sql语句添加到Statement对象的SQL语句列表中。
- PreparedStatement方法:
- PreparedStatement.addBatch();将多条预编译sql语句添加到PreparedStatement对象的SQL语句列表中。
- </span><span style="color: #0000ff;">int</span><span style="color: #000000;">[] executeBatch();返回值为每一条语句影响的数据量。
- 将Statement对象或PreparedStatement对象SQL语句列表中的所有SQL语句发给数据库进行处理。
- clearBatch()
- 清空当前SQL语句列表。</span>
(1)第一种机制:
每次只向数据库中请求一页的数据量,内存压力小,适合大数据量的数据表。
(2)第二种机制:(基于缓存的分页技术,又称假分页)
第一次一次性将数据全部取出到缓存,根据用户输入的页数(page)和每页记录数(pagesize)来计算哪些数据显示,将可滚动结果集的指针移到指定位置。只访问数据库一次,适合小数据量。
- <span style="color: #000000;">MySql的分页实现:
- SELECT </span>*<span style="color: #000000;">
- FROM emp
- LIMIT begin(从第几条开始), pagesize(每页条数);
- Oracle分页实现:
- SELECT </span>*<span style="color: #000000;">
- FROM(
- SELECT ROWNUM rn, t.</span>*<span style="color: #000000;">
- FROM(
- SELECT </span>*<span style="color: #000000;">
- FROM tableName
- ORDER BY colName
- ) t
- )
- WHERE rn BETWEEN </span>? AND ?<span style="color: #000000;">
- 【举例:】
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.PreparedStatement;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.ResultSet;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Scanner;
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Page {
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
- Scanner scan </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Scanner(System.in);
- System.out.println(</span>"请输入要查看的表名:"<span style="color: #000000;">);
- String tableName </span>=<span style="color: #000000;"> scan.nextLine().trim();
- System.out.println(</span>"请输入一页显示的页数:"<span style="color: #000000;">);
- </span><span style="color: #0000ff;">int</span> pagesize =<span style="color: #000000;"> Integer.parseInt(scan.nextLine().trim());
- System.out.println(</span>"请输入查看的页数:"<span style="color: #000000;">);
- </span><span style="color: #0000ff;">int</span> page =<span style="color: #000000;"> Integer.parseInt(scan.nextLine().trim());
- System.out.println(</span>"请输入排序的列名:"<span style="color: #000000;">);
- String colName </span>=<span style="color: #000000;"> scan.nextLine().trim();
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- Connection conn </span>=<span style="color: #000000;"> DefineConnection.getConnection();
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">
- * 分页步骤:
- * 1、排序。
- * 2、编号。
- * 3、取范围。
- * SELECT * FROM(
- * SELECT ROWNUM rn, t.* FROM(
- * SELECT * FROM tableName ORDER BY colName
- * ) t
- * )
- * WHERE rn BETWEEN ? AND ?
- </span><span style="color: #008000;">*/</span><span style="color: #000000;">
- String sql </span>= "SELECT * FROM( "
- + "SELECT ROWNUM rn, t.* FROM( "
- + "SELECT * FROM "+<span style="color: #000000;">tableName
- </span>+ " ORDER BY "+colName+" "
- + ") t "
- + ") "
- + "WHERE rn BETWEEN ? AND ?"<span style="color: #000000;">;
- PreparedStatement ps </span>=<span style="color: #000000;"> conn.prepareStatement(sql);
- </span><span style="color: #0000ff;">int</span> start = (page-1)*pagesize + 1<span style="color: #000000;">;
- </span><span style="color: #0000ff;">int</span> end = page*<span style="color: #000000;">pagesize;
- ps.setInt(</span>1<span style="color: #000000;">, start);
- ps.setInt(</span>2<span style="color: #000000;">, end);
- ResultSet rs </span>=<span style="color: #000000;"> ps.executeQuery();
- </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(rs.next()) {
- </span><span style="color: #0000ff;">int</span> rw = rs.getInt(1<span style="color: #000000;">);
- </span><span style="color: #0000ff;">int</span> id = rs.getInt(2<span style="color: #000000;">);
- String name </span>= rs.getString(3<span style="color: #000000;">);
- System.out.println(</span>"rw = "+rw +", id = " + id + ", name =" +<span style="color: #000000;">name);
- }
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }</span><span style="color: #0000ff;">finally</span><span style="color: #000000;"> {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- DefineConnection.closeConnection();
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }</span>
(1)PreparedStatement支持一个方法,可以在执行插入操作后,获取该语句在数据库表中产生记录中的每个字段的值。因此,每次向表中插入数据时,可以获取该主键作为外键插入,而不用单独为获取主键进行一次查询。
(2)用法:
创建PreparedStatement,可以使用Connection重载方法,第二个参数要求传入一个字符串数组,用来指定当通过ps执行插入操作后,记录想获取的字段所在的值。
- PreparedStatement ps = conn.prepareStatement(sql, <span style="color: #0000ff;">new</span> String[]{"id", "phone"<span style="color: #000000;">});
- ResultSet rs </span>= ps.getGeneratedKeys();<span style="color: #008000;">//</span><span style="color: #008000;">获取插入记录时想返回的字段值。</span>
- <span style="color: #0000ff;">if</span><span style="color: #000000;">(rs.next()){
- </span><span style="color: #0000ff;">int</span> id = rs.getInt("id"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">也可以写成int id = rs.getInt(1);</span>
- String phone = rs.getString("phone"<span style="color: #000000;">);
- }</span>
JDBC提供getString(), getInt(), getData()等方法从ResultSet中获取数据,这些方法适用于数据量小且不考虑性能的情况。由于这些方法都是一次性将数据读取到内存中,然后再从内存中读取数据,如果数据量太大,可能造成写入内存缓慢甚至不能完全写入,这时将会抛出异常(以Oracle为例,ORA-01000)。
getObject()可以解决上面问题,其不会将数据一次性读取到内存中,每次调用均会到数据库中获取数据,使用此方法不会因数据量过大而报错。
(1)事务:指的是数据库一个单独执行的单元(一条或多条SQL语句组成的不可分割的单元),要么完全执行,要么不执行。
(2)JDBC中一般采用commit()(用于提交) 和 rollback()(用于回滚)方法用来结束事务。位于java.sql.Connection类中。一般事务默认自动提交,即操作成功就提交,操作失败就回滚。
(3)可以通过调用setAutoCommit(false)方法来禁止自动提交,此时可以操作多个SQL语句后再提交,可在try-catch中调用rollback()方法进行事务回滚。此方法可以保持对数据库多次操作后仍能保持数据一致性。
(1)JDO指Java Data Object(Java数据对象),用于存取某种数据仓库中的对象的标准化API,从而使开发人员能够间接地访问数据库。
(2)JDO是JDBC的一个补充,提供了透明的对象存储,即开发人员不需要考虑存储数据对象的额外代码(由数据库开发商解决),只需考虑业务逻辑。
(3)JDO比JDBC更加灵活、通用,提供了任何底层数据的存储功能,可移植性更强。
(1)DAO(Data Access Object),指数据访问对象。其方法一般不为静态方法。
(2)建立在数据库和业务层之间,封装所有对数据库的访问。通过DAO将java对象转为数据库数据,或将数据库数据转为java对象。
(3)目的:将数据访问业务与业务逻辑分开。操作数据库变成面向对象化(Hibernate精髓)。
(4)DAO封装(面向接口编程):将所有对数据源的访问操作抽象到一个公共API中。先建立一个接口,并在接口中定义应用程序会用到的所有事务方法。再建立接口的实现类,实现接口对应的所有方法,与数据库进行交互。则在应用程序中,需要进行与数据源交互时,直接使用DAO接口,不用涉及任何数据库的具体操作。
即DAO包括:一个DAO工厂类,一个DAO接口,一个实现DAO接口的具体类,数据传递对象。
(5)DAO层需要定义对数据库中表的访问。对象关系映射(ORM,Object Relation Mapping)描述对象和数据表间的映射,将java程序中的对象对应到关系数据库的表中。
即表与类(实体类)对应,表中字段与类的属性对应,记录与对象对应。
实体类:用于描述数据库中的一张表。
- <span style="color: #008000;">//</span><span style="color: #008000;">自定义数据库连接类:
- </span><span style="color: #008000;">//</span><span style="color: #008000;">DefineConnection.class
- </span><span style="color: #008000;">//</span><span style="color: #008000;">package DAO;</span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStream;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.DriverManager;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Properties;
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 自定义一个连接数据库的类,
- * 写在Static块中,用于从properties文件中获取值,并加载驱动。
- *
- * 声明一个连接数据库方法,一个关闭数据库方法。
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> DefineConnection {
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String driver; <span style="color: #008000;">//</span><span style="color: #008000;">保存驱动</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String url; <span style="color: #008000;">//</span><span style="color: #008000;">保存路径</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String user; <span style="color: #008000;">//</span><span style="color: #008000;">保存数据库(用户)名</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> String password; <span style="color: #008000;">//</span><span style="color: #008000;">保存密码(口令)</span>
- <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> ThreadLocal<Connection> tl = <span style="color: #0000ff;">new</span> ThreadLocal<Connection>(); <span style="color: #008000;">//</span><span style="color: #008000;">用于管理不同的线程获取的连接。</span>
- <span style="color: #0000ff;">static</span><span style="color: #000000;"> {
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">//</span><span style="color: #008000;">实例化一个Properties类,用于读取properties文件</span>
- Properties prop = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Properties();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">通过相对路径获取文件</span>
- InputStream is = DefineConnection.<span style="color: #0000ff;">class</span>.getClassLoader().getResourceAsStream("config.properties"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">加载文件,并以类似Map的形式保存</span>
- <span style="color: #000000;"> prop.load(is);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭输入流</span>
- <span style="color: #000000;"> is.close();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">从文件中将等号左边作为Key,获取等号右边的值</span>
- driver = prop.getProperty("driver"<span style="color: #000000;">);
- url </span>= prop.getProperty("url"<span style="color: #000000;">);
- user </span>= prop.getProperty("user"<span style="color: #000000;">);
- password </span>= prop.getProperty("password"<span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">加载驱动</span>
- <span style="color: #000000;"> Class.forName(driver);
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 用于连接数据库
- * </span><span style="color: #808080;">@return</span><span style="color: #008000;">
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> Connection getConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- Connection conn </span>=<span style="color: #000000;"> DriverManager.getConnection(url, user, password);
- tl.set(conn);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> conn;
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span> e; <span style="color: #008000;">//</span><span style="color: #008000;">通知调用者,调用出错</span>
- <span style="color: #000000;"> }
- }
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * 用于关闭数据库
- * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> conn
- * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> Exception
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> closeConnection() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{
- </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">
- * 通过ThreadLocal指定的线程,获取指定的连接,并将其断开。
- * 使用ThreadLocal可以不给方法加指定参数,就能获取该值。
- * 适用于多个线程混合调用,获取具体值的时候。
- </span><span style="color: #008000;">*/</span><span style="color: #000000;">
- Connection conn </span>=<span style="color: #000000;"> tl.get();
- </span><span style="color: #0000ff;">if</span>(conn != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 恢复连接为自动提交事务,</span>
- conn.setAutoCommit(<span style="color: #0000ff;">true</span><span style="color: #000000;">);
- conn.close();
- tl.remove();
- }
- } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
- e.printStackTrace();
- </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> e;
- }
- }
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">实体类:用于描述数据库中的user1表。
- </span><span style="color: #008000;">//</span><span style="color: #008000;">User1.class:
- </span><span style="color: #008000;">//</span><span style="color: #008000;">package DAO;</span>
- <span style="color: #008000;">/**</span><span style="color: #008000;">
- * 实体类,用于表示数据库的一张表,
- * 例如:
- * 实体类User1,用于表示数据库中的user1表
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> User1 {
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> id;
- </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;
- </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String password;
- </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> money;
- </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String email;
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getId() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> id;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setId(<span style="color: #0000ff;">int</span><span style="color: #000000;"> id) {
- </span><span style="color: #0000ff;">this</span>.id =<span style="color: #000000;"> id;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
- </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getPassword() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> password;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setPassword(String password) {
- </span><span style="color: #0000ff;">this</span>.password =<span style="color: #000000;"> password;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getMoney() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> money;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setMoney(<span style="color: #0000ff;">int</span><span style="color: #000000;"> money) {
- </span><span style="color: #0000ff;">this</span>.money =<span style="color: #000000;"> money;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getEmail() {
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> email;
- }
- </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setEmail(String email) {
- </span><span style="color: #0000ff;">this</span>.email =<span style="color: #000000;"> email;
- }
- </span><span style="color: #0000ff;">public</span> User1(<span style="color: #0000ff;">int</span> id, String name, String password, <span style="color: #0000ff;">int</span><span style="color: #000000;"> money, String email) {
- </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
- </span><span style="color: #0000ff;">this</span>.id =<span style="color: #000000;"> id;
- </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
- </span><span style="color: #0000ff;">this</span>.password =<span style="color: #000000;"> password;
- </span><span style="color: #0000ff;">this</span>.money =<span style="color: #000000;"> money;
- </span><span style="color: #0000ff;">this</span>.email =<span style="color: #000000;"> email;
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> User1() {
- }
- </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String toString() {
- </span><span style="color: #0000ff;">return</span> "id=" + id + ", name=" + name + ", password=" + password + ", money=" + money + ", email=" +<span style="color: #000000;"> email;
- }
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">DAO层,用于将数据库中的数据与java类进行相互转换。
- </span><span style="color: #008000;">//</span><span style="color: #008000;">User1DAO.class
- </span><span style="color: #008000;">//</span><span style="color: #008000;">package DAO;</span>
- <span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Connection;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.PreparedStatement;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.ResultSet;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.sql.Statement;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.ArrayList;
- </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.List;
- </span><span style="color: #008000;">/**</span><span style="color: #008000;">
- * User1DAO,
- * 用于操作数据库user1表的DAO
- *
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">public</span> <span styl="" <="" div="">
- <div class="">
- <ul class="m-news-opt fix">
- <li class="opt-item">
- <a href="/sql_question-399035.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">MySQL优化秘籍</p></a>
- </li>
- <li class="opt-item ta-r">
- <a href="/sql_question-399037.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">简书全站爬取 mysql异步保存</p></a>
- </li>
- </ul>
- </div>
- </span>