JDBC

C++【信息学奥赛一本通】题解1003 对齐输出 【题目描述】 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。 这里是引用 【输入】 只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。 这里是引用 【输出】 只有一行,一个整数,即输入的第二个整数。 这里是引用 【输入样例】 123456789 0 -1 这里是引用 【输出样例】 123456789 0 -1 ... 阅读详情

JDBC

 

DAO:数据库访问对象

DTO:数据传输对象

数据库ß---àDAOß---àDTOß---àpage页面

 

对于表进行增加数据的操作步骤:

//1.通过反射加载数据库驱动

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

//2.获得数据库连接,需要三个信息:统一资源定位器:找到要操作的数据库、用户名、密码

Connection conn =DriverManager.getConnection("jdbc:sqlserver://192.168.43.12:1433;database=userdb","sa", "qxh");

//3.操作数据库,通过connection获得加载器,加载sql语句

Statement st =conn.createStatement();

//4.要加载的sql语句

String sql = "insert into student(name,age,sclass,college)values('hebe',22,'java1208','湖大')";

//5.执行sql语句,并返回结果集.

boolean flag = st.execute(sql);

//返回false,表示执行没有错

System.out.println(flag);

//6.关闭连接

conn.close();

 

 

通过Connection获得(预处理)命令执行对象(Statement,PreparedStatement,CallableStatement)

1.  Statement命令可以直接执行完整的sql命令行;

Statement st = conn.createStatement();

St.excute(sql);

2.PreparedStatement支持参数化的sql命令;

    PreparedStatementps = conn.prepareStatement(sql);

    Ps.setString(1,””);

    Ps.excute();

3.CallableStatement支持sql存储过程

String callPCStr= “{call getbookname(?,?)}”;

CallableStatementcs = conn.prepareCall(callPCStr);

Cs.setString(1,””);

//为输出参数注册返回类型

Cs.registerOutParamenter(2,java.sql.Types.VARCHAR);

Cs.excute();

 

二.工厂模型

package com.softeem.factory;

import java.sql.Connection;

import com.softeem.dao.UserDAO;

/**

 * 此工厂是主工厂,负责产生针对不同数据库产品的子工厂

 *@author Administrator

 *

 */

public abstract class DAOFactory

{

       //Sqlserver数据库

       publicstatic final int sql = 1;

      

       //Oracle数据库

       publicstatic final int oracle = 2;

      

       //针对不同的数据类型返回所需要的DAO工厂

       publicstatic DAOFactory getDAOFactory(int db)

       {

              DAOFactoryfactory = null;

              switch(db)

              {

              casesql:

                     factory= new SQLDAOFactory();

                     break;

              caseoracle:

                     factory= new OracleDAOFactory();

                     break;

              default:

                     break;

              }

              returnfactory;

       }

      

       //避免在不同类型的DAO工厂中产生的DAO不一致,所以在主工厂中

       //也对产生的DAO的方式进行统一制定

       publicabstract UserDAO getUserDAO(Connection conn);

      

}

 

package com.softeem.factory;

import java.sql.Connection;

import com.softeem.dao.UserDAO;

public class SQLDAOFactoryextends DAOFactory

{

       @Override

       publicUserDAO getUserDAO(Connection conn)

       {

              //TODO Auto-generated method stub

              UserDAOdao = new UserDAO(conn);

              returndao;

       }

}

 

package com.softeem.factory;

import java.sql.Connection;

import com.softeem.dao.UserDAO;

public classOracleDAOFactory extends DAOFactory

{

       @Override

       publicUserDAO getUserDAO(Connection conn)

       {

              //TODO Auto-generated method stub

              UserDAOdao = new UserDAO(conn);

              returndao;

       }

}

 

 

package com.softeem.factory;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

 

public class ConnectionFactory

{

       //四个常量:驱动,用户名,密码,url。常量的参数必须为大写

       privatestatic final String DRIVER ="com.microsoft.sqlserver.jdbc.SQLServerDriver";

       privatestatic final String USERNAME = "sa";

       privatestatic final String PASSWORD = "qxh";

       privatestatic final String URL = "jdbc:sqlserver://localhost:1433;databasename =userdb";

       //针对ORACLE数据库

       privatestatic final String ORACLEDRIVER ="com.microsoft.sqlserver.jdbc.SQLServerDriver";

       privatestatic final String ORACLEUSERNAME = "sa";

