编程杂谈

说明对JDBC进行简单的封装,方便使用完整代码:https://pan.bigdataboy.cn/#/s/nMC0数据库数据创表DROPTABLEIFEXISTSuser;CREATETABLEuser(idBIGINT(20)NOTNULLauto_incrementCOMMENT'主键ID',nameVARCHAR(30)NULLDEFAULTNULLCOMMENT'姓名',ageINT(11)NULLDEFAULTNULLCOMMENT'年龄',emailVARCHAR(50)NULLDEFAULTNULLCOMMENT'邮箱',PRIMARYKEY(id));加入数据INSERTINTOuser(id,name,age,email)VALUES(1,'Jone',18,'test1@bigdataboy.com'),(2,'Jack',20,'test2@bigdataboy.com'),(3,'Tom',28,'test3@bigdataboy.com'),(4,'Sandy',21,'test4@bigdataboy.com'),(5,'Billie',24,'test5@bigdataboy.com');构建目录工具类连接工具类,封装连接对象,方便获取连接packagecn.bigdataboy.util;importjava.sql.PreparedStatement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassDBConnectionUtil{//创建连接参数privatestaticStringdriver="com.mysql.jdbc.Driver";privatestaticStringurl="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";privatestaticStringusername="";privatestaticStringpassword="";//获取连接对象publicstaticConnectiongetConnection(){Connectionconn=null;//获取连接try{//加载驱动Class.forName(driver);conn=DriverManager.getConnection(url,username,password);}catch(SQLExceptionthrowables){throwables.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}returnconn;}//关闭全部publicstaticvoidcloseAll(ResultSetrs,PreparedStatementps,Connectionconn){if(rs!=null){try{rs.close();}catch(SQLExceptionthrowables){throwables.printStackTrace();}};if(ps!=null){try{ps.close();}catch(SQLExceptionthrowables){throwables.printStackTrace();}};if(conn!=null){try{conn.close();}catch(SQLExceptionthrowables){throwables.printStackTrace();}}}}测试连接工具类publicstaticvoidmain(String[]args){Connectionconnection=getConnection();System.out.println(connection);}用户实体类用户实体类的字段需要与数据表字段对应packagecn.bigdataboy.entity;publicclassUser{privateintid;privateStringname;privateintage;privateStringemail;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}}定义dao层接口dao层主要功能是提供对数据库数据的操作类packagecn.bigdataboy.dao;importcn.bigdataboy.entity.User;publicinterfaceUserDao{//通过id查询用户UsergetUserById(intid);}实现UserDao接口packagecn.bigdataboy.dao.impl;importcn.bigdataboy.dao.UserDao;importcn.bigdataboy.entity.User;importcn.bigdataboy.util.DBConnectionUtil;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassUserDaoImplimplementsUserDao{//通过id查询用户publicUsergetUserById(intid){Useruser=null;Connectionconn=null;PreparedStatementps=null;ResultSetrs=null;try{//通过连接工具类获取连接对象conn=DBConnectionUtil.getConnection();Stringsql="select*fromuserwhereid=?";ps=conn.prepareStatement(sql);ps.setInt(1,id);//设置第一个问号的值rs=ps.executeQuery();//执行SQL语句//判断是否返回到值,多个值需要循环使用next()获取if(rs.next()){//设置user值user=newUser();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setAge(rs.getInt("age"));user.setEmail(rs.getString("email"));}}catch(SQLExceptionthrowables){throwables.printStackTrace();}finally{//关闭全部DBConnectionUtil.closeAll(rs,ps,conn);}returnuser;}}测试实现的getUserById()方法packagecn.bigdataboy.dao;importcn.bigdataboy.dao.impl.UserDaoImpl;importcn.bigdataboy.entity.User;importorg.junit.Test;publicclassTestUserDaoImpl{@TestpublicvoidTestGetUserById(){intid=1;UserDaoImpluserDao=newUserDaoImpl();Useruser=userDao.getUserById(id);System.out.println(user.getId());System.out.println(user.getName());System.out.println(user.getAge());System.out.println(user.getEmail());System.out.println(user.getClass());}}其他的修改、添加、删除数据都是一样的,完整代码里有

2020-10-17 239 0
编程杂谈