       privatestatic final String ORACLEPASSWORD = "qxh";

       privatestatic final String ORACLEURL ="jdbc:sqlserver://localhost:1433;databasename = userdb";

      

       privatestatic Connection conn;

       publicstatic final int SQL = 1;

       publicstatic final int ORACLE = 2;

       privateint db;

      

       publicConnectionFactory(int db)

       {

              this.db= db;

       }

      

       /**

        * 根据选择的不同的数据库产品来返回连接

        * @param db

        * @return

        * @throws ClassNotFoundException

        * @throws SQLException

        */

       publicstatic Connection getConnection(int db) throws ClassNotFoundException,SQLException

       {

              switch(db)

              {

              caseSQL:

                     Class.forName(DRIVER);

                     conn= DriverManager.getConnection(URL,USERNAME,PASSWORD);

                     break;

              caseORACLE:

                     Class.forName(ORACLEDRIVER);

                     conn= DriverManager.getConnection(ORACLEURL,ORACLEUSERNAME,ORACLEPASSWORD);

                     break;

              default:

                     break;

              }

              returnconn;

       }

}

 

package com.softeem.dao.idao;

import com.softeem.dto.User;

publicinterfaceIUserDAO

{

    publicvoid add(User user);

}

 

 

 

package com.softeem.dao;

 

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;

import com.softeem.dao.idao.IUserDAO;

import com.softeem.dto.User;

import com.sun.rowset.CachedRowSetImpl;

 

public class UserDAOimplements IUserDAO

{

    Connectionconn = null;

   

    publicUserDAO(Connection conn)

    {

       this.conn= conn;

    }

 

    /**

     * 增加用户

     */

    @Override

    publicvoid add(User user)