IO&NIO的区别NIOJavaNIO(NewIONonBlockingIO)是从Java1.4版本引入的一个新的IOAPI,可以替代标准的JavaIOAPI。NIO与原来的IO有着同样的作用和目的,但是使用的方式不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将更加高效的方式进行文件读写操作。区别IONIO面向流(Stream)面向缓冲区(Buffer)阻塞IO(BlockingIO)非阻塞IO(NonBlockingIO)无选择器(Selecors)缓冲区(Buffer)创建缓冲区(allocate)缓冲区本质就是数组,用于存储不同的数据缓冲区类型:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer//分配一个指定大小的Byte缓冲区(大小必须指定)ByteBufferbbuffer=ByteBuffer.allocate(1024);读&取缓冲区的两大核心方法缓冲区放入数据(put)放入方法put()有很多重载这里说明一下第一种:put(byte[]src,intoffset,intlength)byte[]src:放入缓冲区的数组intoffset:放入缓冲区数组的偏移量intlength:偏移量向后放入length位数据到缓冲区后两个参数为可选,不设置,表示把整个数组放入缓冲区。//Strings="abcde";byte[]bytes=newbyte[]{'a','b','c','e','f'};//数据放入缓冲区//bbuffer.put(s.getBytes());bbuffer.put(str.getBytes());读取缓冲区数据(get)在读取缓冲区数据之前,需要转换缓冲区模式为读取模式。bbuffer.flip();//读取缓冲区数据首先需要切换缓冲区模式System.out.println(bbuffer.get(0));//97打印出来的是字节码清空缓冲区但是'清空'后,缓冲区的数据依然存在,处于被遗忘状态bbuffer.clear();缓冲区的四大核心属性大小关系:mark<=position<=limit<=capacitycapacity:容量,代表缓冲区存储数据的大小,一旦声明不能改变limit:界限,表示缓冲区可以操作数据的大小(limit后的数据不能进行读写)position:位置,表示缓冲区正在操作数据的位置。mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark位置。创建缓冲区时写入数据时读取数据时mark记录position的位置@Testpublicvoidtest(){byte[]bytes=newbyte[]{'a','b','c','e','f'};//创建放入数据切换模式ByteBufferbuf=ByteBuffer.allocate(10);buf.put(bytes);buf.flip();//记录position的位置buf.mark();//创建新的数组取出缓冲区的数据,添加到des字节数组byte[]des=newbyte[buf.limit()];buf.get(des,0,2);//输出数组的值System.out.println(newString(des,0,2));System.out.println(buf.position());buf.reset();//恢复position到mark位置System.out.println(buf.position());}

2019-10-28 563 0
哔哔大数据