    {

       //TODO Auto-generated method stub

       Statementstmt = null;

       try

       {

           //创建命令执行对象

           stmt= conn.createStatement();

           Stringsql = "insert into user_tbvalues('"+user.getUsername()+"')";

           //开始执行

           int num = stmt.executeUpdate(sql);

           System.out.println("影响的行数:" + num);

       }catch (Exception e)

       {

           //TODO: handle exception

           e.printStackTrace();

       }finally

       {

           try

           {

              //关闭数据库相关资源

              stmt.close();

              conn.close();

           }catch (SQLException e)

           {

              //TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

//     System.out.println("增加用户");

    }

 

    publicvoid getRs()

    {

       Statementstmt = null;

       ResultSetrs = null;

       try

       {

           //创建命令执行对象

           stmt= conn.createStatement();

           Stringsql = "select * from user_tb";

           //开始执行

//         intnum = stmt.executeUpdate(sql);

//         System.out.println("影响的行数:" + num);

          

           rs= stmt.executeQuery(sql);

           //提前关闭结果集,会导致错误。因为没有存储到数据

           rs.close();

           while(rs.next())

           {

              System.out.println(rs.getString(1));

           }

       }catch (Exception e)

       {

           //TODO: handle exception

           e.printStackTrace();

       }finally

       {

           try

           {

              //关闭数据库相关资源

              stmt.close();

              conn.close();

           }catch (SQLException e)

           {

              //TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

      

    }

   

    publicCachedRowSet getUserRes()

    {

       Statementstmt = null;

       ResultSetrs = null;

       CachedRowSetcs = null;

       try

       {

           //将结果集的游标设置成可以上下滚动的类型,目的主要是让结果集可以指定从某一行开始进行读取

           //ResultSet.CONCUR_READ_ONLY在并发情况下,当前结果集只负责读取数据库中信息,不做其他操作

           stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

           Stringsql = "select * from user_tb";

           rs= stmt.executeQuery(sql);

          

           cs= new CachedRowSetImpl();

           //内存中最多缓存10条数据

           cs.setMaxRows(10);

           //每页显示5条数据

           cs.setPageSize(5);

           //将结果集对象存放到缓存对象中,从数据库中查询到的结果即被放到了缓存结果集中,缓存结果集对象可以在结果集对象关闭的情况下使用

//         cs.populate(rs);

          

           //从结果集中的第二条数据开始取数据放到缓存中

           cs.populate(rs,2);

          

          

           rs.getMetaData();

          

       }catch(Exceptione)

       {

           e.printStackTrace();

           try

           {

              rs.close();

              stmt.close();

              conn.close();

           }catch (Exception e2)

           {

              //TODO: handle exception

              e2.printStackTrace();

           }

       }

       returncs;

    }

}

 

 

 

package com.softeem.dao;

 

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import com.softeem.dto.User;

import com.softeem.factory.ConnectionFactory;

 

/**

 * 动态指定所需要的列有哪些,利用反射在dto中存值,list 存放dto,add添加dto

查询出所有的列所对应的值,与dto中的属性列对应,利用反射,set值到dto中

最后结果list中放的dto

 *@author Administrator

 *

 */

public class ResultList

{

       publicList<User> refOperValue()

       {

              Connectionconn = null;

              Statementstmt = null;

              ResultSetMetaDatarsm = null;

              ResultSetrs = null;

              List<User>userList = null;

              try

              {

                     conn= ConnectionFactory.getConnection(1);

                     stmt= conn.createStatement();

//                   stmt.execute("select* from user_tb");

//                   rs= stmt.getResultSet();

                     rs= stmt.executeQuery("select * from user_tb");

                     rsm= rs.getMetaData();

                     //获得查询表的列大小

                     intcount = rsm.getColumnCount();

                     userList= new ArrayList<User>();

                     //生成一个字段名数组

                     List<String>columnList = new ArrayList<String>();

                     for(inti=1; i<=count; i++)

                     {

                            columnList.add(rsm.getColumnName(i));

                     }

                     //边循环结果集边判断类型,边进行赋值操作

                     while(rs.next())

                     {

                            Useru = new User();

                            for(inti=1; i<=columnList.size(); i++)

                            {

                                   //取值

                                   Objectvalue = rs.getObject(i);

                                   System.out.println("值类型是:" +value.getClass().getSimpleName());

                                   //值取到后取方法

                                   //StringsetMethod = columnList.get(i);

                                   StringsetMethod = "set" + columnList.get(i-1).substring(0,1).toUpperCase()+

                                                 columnList.get(i-1).substring(1,columnList.get(i-1).length());

                                   //System.out.println("set名是:" + setMethod);

                                  

                                   //考虑封装

                                   ClassuserCls = u.getClass();

                                   Methodmethod = userCls.getMethod(setMethod,value.getClass());

                                   method.invoke(u,value);

                            }

                            userList.add(u);

                     }

              }catch (Exception e)

              {

                     //TODO: handle exception

                     e.printStackTrace();

              }finally

              {

                     try

                     {

                            stmt.close();

                            conn.close();

                     }catch (SQLException e)

                     {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                     }

              }

             

              returnuserList;

             

       }

      

       publicstatic void main(String[] args)

       {

              ResultListrl = new ResultList();

              List<User>list = rl.refOperValue();

              System.out.println(list.size());

              for(User object : list)

              {

                     System.out.println(object.getUsername());

              }

       }

}

信息学奥赛一本通答案-1003:对齐输出 1003:对齐输出 【题目描述】 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。 【输入】 只有一行,包含三个整数,整数之间以一个空格分开。 【输出】 只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。 【输入样例】 123456789 0 -1 【输出样例】 123456789||||||||0||||||||-1 注:因文本编辑器原因,无法打出多个空格,这里用一个“|”表示一个空格 【源程序】 #include <cstdio 阅读详情

相关推荐

信息学奥赛一本通题解

@【信息学奥赛一本通】题解+解析 目录TOC 【语言算法基础篇】 题目答案+详解 基础(一) C++语言 第一章 C++语言入门 第二章:顺序结构程序设计 第三章 程序的控制结构 第四章 循环结构的程序设计 第五章 数组 第六章 函数 ...

胖虎很忙 1万+

目录一:信息学奥赛一本通C++语言(1001--1100)

信息学奥赛一本通C++语言——1001:Hello,World! 信息学奥赛一本通C++语言——1002:输出第二个整数 信息学奥赛一本通C++语言——1003:对齐输出 信息学奥赛一本通C++语言——1004:字符三角形 信息学奥赛一本通C++语言——1005:地球人口承载力估计 信息学奥赛一本通C++语言——1006:A+B问题 信息学奥赛一本通C++语言——1007:计算(a+b)×c的值 ...

子航OIer 6816

信息学奥赛一本通——1003:对齐输出

读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。只有一行,包含三个整数,整数之间以一个空格分开。...

蒟蒻の博客 1725

信息学奥赛一本通题解目录(没写完)

信息学奥赛一本通题解目录。

ptyz306的博客 2083

信息学奥赛一本通1003:对齐输出

信息学奥赛一本通1003:对齐输出

cxz0106的博客 1113

信息学奥赛一本通C++语言——1003:对齐输出

【题目描述】 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。 【输入】 只有一行,包含三个整数,整数之间以一个空格分开。 【输出】 只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。 【输入样例】 123456789 0 -1 【输出样例】 123456789 0 -1 代码 #include <cstdio> u...

子航OIer 1304

《信息学奥赛一本通》第一章--C++语言入门--题解

1000:入门测试题目 【题目描述】 求两个整数的和。 【输入】 一行,两个用空格隔开的整数。 【输出】 两个整数的和。 【输入样例】 1 2 【输出样例】 3 参考程序: #include<bits/stdc++.h> using namespace std; int main() { int a,b; cin>>a>&gt...

tobytung的博客 3000

信息学奥赛一本通 (C++)上机练习

@信息学奥赛一本通(C++)第一章 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全...

qq_44598375的博客 1万+

信息学奥赛一本通,题解列表

信息学奥赛一本通

m0_73831564的博客 1685

信息学奥赛一本通——解题目录

信息学奥赛一本通——解题目录

蒟蒻の博客 4722

信息学奥赛基础:掌握C++对齐输出的关键技巧 | OpenJudge NOI 1.1 03实战解析

本文深入解析OpenJudge NOI 1.1 03对齐输出题,这是信息学奥赛入门的关键基础。文章详细对比了C++中cout配合setw()与printf两种实现方案的核心技巧与避坑指南,强调严格遵循输出格式对于OJ评测的重要性,并拓展了其在表格、报表等场景中的实际应用。

weixin_29009881的博客 360

【信息学奥赛一本通】基础(一) C++语言 第一章 C++语言入门总结

【信息学奥赛一本通】基础(一) C++语言 第一章 C++语言入门总结

lljloimjo的博客 604

信息学奥赛一本通(题解目录)

信息学奥赛一本通(题解目录) 记录了我从初学者到逐渐熟悉c++的成长之路 目录信息学奥赛一本通(题解目录)前言一、语言及算法基础篇基础(一) C++语言第一章 C++语言入门第二章 顺序结构程序设计第三章 程序的控制结构第四章 循环结构的程序设计第五章 数 组第六章 函数写在最后 前言 这里记录了信息学奥赛一本通OJ网站所有(除往年真题)题目的题解,可供大家参考.。 一、语言及算法基础篇 基础(一) C++语言 1000:入门测试题目 1001:Hello,World! 1002:输出第二个整

CpythonHume的博客 3237

【 《信息学奥赛一本通》1000,1001,1002,1003,1004,1005题】

作者会陆续出完所有信息学奥赛一本通的习题

QHS_sixteen的博客 881

CSP信息学奥赛知识总结

CSP信息学奥赛

m0_73852519的博客 1675

信息学奥赛一本通(C++版)在线评测系统 - 题解目录

信息学奥赛一本通(C++版)在线评测系统 - 题解目录 一、语言及算法基础篇 第一部分 C++语言 第二部分 基础算法 第三部分 数据结构 二、算法提高篇 第1部分 基础算法(提高篇) 第2部分 字符串算法(提高篇) 第3部分 图论(提高篇) 第4部分 数据结构(提高篇) 第5部分 动态规划(提高篇) 第6部分 数学基础(提高篇) 三、高手训练 第1部分 基础算法(高手训练) 第2部分 字符串算法(高手训练) 第3部分 图论(高手训练) 第4部分 数据结构(高手训练) 第5部分 动态规划(高手训练) 第6

Jerrycyx的博客 2万+

2022年信息学奥赛NOIP CSP-JS注意事项

信息学奥赛

m0_73831564的博客 1049

【信息学奥赛一本通】题解目录

信息学奥赛一本通网站:点击这里 没有账号的可以先注册一个 持续更新中… 【语言及算法基础篇】 第一部分:C++语言 第一章:C++语言入门 入门测试题目(信息学奥赛一本通-1000):点击这里 Hello,World!(信息学奥赛一本通-1001):点击这里 输出第二个整数(信息学奥赛一本通-1002):点击这里 对齐输出(信息学奥赛一本通-1003)点击这里 字符三角形(信息学奥赛一本通-10...

zhaoyipengmzyc的博客 2651
上一篇: sql操作
hxq_java
博客等级 码龄14年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值