需要导入的包注意导入mapreduce的新版本包带mapreduce的importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importjava.io.IOException;MapReduce程序结构publicclassWordCountApp{//进行分割的map类publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{......}//归并操作的Reducer类publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{......}//定义Drive类(main类)publicstaticvoidmain(String[]args)throwsException{......}}map类:对读取的每一行单词进行分割操作,形成键值对Reducer类:把分割完成的键值对-->key,value,进行归并求和并输出Drive类:设置MapReduce作业提交、数据的输入路径、map的处理类、Reducer的处理类、数据的输出路径map分割操作的详解Mapper类四个泛型参数前两个参数为map输入类型,后两个参数为map的输出类型LongWritable:输入数据的首行的偏移量(相当于Java的Long类型)Text:输入的每一行的数据(相当于Java的String类型)Text:分割之后产生的键值对键的类型LongWritable:分割之后产生的键值对值的类型publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{/**reduce参数:*LongWritablekey:输入数据的行的偏移量*Textvalue:读取的每一行数据*Contextcontext上下文连接**/@Overrideprotectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{//接收到的每一行数据,转化成Java的字符串Stringline=value.toString();//把字符串进行空格分隔,返回一个数组String[]words=line.split("");//返回字符串数组//利用循环使用context.write(key,value);组合成k,v形式for(Stringword:words){//通过context(上下文连接)把map分割的k、v输出context.write(newText(word),newLongWritable(1));//前面设置了返回值为Text,LongWritable类型}}}Reducer归并操作的详解Reducer类四个泛型参数前两个参数为Reducer输入类型,后两个参数为Reducer的输出类型Text:map的输出类型,就是Reduse的输入类型LongWritable:map的输出类型,就是Reduse的输入类型Text:进行归并操作之后的键值对-->键的类型LongWritable:进行归并操作之后的键值对-->的值类型publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{/**reduce参数:*Textkey:Map操作后的键值对的键*Iterable<LongWritable>values:当进行Map操作之后,一个键可能有很多对应的值所以是一个迭代类型*Contextcontext上下文连接**/@Overrideprotectedvoidreduce(Textkey,Iterable<LongWritable>values,Contextcontext)throwsIOException,InterruptedException{//这里只需要把出现的迭代类型进行求和longsum=0;for(LongWritablevalue:values){//把LongWritable转成Java的数据类型进行求和sum+=value.get();}//最终的统计结果通过上下文连接输出context.write(key,newLongWritable(sum));}}定义Drive类(main类)publicstaticvoidmain(String[]args)throwsException{//抛出异常//创建一个Configuration对象Configurationconfiguration=newConfiguration();//注意是hadoop里的//创建一个Job,如有异常,先把异常抛出Jobjob=Job.getInstance(configuration,"wordCount");//设置Job的处理类job.setJarByClass(WordCountApp.class);//类名称//设置需要处理数据的输入路径FileInputFormat.setInputPaths(job,newPath(args[0]));//路径通过脚本参数传入//设置map的处理主类job.setMapperClass(MyMapper.class);//指定Mapper处理类job.setMapOutputKeyClass(Text.class);//设置map处理类的k输出类型job.setMapOutputValueClass(LongWritable.class);//设置map处理类的v输出类型//设置reducer的处理主类job.setReducerClass(MyReducer.class);//指定Reduse处理类job.setOutputKeyClass(Text.class);//设置reducer处理类的k输出类型job.setOutputValueClass(LongWritable.class);//设置reducer处理类的v输出类型//设置作业的输出路径FileOutputFormat.setOutputPath(job,newPath(args[1]));//路径通过脚本参数传入//提交作业booleanb=job.waitForCompletion(true);//参数为true确定提交//退出程序System.exit(b?0:1);//程序推出的状态码0正常}上传到hadoop执行首先把程序打成jar包。idea打jar教程hadoop执行jar命令:hadoopjarJar名称输入路径输出路径hadoopjarhadooptrain.jarhdfs://192.168.5.137:9000/words.txthdfs://192.168.5.137:9000/output执行结果

编程杂谈

案例背景电脑通常是支持USB设备的功能,通过USB可以连接鼠标、键盘等,还能进行鼠标的点击,键盘的输入等鼠标的特有操作案例分析进行操作的主类,电脑类,实现电脑使用USB鼠标,USB键盘USB接口类:包含打开设备和关闭设备功能电脑类:包含开机、关机和使用USB设备的功能鼠标:实现USB接口,并有点击的功能键盘:实现USB接口,必有输入的方法案例实现定义USB接口类:publicinterfaceUSB{//开启设备publicabstractvoidopen();//关闭接口publicabstractvoidclose();}定义电脑类:publicclassComputer{//开启电脑方法publicvoidon(){System.out.println("开启电脑");}//关闭电脑方法publicvoidoff(){System.out.println("关闭电脑");}//使用设备publicvoiduseDevice(USBuse){use.open();//USB设备的开启//USB设备特有方法的使用if(useinstanceofMouse){//判断Mouse的父类是不是USBMouseuseMouse=(Mouse)use;//向下转型useMouse.click();}elseif(useinstanceofKeyboard){((Keyboard)use).input();//向下转型}use.close();//USB设备的关闭};}鼠标类:publicclassMouseimplementsUSB{@Overridepublicvoidopen(){System.out.println("打开鼠标");}@Overridepublicvoidclose(){System.out.println("关闭鼠标");}//鼠标的特有操作publicvoidclick(){System.out.println("鼠标点击了");}}键盘类:publicclassKeyboardimplementsUSB{//打开键盘@Overridepublicvoidopen(){System.out.println("键盘打开");}@Overridepublicvoidclose(){System.out.println("键盘关闭");}//键盘的特有操作publicvoidinput(){System.out.println("正在输入中......");}}操作的主类:publicclassMainDemo{publicstaticvoidmain(String[]args){//实例化电脑类Computercomputer=newComputer();computer.on();//电脑开机//USB鼠标的操作USBmouse=newMouse();//多态的写法computer.useDevice(mouse);//USB键盘的操作Keyboardkeyboard=newKeyboard();//不是多态写法USBusbKeyboard=keyboard;//向上转型为USB类computer.useDevice(usbKeyboard);computer.off();//电脑关机}}

哔哔大数据

特别提示执行前需要启动hadoopIDEA创建Hadoop-Maven项目下载hadoop.dll放入windows的C:\Windows\System32下相关环境windows10hadoop2.9.2伪分布式搭建idea2018.3.50x00JAVA连接HDFS配置连接publicstaticfinalStringHDFS_PATH="hdfs://192.168.5.137:9000";//HDFS路径FileSystemfileSystem=null;//操作文件系统注意选中apache的类Configurationconfiguration=null;//HDFS配置连接创建连接方法@Before//所有执行完之前执行publicvoidsetUp()throwsException{configuration=newConfiguration();//实例化类fileSystem=FileSystem.get(newURI(HDFS_PATH),configuration,"root");//参数:路径配置类用户}0x01执行结束时释放资源@After//所有执行完之后再执行publicvoidtearDown()throwsException{//结束释放资源configuration=null;fileSystem=null;}0x02创建文件夹@Test//单元测试publicvoidmkidr()throwsException{fileSystem.mkdirs(newPath("/HDFSAPI/test"));}0x03删除文件操作@Testpublicvoiddelete()throwsException{//参数:路径递归删除booleanmsg=fileSystem.delete(newPath("/HDFSAPI/test/a.txt"),true);}0x04创建文件并写入内容@Test//单元测试publicvoidcreate()throwsException{//返回值是一个文件流FSDataOutputStreamoutput=fileSystem.create(newPath("/HDFSAPI/test/e.txt"));//通过流写入一个Bytes[]数组output.write("hellohadoop".getBytes());output.flush();//把文件流关闭output.close();}0x05查看文件内容@Test//单元测试publicvoidcat()throwsException{FSDataInputStreamfile=fileSystem.open(newPath("/HDFSAPI/test/e.txt"));//把内容输出到控制台使用hadoop里的类IOUtils.copyBytes(file,System.out,1024);//文件内容对象输出到控制台缓冲区大小//关闭file.close();}0x06文件的重命名@Test//单元测试publicvoidrename()throwsException{//旧文件的路径PatholdPath=newPath("/HDFSAPI/test/a.txt");//新文件的路径booleanmsg=fileSystem.rename(oldPath,newPath);}0x07本地上传文件到HDFS@TestpublicvoidcopyFromLocalFile()throwsException{//本地路径--->我是在windows上测试的所以是如下地址PathLocalPath=newPath("D://data.txt");//上传到HDFS上的路径PathHDFSPath=newPath("/HDFSAPI/test/");fileSystem.copyFromLocalFile(LocalPath,HDFSPath);}0x08大文件上传带进度条提示@TestpublicvoidcopyFromLocalFileWithProgress()throwsException{//获取需要上传的文件InputStreamfile=newBufferedInputStream(//为了提升效率使用BuffernewFileInputStream(//需要把File转换为StreamnewFile("F://BigData/hadoop/hadoop-2.9.2.tar.gz")));//创建上传的文件路径FSDataOutputStreamoutput=fileSystem.create(newPath("/HDFSAPI/test/newhadoop-2.9.2.tar.gz"),//第一个参数可以进行重命名newProgressable(){//第二个参数打印的进度条@Overridepublicvoidprogress(){System.out.print("*");//提示的进度条图案}});//上传IOUtils.copyBytes(file,output,4096);}0x09下载文件@TestpublicvoidcopyToLocalFrom()throwsException{PathhdfsPath=newPath("/HDFSAPI/test/a.txt");//本地路径PathlocalPath=newPath("F://a.txt");fileSystem.copyToLocalFile(hdfsPath,localPath);}0x10查看目录下的所有文件@TestpublicvoidlistFile()throwsException{//需要查看的hdfs目录PathhdfsPath=newPath("/HDFSAPI/test");FileStatus[]fileStatuses=fileSystem.listStatus(hdfsPath);for(FileStatusfile:fileStatuses){//输出路径StringfilePath=file.getPath().toString();//查看是否是目录StringisDir=file.isDirectory()?"文件夹":"文件";//输出文件大小longfileSize=file.getLen();//输出文件的副本数量shortfileReplication=file.getReplication();//输出打印System.out.println(filePath+"\t"+isDir+"\t"+fileSize+"\t"+fileReplication+"\t");}}常见问题org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjava/lang/String;JZ)V解决方法下载hadoop.dll放入windows的C:\Windows\System32下错误描述Namenodeisinsafemode.Namenode处于安全模式解决方法:关闭安全模式关闭安全模式hadoopdfsadmin-safemodeleave进入安全模式hadoopdfsadmin-safemodeenter通过JavaAPI上传,与Hadoopshell上传的文件,副本系数不一样解释:JavaAPI上传,我们并没有指定副本系数,所以上传的副本数是hadoop默认的3Hadoopshell上传,我在hdfs-site.xml里设置过副本数,所以不会使用默认值

2019-9-12 478 0