关于Java的ArrayList数据插入,删除等操作

import java.util.*;
public class TestArrayList
{
public static void main(String []args)
{
ArrayList al=new ArrayList();
System.out.println("数组列表对象al的大小:"+al.size());
al.add("何");
al.add("叶");
al.add("是");
al.add("蠢");
al.add("货");
System.out.println("数组列表对象al赋值后的大小:"+al.size());
System.out.println("数组列表对象al赋值后的内容:"+al);
al.add(2,"不");
al.add(6,"我");
al.add(7,"不");
al.add(8,"信");
System.out.println("数组列表对象al添加元素后的大小:"+al.size());
System.out.println("数组列表对象al添加元素后的内容:"+al);
al.remove(2);
al.remove("我");
al.remove("不");
al.remove(8);
System.out.println("数组列表对象al删除元素后的大小:"+al.size());
System.out.println("数组对象元素al删除元素后的内容:"+al);
}
}
在用控制台编译时,显示说使用了未经检查或不安全的操作,详细信息请使用Xlnt:unchecked重新编译。是什么意思?


4个回答

那个应该是警告信息,这样写:


ArrayList<String> al=new ArrayList<String>();
dcxy0
Q544471255 回复4393Z: 这是泛型,用了这个会有约束,之后不同的类型不能新增
4 年多之前 回复
qq_30137777
hyetpang 这个警告又是什么意思呢?
4 年多之前 回复
qq_30137777
hyetpang 为什么药这么加呢?不加怎么会出现这样的警告?
4 年多之前 回复

这是java jdk1.5以上 使用泛型
想去掉可以加@SuppressWarnings("unchecked")

黄色下划线是没加泛型的警告。加泛型一般是这样的写法:
List list1= new ArrayList(); 其中""就是加入的泛型,可以是任何类型,但是规定了泛型的类型后,这个List集合就只能存储这个类型的数据了

dcxy0
Q544471255 回复4393Z: 是的,但是你想要多个类型,可以用<Object>
4 年多之前 回复
qq_30137777
hyetpang 在上面,我给al的是字符串,所以在申明并创建时,用的<String>,如果我给al的是整型对象,那么是不是应该换成<Integer>?
4 年多之前 回复

一楼正解,另外有一点需要主要的是,ArrayList的使用remove方法后整个list内元素的索引会跟着变动,所以remove(8)会报错

一楼正解,另外有一点需要主要的是,ArrayList的使用remove方法后整个list内元素的索引会跟着变动,所以remove(8)会报错

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java操作MongoDB写入,丢失数据

Java 代码如下: ``` public void doAfterSave(String date_ymd) { try { ArrayList<DBObject> insertList = getArrayList(concurrentResultMap.values()); if (insertList.size() == 0) return; utilsService.getMongoPersist().getMongoCollection(MongoPersist.RtSellerRegion_h).insert(insertList); } finally { concurrentResultMap.clear(); } } ``` 当Mongo中collection为空的时候,插入正常,可是当再次执行这个写入的动作后,mongo中有一个region_id字段出现大量丢失现象。 代码中的insertlist我在debug的时候,都在控制台打印出来了,在写入前数据是完整的,但是写入后就会出现丢失现象。, 我尝试改变数据类型改为Long,Double,String,添加数据库索引,甚至直接删除了数据库集合。 可是现在还是这样,求助啊。

JAVA,VECTOR实现指定位置插入元素,时间复杂度为O(1)

不论是用array还是双向链表实现vector,在指定元素后面插入一个新元素都需要O(N)的时间复杂度,有没有一种数据结构,能够使这个操作的时间复杂度是O(1)?

关于java多线程操作invokeAll空指针的问题

求救各位大神: ``` public static void threadTestAll(String dirName) { long start = System.currentTimeMillis(); ExecutorService pool = Executors.newFixedThreadPool(30); List<Callable<String>> tasks = new ArrayList<Callable<String>>(); File dir = new File(dirName); for(File f:dir.listFiles(new myFilter())){ myTask t = new ThreadTest2().new myTask(f.getAbsolutePath()); tasks.add(t); } try { List<Future<String>> r = pool.invokeAll(tasks); for (Future<String> f : r) { if(f != null){ System.out.println(f); System.out.println("task result=" + f.get()); } } pool.shutdown(); long end = System.currentTimeMillis(); System.out.println("测试用了"+(end-start)+"毫秒"); } catch (Exception e) { System.out.println("here"); e.printStackTrace(); } } ``` ``` class myTask implements Callable<String> { final String fileName; public myTask(String fileName) { this.fileName = fileName; } @Override public String call() throws Exception { System.out.println("线程开始查找"+fileName); List<String> l = FileUtils.serachFileNames(fileName, "[七七电视www.77ds.com]蚁人TS清晰中字.mp4", false); if(l.size() != 0){ // System.out.println(l.get(0)); System.out.println(l.get(0)); return l.get(0); } return ""; // throw new Exception("没找到"); } } ``` 我的两段代码,没有发现任何有空指针异常的情况,单步调试也不知道哪出问题了,在这里 System.out.println(f); System.out.println("task result=" + f.get()); 打印也可以把对象打印出来,但不知道为啥,总有一个对象get的时候出错了,报空指针问题,求大神指教 这是结果 ``` 线程开始查找d:\$RECYCLE.BIN 线程开始查找d:\7450 线程开始查找d:\android 线程开始查找d:\360WiFi 线程开始查找d:\cha 线程开始查找d:\360Downloads 线程开始查找d:\maven 线程开始查找d:\opt 线程开始查找d:\Program Files (x86) 线程开始查找d:\DOWNLOAD 线程开始查找d:\RJ 线程开始查找d:\updateEdb 线程开始查找d:\work 线程开始查找d:\program 线程开始查找d:\kinggsoft 线程开始查找d:\Program Files 线程开始查找d:\迅雷下载 线程开始查找d:\shuju 线程开始查找d:\Youku Files 线程开始查找d:\System Volume Information 线程开始查找d:\备份 d:\迅雷下载\新建文件夹\[七七电视www.77ds.com]蚁人TS清晰中字.mp4 java.util.concurrent.FutureTask@6ef0eed6 task result= java.util.concurrent.FutureTask@bd05c81 task result= java.util.concurrent.FutureTask@1c691f36 task result= java.util.concurrent.FutureTask@398020cc task result= java.util.concurrent.FutureTask@ae94e92 task result= java.util.concurrent.FutureTask@5b2558d6 task result= java.util.concurrent.FutureTask@70eb7859 task result= java.util.concurrent.FutureTask@732a54f9 task result= java.util.concurrent.FutureTask@6030e280 task result= java.util.concurrent.FutureTask@296672d6 task result= java.util.concurrent.FutureTask@4fd54d6 task result= java.util.concurrent.FutureTask@13ccb029 task result= java.util.concurrent.FutureTask@63415de6 task result= java.util.concurrent.FutureTask@587bd9f2 task result= java.util.concurrent.FutureTask@2b21cc40 task result= java.util.concurrent.FutureTask@37e893df here java.util.concurrent.ExecutionException: java.lang.NullPointerException at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) at java.util.concurrent.FutureTask.get(FutureTask.java:83) at codeTest.ThreadTest2.threadTestAll(ThreadTest2.java:48) at codeTest.ThreadTest2.main(ThreadTest2.java:30) Caused by: java.lang.NullPointerException at codeTest.ThreadTest2$myTask.call(ThreadTest2.java:91) at codeTest.ThreadTest2$myTask.call(ThreadTest2.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) ```

分别创建一个ArrayList和LinkedList,用Dog类的多个实例来填充此容器。

9. 分别创建一个ArrayList和LinkedList,用Dog类的多个实例来填充此容器。用普通的Iterator打印此List,然后用ListIterator,按隔一个位置插入一个对象的方式,把两个列表合并起来。然后从List的末尾开始向前移动,并且执行打印操作。

Java 学生信息管理系统

写入第二个对象时就报错,要写入文件中,所以我用的是对象序列化。只写入一个对象就没问题,各种功能都可以。

通讯录中TXT文件读取问题

``` package in; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; public class Demo extends JFrame { /* * 界面设计 * */ public Demo(){ Container c = getContentPane(); //定义一个顶级容器c setAlwaysOnTop(true); //窗体置顶 JPanel jp = new JPanel(); //新建JPanel面板--jp JButton button1 = new JButton("新建联系人"); JButton button2 = new JButton("删除联系人"); JButton button3 = new JButton("编辑联系人"); JButton button4 = new JButton("查找联系人"); JButton button5 = new JButton("显示所有联系人"); JButton button6 = new JButton("保存联系人到本地"); JButton button7 = new JButton("读取本地联系人"); jp.setLayout(new GridLayout(3,4,5,5));//新建网格布局管理器(行数,列数,组件间的水平垂直间距) jp.add(button1); jp.add(button2); jp.add(button3); jp.add(button4); jp.add(button5); jp.add(button6); jp.add(button7); c.add(jp);//将JPanel面板jp添加到顶级容器c中 setSize(600,150); setTitle("*通 讯 录 管 理 系 统*"); setVisible(true); setResizable(false);//窗体大小由程序员决定,用户不能自由改变大小 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* *按键响应 * * */ button1.addActionListener(new ActionListener(){//添加功能实现 public void actionPerformed(ActionEvent arg0){ Infro.addFunction(); } }); button2.addActionListener(new ActionListener(){//删除功能实现 public void actionPerformed(ActionEvent arg0){ Infro.deleteFunction(); } }); button3.addActionListener(new ActionListener(){//修改功能实现 public void actionPerformed(ActionEvent arg0){ Infro.reditFunction(); } }); button4.addActionListener(new ActionListener(){//查询功能实现 public void actionPerformed(ActionEvent arg0){ try { Infro.searchFunction(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); button5.addActionListener(new ActionListener(){//显示功能实现 public void actionPerformed(ActionEvent arg0){ Infro.showFunction(); } }); button6.addActionListener(new ActionListener(){//保存功能实现 public void actionPerformed(ActionEvent arg0){ try { Infro.writeFunction(); } catch (IOException e) { e.printStackTrace(); } } }); button7.addActionListener(new ActionListener(){//读取功能实现 public void actionPerformed(ActionEvent arg0){ try { Infro.readFunction(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public static void main(String[] args) { // TODO Auto-generated method stub new Demo(); Infro a = new Infro("", "", "", "", "", ""); } } package in; import java.applet.Applet; import java.awt.Graphics; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; import javax.swing.JPanel; class Infro { public String Name; public String Sex; public String Unit; public String Homephone; public String Telephone; public String E_mail; static int index = 0; static ArrayList<Infro> list = new ArrayList(); static int len = list.size(); //构造函数 public Infro(String Name,String Sex,String Unit,String Homephone,String Telephone,String E_mail){ this.Name = Name; this.Sex = Sex; this.Unit = Unit; this.Homephone = Homephone; this.Telephone = Telephone; this.E_mail = E_mail; } public String toString(){ return "姓名:"+Name+"\t性别:"+Sex+"\t单位:"+Unit+"\t住宅电话:"+Homephone +"\t移动电话:"+Telephone+"\tE_mail:"+E_mail; } /* * 添加功能 * */ public static void addFunction(){//添加功能 Infro infro = new Infro("","","","","",""); System.out.println("请输入添加的数据:"); Scanner in = new Scanner(System.in); System.out.println("输入姓名:"); infro.Name = in.next(); System.out.println("输入性别:"); infro.Sex = in.next(); System.out.println("输入单位:"); infro.Unit = in.next(); System.out.println("输入住宅电话:"); infro.Homephone = in.next(); System. out.println("输入移动电话:"); infro.Telephone = in.next(); System.out.println("输入E_mail:"); infro.E_mail = in.next(); list.add(index,infro); index++; if(list.isEmpty()){ System.out.println("数据添加失败啦"); }else{ System.out.println("数据添加成功啦"); len++;//list集合长度加一 // System.out.println(list.get(0).toString()); } System.out.println("是否继续添加?1.是 2.否"); Scanner e=new Scanner(System.in); int e1=e.nextInt(); if(e1==1){ Infro.addFunction(); }else{ return; } } /* * 删除功能 * */ public static void deleteFunction(){ System.out.println("输入要删除的联系人的姓名"); Scanner in_2 = new Scanner(System.in); String d1 = in_2.nextLine(); java.util.Iterator<Infro> it = list.iterator(); while (it.hasNext()){ Infro infro = it.next(); if (infro.Name.equals(d1)){ it.remove(); --index;//一定要加这个,否则当做了删除操作再做添加操作的时候会出现异常(类似于指针,栈) System.out.println("删除完毕"+"此时通讯录记录条数为:" + --len); } } System.out.println("是否继续删除?1.是 2.否"); Scanner e=new Scanner(System.in); int e1=e.nextInt(); if(e1==1){ Infro.deleteFunction(); }else{ return; } } /* * 修改功能 * */ public static void reditFunction(){ System.out.println("输入要修改的通讯录的姓名"); Scanner in_r = new Scanner(System.in); String r1 = in_r.nextLine(); for(int a = 0; a < len;a++){ if(r1.equals(list.get(a).Name)){ System.out.println("输入修改后的性别:"); String Sex_1 = in_r.next(); list.get(a).Sex = Sex_1; System.out.println("输入修改后的单位:"); String Unit_1 = in_r.next(); list.get(a).Unit = Unit_1; System.out.println("输入修改后的住宅电话:"); String Homephone_1 = in_r.next(); list.get(a).Homephone = Homephone_1; System.out.println("输入修改后的移动电话:"); String Telephone_1 = in_r.next(); list.get(a).Telephone = Telephone_1; System.out.println("输入修改后的E_mail:"); String E_mail_1 = in_r.next(); list.get(a).E_mail = E_mail_1; System.out.println("数据修改完毕"); } } System.out.println("是否继续修改?1.是 2.否"); Scanner e=new Scanner(System.in); int e1=e.nextInt(); if(e1==1){ Infro.reditFunction(); }else{ return; } } /* * 查询功能 * */ public static void searchFunction() throws Exception{//查询功能 System.out.println("请选择查询方式: "); System.out.println("1.姓名 2.性别 3.单位 4.住宅电话 5.移动电话 6.E_mail "); Scanner in_0=new Scanner(System.in); int s0=in_0.nextInt(); if(s0==1){ System.out.println("请输入要查询的姓名:"); Scanner in_1 = new Scanner(System.in); String s1=in_1.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s1.equals(list.get(a).Name)){ System.out.println(list.get(a).toString()); } } } else if(s0==2){ System.out.println("请输入要查询的性别:"); Scanner in_2 = new Scanner(System.in); String s2=in_2.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s2.equals(list.get(a).Sex)){ System.out.println(list.get(a).toString()); } } } else if(s0==3){ System.out.println("请输入要查询的单位:"); Scanner in_3 = new Scanner(System.in); String s3=in_3.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s3.equals(list.get(a).Unit)){ System.out.println(list.get(a).toString()); } } } if(s0==4){ System.out.println("请输入要查询的住宅电话:"); Scanner in_4 = new Scanner(System.in); String s4=in_4.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s4.equals(list.get(a).Homephone)){ System.out.println(list.get(a).toString()); } } } else if(s0==5){ System.out.println("请输入要查询的移动电话:"); Scanner in_5 = new Scanner(System.in); String s5=in_5.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s5.equals(list.get(a).Telephone)){ System.out.println(list.get(a).toString()); } } } else if(s0==6){ System.out.println("请输入要查询的E_mail:"); Scanner in_6 = new Scanner(System.in); String s6=in_6.nextLine(); for(int a= 0; a<len;a++){//切记,,这里不能用a<=list.size(),否则会数组越界异常 if(s6.equals(list.get(a).E_mail)){ System.out.println(list.get(a).toString()); } } } } /* * 显示功能 * */ public static void showFunction(){ for(int i = 0 ;i<len;i++){ System.out.println(list.get(i).toString()); } } /* * 保存功能 * */ public static void writeFunction() throws IOException{ FileWriter writer = new FileWriter("通讯录管理.txt"); for(int i = 0 ;i<len;i++){ String []strwriter = new String[len]; strwriter[i]=list.get(i).toString(); writer.write(strwriter[i]); writer.write("\r\n"); System.out.println("成功写入一行数据到 通讯录管理.txt 中"); } writer.close();//关闭写入流,释放资源 } /* * 读取功能 * */ public static void readFunction() throws IOException{ FileReader reader = new FileReader("通讯录管理.txt"); BufferedReader br = new BufferedReader(reader); String str; while((str = br.readLine()) != null){//每次读取一行文本,判断是否到达文件尾 System.out.println(str); } br.close(); } } ``` 课程设计中遇到了问题… 在运行时输入,可以查询,编辑等操作。可是保存到本地后退出运行,第二次再运行时读取本地联系人,就没办法执行查询操作了。我改了好久还是不行,请各位哥哥姐姐帮忙看一下,拜托~因为还没有学数据库,只能用文件了。 超过20个分屏显示就不要了,因为貌似java没有分屏显示……其他的功能,按姓名排序也希望你们能给些思路,谢谢谢谢 这是题目: 3. 以本班同学的具体数据为背景,设计一个本班同学通讯录(3人) 通讯录要求存储姓名、性别、单位、住宅电话、移动电话、E-mail地址等内容。系统功能要求如下: (1)通讯录记录按姓名排序存放,显示时每屏不超过20个记录,超过时分屏显示。 (2)增加某人的通讯录。 (3)修改某人的通讯录。 (4)删除某人的通讯录。 (5)按多种方式查询符合条件的信息。

单击未在android中插入数据库的保存按钮数据

<div class="post-text" itemprop="text"> <p>Hi In My Application I am Displaying Student name and roll no and check box with name present.Now student names and roll no coming from database Now if I click save button I want to insert all the records in another table. If I click Save Button I want Save all the data Into database.Now,If I click Save Button it giving unfortunately error.</p> <p>Can Any one please help me.</p> <p><strong>Attend.java</strong></p> <pre><code>public class Attend extends Activity implements OnClickListener { String data = ""; TableLayout tl; TableRow tr; TextView studentName; EditText studentname,rollno; CheckBox present; String[] class_name, section_name; String[] words; String name; String roll; Button save; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tl = (TableLayout) findViewById(R.id.maintable); save = (Button)findViewById(R.id.save); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //save.setText("Record Saved Sucessfully"); name = studentname.getText().toString(); roll =rollno.getText().toString(); data = DatabaseUtility.executeQueryPhp("save",""); } }); String class_id = getIntent().getStringExtra("class_id"); String section_id = getIntent().getStringExtra("section_id"); Toast.makeText( this, "Result : " + " className : " + class_id + " SectionName : " + section_id, Toast.LENGTH_SHORT).show(); final String queryString = "class_id=" + class_id + "&amp;section_id=" + section_id; /*String result = DatabaseUtility.executeQueryPhp("getStudent", queryString);*/ new Thread(new Runnable() { public void run() { data = DatabaseUtility.executeQueryPhp("getStudent",queryString); System.out.println(data); runOnUiThread(new Runnable() { @Override public void run() { ArrayList&lt;StudentDetails&gt; users = parseJSON(data); addData(users); } }); } }).start(); } public ArrayList&lt;StudentDetails&gt; parseJSON(String result) { ArrayList&lt;StudentDetails&gt; users = new ArrayList&lt;StudentDetails&gt;(); try { JSONArray jArray = new JSONArray(result); for (int i = 0; i &lt; jArray.length(); i++) { JSONObject json_data = jArray.getJSONObject(i); StudentDetails user = new StudentDetails(); // user.setId(json_data.getInt("class_name")); // user.setClass_id(json_data.getInt("section_name")); // user.setSection_id(json_data.getInt("section_id")); user.setStudentname(json_data.getString("first_name")); user.setRollno(json_data.getString("roll_no")); users.add(user); } } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return users; } void addHeader() { tr = new TableRow(this); studentName = new TextView(this); studentName.setText("StudentName"); studentName.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); studentName.setPadding(5, 5, 5, 5); studentName.setBackgroundColor(Color.RED); LinearLayout Ll = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(5, 5, 5, 5); Ll.addView(studentName, params); tr.addView((View) Ll); TextView rollNumber = new TextView(this); rollNumber.setText("RollNo"); rollNumber.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); rollNumber.setPadding(5, 5, 5, 5); rollNumber.setBackgroundColor(Color.RED); Ll = new LinearLayout(this); params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(0, 5, 5, 5); Ll.addView(rollNumber, params); tr.addView((View) Ll); TextView Present = new TextView(this); Present.setText("Present"); Present.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Present.setPadding(5, 5, 5, 5); Present.setBackgroundColor(Color.RED); Ll = new LinearLayout(this); params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(0, 5, 5, 5); Ll.addView(Present, params); tr.addView((View) Ll); tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); } @SuppressWarnings({ "rawtypes" }) public void addData(ArrayList&lt;StudentDetails&gt; users) { addHeader(); for (Iterator i = users.iterator(); i.hasNext();) { StudentDetails p = (StudentDetails) i.next(); /** Create a TableRow dynamically **/ tr = new TableRow(this); /** Creating a TextView to add to the row **/ studentName = new EditText(this); studentName.setText(p.getStudentname()); studentName.setId(p.getId()); studentName.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); studentName.setPadding(5, 5, 5, 5); LinearLayout Ll = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(5, 2, 2, 2); Ll.addView(studentName, params); tr.addView((View) Ll); EditText rollo = new EditText(this); rollo.setText(p.getRollno()); rollo.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); rollo.setPadding(5, 5, 5, 5); Ll = new LinearLayout(this); params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(0, 3, 3, 3); Ll.addView(rollo, params); tr.addView((View) Ll); CheckBox present = new CheckBox(this); present.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); present.setPadding(5, 5, 5, 5); Ll = new LinearLayout(this); params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.setMargins(0, 3, 3, 3); Ll.addView(present, params); tr.addView((View) Ll); tl.addView(tr, new TableLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); } } @Override public void onClick(View v) { // TODO Auto-generated method stub } </code></pre> <p><strong>DatabaseUtility.java</strong></p> <pre><code>public class DatabaseUtility { public static String executeQueryPhp(String phpScript,String queryString) { InputStream is = null; String line = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); String url = ""; if(queryString!=""){ url= "http://10.0.2.2/android_connect/"+phpScript+".php?"+queryString; }else{ url = "http://10.0.2.2/android_connect/"+phpScript+".php"; } HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); Log.e("Fail 1", "3"); HttpEntity entity = response.getEntity(); Log.e("Fail 1", "4"); is = entity.getContent(); Log.e("Pass 1", "connection success "); } catch (Exception e) { Log.e("Fail 1", e.toString()); /* * Toast.makeText(getApplicationContext(), "Invalid IP Address", * Toast.LENGTH_LONG).show(); */ /* finish(); */ } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line + " "); } is.close(); result = sb.toString(); } catch (Exception e) { Log.e("Fail 2", e.toString()); } return result; } </code></pre> <p><strong>logcat</strong></p> <pre><code> 09-22 10:40:42.193: E/Fail 1(8270): 3 09-22 10:40:42.193: E/Fail 1(8270): 4 09-22 10:40:42.193: E/Pass 1(8270): connection success 09-22 10:40:42.443: I/Choreographer(8270): Skipped 51 frames! The application may be doing too much work on its main thread. 09-22 10:40:42.513: D/gralloc_goldfish(8270): Emulator without GPU emulation detected. 09-22 10:40:42.613: E/Position new(8270): Nursery 09-22 10:40:47.386: D/dalvikvm(8270): GC_FOR_ALLOC freed 186K, 11% free 2958K/3312K, paused 199ms, total 209ms 09-22 10:40:47.592: D/dalvikvm(8270): GC_FOR_ALLOC freed 34K, 10% free 3236K/3588K, paused 32ms, total 35ms 09-22 10:40:47.943: I/Choreographer(8270): Skipped 135 frames! The application may be doing too much work on its main thread. 09-22 10:40:48.112: I/Choreographer(8270): Skipped 41 frames! The application may be doing too much work on its main thread. 09-22 10:40:49.053: D/dalvikvm(8270): GREF has increased to 201 09-22 10:40:49.283: E/Position new(8270): Play Group 09-22 10:40:51.913: I/Choreographer(8270): Skipped 201 frames! The application may be doing too much work on its main thread. 09-22 10:40:52.133: I/Choreographer(8270): Skipped 56 frames! The application may be doing too much work on its main thread. 09-22 10:40:52.716: I/Choreographer(8270): Skipped 44 frames! The application may be doing too much work on its main thread. 09-22 10:40:53.153: I/Choreographer(8270): Skipped 68 frames! The application may be doing too much work on its main thread. 09-22 10:40:54.093: I/Choreographer(8270): Skipped 54 frames! The application may be doing too much work on its main thread. 09-22 10:40:55.303: I/Choreographer(8270): Skipped 424 frames! The application may be doing too much work on its main thread. 09-22 10:40:55.383: D/dalvikvm(8270): GC_CONCURRENT freed 73K, 6% free 3571K/3788K, paused 5ms+33ms, total 324ms 09-22 10:40:55.832: E/Fail 1(8270): 3 09-22 10:40:55.832: E/Fail 1(8270): 4 09-22 10:40:55.832: E/Pass 1(8270): connection success 09-22 10:40:55.903: I/System.out(8270): [{"first_name":"Md","roll_no":"0"},{"first_name":"Sana","roll_no":"1"},{"first_name":"Tanweer","roll_no":"1"},{"first_name":"zamal","roll_no":"0"}] 09-22 10:41:00.331: I/Choreographer(8270): Skipped 2731 frames! The application may be doing too much work on its main thread. 09-22 10:41:02.053: I/Choreographer(8270): Skipped 57 frames! The application may be doing too much work on its main thread. 09-22 10:41:02.273: I/Choreographer(8270): Skipped 45 frames! The application may be doing too much work on its main thread. 09-22 10:41:05.502: D/AndroidRuntime(8270): Shutting down VM 09-22 10:41:05.502: W/dalvikvm(8270): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 09-22 10:41:05.542: E/AndroidRuntime(8270): FATAL EXCEPTION: main 09-22 10:41:05.542: E/AndroidRuntime(8270): java.lang.NullPointerException 09-22 10:41:05.542: E/AndroidRuntime(8270): at com.rushda.attendance.Attend$1.onClick(Attend.java:68) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.view.View.performClick(View.java:4204) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.view.View$PerformClick.run(View.java:17355) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.os.Handler.handleCallback(Handler.java:725) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.os.Handler.dispatchMessage(Handler.java:92) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.os.Looper.loop(Looper.java:137) 09-22 10:41:05.542: E/AndroidRuntime(8270): at android.app.ActivityThread.main(ActivityThread.java:5041) 09-22 10:41:05.542: E/AndroidRuntime(8270): at java.lang.reflect.Method.invokeNative(Native Method) 09-22 10:41:05.542: E/AndroidRuntime(8270): at java.lang.reflect.Method.invoke(Method.java:511) 09-22 10:41:05.542: E/AndroidRuntime(8270): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 09-22 10:41:05.542: E/AndroidRuntime(8270): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 09-22 10:41:05.542: E/AndroidRuntime(8270): at dalvik.system.NativeStart.main(Native Method) 09-22 10:41:10.093: I/Process(8270): Sending signal. PID: 8270 SIG: 9 09-22 10:41:11.653: D/dalvikvm(8301): GC_CONCURRENT freed 75K, 8% free 2745K/2968K, paused 7ms+22ms, total 84ms 09-22 10:41:11.833: D/dalvikvm(8301): GC_CONCURRENT freed 20K, 6% free 3140K/3308K, paused 6ms+22ms, total 63ms 09-22 10:41:12.094: E/Fail 1(8301): 3 09-22 10:41:12.094: E/Fail 1(8301): 4 09-22 10:41:12.094: E/Pass 1(8301): connection success 09-22 10:41:12.253: E/Position new(8301): Play Group 09-22 10:41:12.393: E/Position new(8301): Play Group 09-22 10:41:12.433: D/gralloc_goldfish(8301): Emulator without GPU emulation detected. 09-22 10:41:13.973: D/dalvikvm(8301): GREF has increased to 201 09-22 10:41:14.073: I/Choreographer(8301): Skipped 45 frames! The application may be doing too much work on its main thread. 09-22 10:41:14.893: I/Choreographer(8301): Skipped 246 frames! The application may be doing too much work on its main thread. 09-22 10:41:15.304: I/Choreographer(8301): Skipped 116 frames! The application may be doing too much work on its main thread. 09-22 10:41:15.345: D/dalvikvm(8301): GC_CONCURRENT freed 203K, 10% free 3331K/3680K, paused 5ms+98ms, total 334ms 09-22 10:41:15.693: E/Fail 1(8301): 3 09-22 10:41:15.693: E/Fail 1(8301): 4 09-22 10:41:15.703: E/Pass 1(8301): connection success 09-22 10:41:15.813: I/System.out(8301): [{"first_name":"Md","roll_no":"0"},{"first_name":"Sana","roll_no":"1"},{"first_name":"Tanweer","roll_no":"1"},{"first_name":"zamal","roll_no":"0"}] 09-22 10:41:17.433: I/Choreographer(8301): Skipped 984 frames! The application may be doing too much work on its main thread. 09-22 10:41:19.063: I/Choreographer(8301): Skipped 85 frames! The application may be doing too much work on its main thread. 09-22 10:41:19.873: I/Choreographer(8301): Skipped 391 frames! The application may be doing too much work on its main thread. 09-22 10:41:24.513: I/Choreographer(8301): Skipped 89 frames! The application may be doing too much work on its main thread. 09-22 10:41:25.055: E/SpannableStringBuilder(8301): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 09-22 10:41:25.104: E/SpannableStringBuilder(8301): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 09-22 10:41:25.212: I/Choreographer(8301): Skipped 71 frames! The application may be doing too much work on its main thread. 09-22 10:41:25.632: I/Choreographer(8301): Skipped 253 frames! The application may be doing too much work on its main thread. 09-22 10:41:25.777: D/dalvikvm(8301): GC_CONCURRENT freed 150K, 8% free 3576K/3872K, paused 28ms+40ms, total 213ms 09-22 10:41:26.220: I/Choreographer(8301): Skipped 100 frames! The application may be doing too much work on its main thread. 09-22 10:41:27.012: W/InputEventReceiver(8301): Attempted to finish an input event but the input event receiver has already been disposed. 09-22 10:41:27.012: W/InputEventReceiver(8301): Attempted to finish an input event but the input event receiver has already been disposed. 09-22 10:41:27.012: W/InputEventReceiver(8301): Attempted to finish an input event but the input event receiver has already been disposed. 09-22 10:41:27.033: I/Choreographer(8301): Skipped 94 frames! The application may be doing too much work on its main thread. 09-22 10:41:27.267: I/Choreographer(8301): Skipped 149 frames! The application may be doing too much work on its main thread. 09-22 10:41:27.422: I/Choreographer(8301): Skipped 88 frames! The application may be doing too much work on its main thread. 09-22 10:41:29.473: D/AndroidRuntime(8301): Shutting down VM 09-22 10:41:29.473: W/dalvikvm(8301): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 09-22 10:41:29.503: E/AndroidRuntime(8301): FATAL EXCEPTION: main 09-22 10:41:29.503: E/AndroidRuntime(8301): java.lang.NullPointerException 09-22 10:41:29.503: E/AndroidRuntime(8301): at com.rushda.attendance.Attend$1.onClick(Attend.java:68) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.view.View.performClick(View.java:4204) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.view.View$PerformClick.run(View.java:17355) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.os.Handler.handleCallback(Handler.java:725) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.os.Handler.dispatchMessage(Handler.java:92) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.os.Looper.loop(Looper.java:137) 09-22 10:41:29.503: E/AndroidRuntime(8301): at android.app.ActivityThread.main(ActivityThread.java:5041) 09-22 10:41:29.503: E/AndroidRuntime(8301): at java.lang.reflect.Method.invokeNative(Native Method) 09-22 10:41:29.503: E/AndroidRuntime(8301): at java.lang.reflect.Method.invoke(Method.java:511) 09-22 10:41:29.503: E/AndroidRuntime(8301): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 09-22 10:41:29.503: E/AndroidRuntime(8301): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 09-22 10:41:29.503: E/AndroidRuntime(8301): at dalvik.system.NativeStart.main(Native Method) 09-22 10:41:36.393: I/Process(8301): Sending signal. PID: 8301 SIG: 9 09-22 10:41:37.163: E/Trace(8330): error opening trace file: No such file or directory (2) 09-22 10:41:37.632: D/dalvikvm(8330): GC_CONCURRENT freed 80K, 8% free 2743K/2972K, paused 11ms+5ms, total 101ms 09-22 10:41:37.823: D/dalvikvm(8330): GC_CONCURRENT freed 19K, 6% free 3140K/3308K, paused 5ms+17ms, total 69ms 09-22 10:41:38.083: E/Fail 1(8330): 3 09-22 10:41:38.083: E/Fail 1(8330): 4 09-22 10:41:38.083: E/Pass 1(8330): connection success 09-22 10:41:38.203: E/Position new(8330): Play Group 09-22 10:41:38.333: E/Position new(8330): Play Group 09-22 10:41:38.333: I/Choreographer(8330): Skipped 30 frames! The application may be doing too much work on its main thread. 09-22 10:41:38.463: D/gralloc_goldfish(8330): Emulator without GPU emulation detected. </code></pre> </div>

Java 学生信息管理系统 求助 为什么会出现nullerror

nullError Exception in thread "main" java.lang.NullPointerException at Student.SQLFrame.getObject(SQLFrame.java:255) at Student.SQLFrame.setTable(SQLFrame.java:287) at Student.SQLFrame.init(SQLFrame.java:226) at Student.SQLFrame.<init>(SQLFrame.java:215) at Student.SQLFrame.main(SQLFrame.java:340) package Student; import java.awt.BorderLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import Student.Student; import Student.SQLTool; public class SQLFrame extends JFrame implements ActionListener { private JTable mainTab;// 显示学生记录的table private JButton allBtn;// 显示所有学生记/录 private JButton addBtn;// 添加新的学生记录 private JButton findBtn;// 根据姓名查询学生记录 private JButton delBtn;// 根据学号删除学生记录 private SQLTool tool;// 数据库操作类实例 private String[] tableName = { "学号", "姓名", "性别", "成绩", "备注" }; private int width[] = { 70, 60, 50, 80, 50, 140 }; public SQLFrame() { this.setVisible(true); this.setTitle("SimpleSMS"); this.setSize(500, 570); this.setResizable(false);// 设置窗口大小固定 this.setLocationRelativeTo(null);// 设置窗口居中 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.init(); initLayout(); } private void init() {// 组件初始化方法 tool = new SQLTool(); ArrayList<Student> stuList = tool.selectAll(); mainTab = new JTable(); setTable(stuList); mainTab.getTableHeader().setReorderingAllowed(false);// 设置Table列不可拖动 mainTab.setEnabled(false);// 设置Table不可编辑 allBtn = new JButton("所有记录"); addBtn.addActionListener(this); addBtn = new JButton("添加记录"); addBtn.addActionListener(this); findBtn = new JButton("查询记录"); findBtn.addActionListener(this); delBtn = new JButton("删除记录"); delBtn.addActionListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void initLayout() { Panel btnPal = new Panel(); btnPal.add(allBtn); btnPal.add(addBtn); btnPal.add(findBtn); btnPal.add(delBtn); JScrollPane scroll = new JScrollPane(mainTab); add(scroll, BorderLayout.CENTER); add(btnPal, BorderLayout.SOUTH); } private Object[][] getObject(ArrayList<Student> stuList) { // 将stuList数组转变为Object的二维数组用于插入JTable Object[][] objects = new Object[stuList.size()][6]; for (int i = 0; i < stuList.size(); i++) { for (int j = 0; j < 6; j++) { switch (j) { case 0: objects[i][j] = stuList.get(i).getID(); break; case 1: objects[i][j] = stuList.get(i).getName(); break; case 2: objects[i][j] = stuList.get(i).getSex(); break; case 3: objects[i][j] = stuList.get(i).getClassStr(); break; case 4: objects[i][j] = stuList.get(i).getScore(); break; case 5: objects[i][j] = stuList.get(i).getRemarks(); break; default: break; } } } return objects; } private void setTable(ArrayList<Student> stuList) {// 更新Table数据 Object[][] objects = getObject(stuList); DefaultTableModel model = new DefaultTableModel(objects, tableName); mainTab.setModel(model); for (int i = 0; i < 6; i++) { mainTab.getColumnModel().getColumn(i).setPreferredWidth(width[i]); } } public void actionPerformed(ActionEvent e) { if (e.getSource().equals(allBtn)) { // 显示所有学生信息 setTable(tool.selectAll());// 查询所有学生信息,并在Table中显示出来 } else if (e.getSource().equals(addBtn)) { // 添加新的学生记录 InsertDialog insertDialog = new InsertDialog();// 自定义输入学生信息的对话框 // showInsertDialog方法显示对话框,并将输入的学生信息返回 Student stu = insertDialog.showInsertDialog(); if (stu != null) {// 判断是否有效 // 调用工具类的insert方法插入新的学生信息,并判断是否成功 if (tool.insert(stu)) { setTable(tool.selectAll()); } else { JOptionPane.showMessageDialog(null, "数据添加失败!"); } } } else if (e.getSource().equals(findBtn)) { // 通过姓名查询学生记录 // 弹出对话框让用户输入学生姓名 String nameStr = JOptionPane.showInputDialog("请输入查询学生的姓名:"); ArrayList<Student> stuList = tool.selectByName(nameStr); // 根据学生姓名查询学生记录,并将查询到的学生记录显示到Table中 setTable(stuList); } else { // 通过学号删除学生记录 try { // 若输入的不为纯数字将发生异常,通过显示错误提示解决异常 int id = Integer.parseInt(JOptionPane.showInputDialog("请输入删除学生的学号:")); // 调用工具类的deleteByID方法删除学生信息,并判断是否成功 if (tool.deleteByID(id)) { JOptionPane.showMessageDialog(null, id + "删除成功"); setTable(tool.selectAll()); } else { JOptionPane.showMessageDialog(null, "未找到学号:" + id); } } catch (Exception e2) { JOptionPane.showMessageDialog(null, "学号应为纯数字!"); } } } public static void main(String[] args){ SQLFrame frame = new SQLFrame(); frame.show(); } }

只能添加,不能更新,删除,查询数据,怎么改?

MainActivity.java ``` package com.example.sqlite; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{ private static final String TAG="Add"; private static final ListAdapter ListAdapter = null; private EditText ecode,ename,ebirth; private Button badd,bdel,bupdate,bsele; private SQLiteDatabase db=null; private TextView tedatashow; private ListView datashow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ecode=(EditText)findViewById(R.id.ecode); ename=(EditText)findViewById(R.id.ename); ebirth=(EditText)findViewById(R.id.ebirth); badd=(Button)findViewById(R.id.badd); bdel=(Button)findViewById(R.id.bdel); bupdate=(Button)findViewById(R.id.bupdate); bsele=(Button)findViewById(R.id.bsele); tedatashow=(TextView)findViewById(R.id.tedatashow); datashow=(ListView)findViewById(R.id.datashow); badd.setOnClickListener((android.view.View.OnClickListener) this); bdel.setOnClickListener((android.view.View.OnClickListener) this); bsele.setOnClickListener((android.view.View.OnClickListener) this); bupdate.setOnClickListener((android.view.View.OnClickListener) this); } public void onClick(View v) { // TODO Auto-generated method stub MyDBHelper helper=new MyDBHelper(this); db=helper.getWritableDatabase(); if(v==badd) { if(ecode.getText().toString().trim().length()!=0 && ename.getText().toString().trim().length()!=0 && ebirth.getText().toString().trim().length()!=0) { try { String sql="INSERT INTO user(ecode,ename,ebirth)" +"VALUES('"+ecode.getText()+"','" +ename.getText()+"','" +ebirth.getText()+"')"; db.execSQL(sql); Toast.makeText(this, "添加成功!", Toast.LENGTH_LONG).show(); ecode.setText(""); ename.setText(""); ebirth.setText(""); } catch(Exception e) { Toast.makeText(this, "出错了!"+ e.getMessage(),Toast.LENGTH_LONG).show(); } } else Toast.makeText(this, "学号和姓名出生日期不能为空!", Toast.LENGTH_LONG).show(); } if(v==bdel) { if(ecode.getText().toString().trim().length()!=0) { try { String sql="delete from user where ecode='"+ecode.getText()+"'"; db.execSQL(sql); Toast.makeText(this, "成功删除!", Toast.LENGTH_LONG).show(); ecode.setText(""); } catch(Exception e) { Toast.makeText(this, "出错了!", Toast.LENGTH_LONG).show(); } } } if(v==bupdate) { if(ecode.getText().toString().trim().length()!=0 && ename.getText().toString().trim().length()!=0 && ebirth.getText().toString().trim().length()!=0) { try { String sql="update user set ecode='"+ecode.getText() +"',ename='"+ename.getText()+"',birthday='" +ebirth.getText()+"'where code='" +ecode.getText()+"''"; db.execSQL(sql); Toast.makeText(this, "成功更新!", Toast.LENGTH_LONG).show(); ecode.setText(""); ename.setText(""); ebirth.setText(""); } catch(Exception e) { Toast.makeText(this, "出错了!"+e.getMessage(),Toast.LENGTH_LONG).show(); } } else Toast.makeText(this, "学号姓名出生日期不能为空!", Toast.LENGTH_LONG).show(); } if(v==bsele) { if(ecode.getText().toString().trim().length()!=0) { try { List all=new ArrayList(); String sql="select * from user where ecode =? or ename =? or ebirth =? "; Cursor result=this.db.rawQuery(sql, null); for(result.moveToFirst();!result.isAfterLast();result.moveToNext()) { all.add("["+result.getString(0)+"]"+""+result.getString(1)+","+result.getString(2)); } datashow.setAdapter(ListAdapter); new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1,all); } catch(Exception f) { Toast.makeText(this, "显示不了", Toast.LENGTH_LONG).show(); } } } db.close(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } ``` MyDBHelper.java ``` package com.example.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyDBHelper extends SQLiteOpenHelper{ public MyDBHelper(Context context) { super(context,"mvdb.db",null,1); } public void onCreate(SQLiteDatabase db) { String sql="create table user(ecode text,ename text,ebirth text);"; db.execSQL(sql); } public void onUpgrade(SQLiteDatabase db,int arg1,int arg2) { String sql="create table user(ecode text,ename text,ebirth text);"; db.execSQL(sql); this.onCreate(db); } } ```

7-2 jmu-ds-顺序表的基本操作(15 分)

实现顺序表的基本运算:初始化、插入、删除、求表的长度、判空、释放。 (1)从键盘输入数据到数组; (2)用数组的数据创建顺序表; (3)输出顺序表L; (4)输出顺序表L的长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入‘f’元素; (9)输出顺序表L; (10)删除L的第3个元素; (11)输出顺序表L; (12)释放顺序表L。 package sss; import java.util.*; import java.util.Scanner; import java.util.ArrayList; public class Qllll { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a=in.nextInt(); String string=""; while(in.hasNextLine()){ String s=in.nextLine(); if(s.equals("\n")){ in.close(); break; }else{ string=string+s; } } ArrayList list =new ArrayList(); char[] ar = string.toCharArray(); char []sc=new char[a]; int n=0; for(int i=0;i<a;i++) { sc[i]=ar[n]; n=n+2; } System.out.println(ar); for(int i=0;i<a;i++) { list.add(sc[i]); } for(Object obj : list) { System.out.print(obj); } System.out.println(); System.out.println(list.size()); if(list.isEmpty()); else{ System.out.println("no"); } System.out.println(list.get(2)); System.out.println(list.indexOf('a')+1); list.add(3,'f'); for(Object obj : list) { System.out.print(obj); } System.out.println(); list.remove(2); for(Object obj : list) { System.out.print(obj); } } }输入字符窜的时候输入换行不能结束输入为什么

做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)

XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !

关于mybatis多对多数据更新的问题

刚学mybatis,遇到如下的问题,纠结了很久啊。。。。。。各路神仙求帮忙 三个表: drop table middles; drop table students; drop table courses; create table students( sid int(5) primary key, sname varchar(10) ); create table courses( cid int(5) primary key, cname varchar(10) ); create table middles( sid int(5), cid int(5), primary key(sid,cid) ); 学生实体和课程实体如下: /** * 学生(多方) */ public class Student { private Integer id; private String name; private List<Course> courseList = new ArrayList<Course>(); public Student(){} public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Course> getCourseList() { return courseList; } public void setCourseList(List<Course> courseList) { this.courseList = courseList; } } /** * 课程(多方) * @author AdminTC */ public class Course { private Integer id; private String name; private List<Student> studentList = new ArrayList<Student>(); public Course(){} public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } } 现在的问题是,某个学生A在自己学的课程中,又加了一门课叫pentaKillCourse。 代码流程如下: Course pentaKillCourse = new Course (); Student A = new Student(); A.getCourseList().add(pentaKillCourse ); studentService.update(user); --------------------------------studentService.update()方法如下------------------------------------------- public void update(User user) { userDao.updateUser(user); } --------------------------------userDao.updateUser()方法如下--------------------------------------------- public void updateUser(User user) { SqlSession sqlSesion = sqlSessionFactory.openSession(); sqlSesion.update("userNamespace.updateUser", user); } ------------------------------------------------------------------------------------------------------------------------ 下面是userMapper: <mapper namespace="userNamespace"> <resultMap type="com.syhua.ssm.sy.domain.User" id="userMap"> <id property="userId" column="user_id" /> <result property="userName" column="user_name"/> <result property="userType" column="user_type"/> <result property="lastIp" column="last_ip"/> <result property="lastVisit" column="last_visit"/> <result property="password" column="password"/> <result property="locked" column="locked"/> <result property="credit" column="credit"/> </resultMap> <!-- 问题是:这个时候我该如何更新用户???? --> <update id="updateUser" parameterType="com.syhua.ssm.sy.domain.User"> ......................................................................... </update> </mapper>

Spring Data Jpa 加了 @Transactional事物注解后数据异常

代码如下: ``` @Transactional public void addAdminRole(String roleIdsStr, Long userId) { if (StringUtils.isBlank(roleIdsStr)) { throw new BusinessException(ResultCodeEnum.PARAMETER_ERROR); } // 重点是这里,在此处我只是查询了一个CommonAdmin这个实体,然后再没对这个实体做过任何curd操作,但执行完addAdminRole这个方法后,CommonAdmin数据却发生了变化 CommonAdmin ca = commonAdminService.getOne(userId); if (ca == null || ca.getStatus() != CommonStatusEnum.ENABLE.getCode()) { throw new BusinessException(ResultCodeEnum.USER_DISABLE); } // 先删除原来的角色 this.removeAdminAllRole(userId); String[] roleIds = roleIdsStr.split(","); List<AdminRole> list = new ArrayList<>(roleIds.length); AdminRole a; for (String s : roleIds) { a = new AdminRole(); a.setId(IDGen.getId()); a.setAdminUserId(userId); a.setRoleId(Long.valueOf(s)); a.setCreateTime(System.currentTimeMillis()); a.setStatus(CommonStatusEnum.ENABLE.getCode()); a.setUpdateTime(System.currentTimeMillis()); list.add(a); } this.adminRoleDao.saveAll(list); } ``` 其中getOne方法如下: ``` public CommonAdmin getOne(Long id) { CommonAdmin u = commonAdminDao.findById(id).get(); u.setCertification(""); return u; } ```

关于hibernate的单向映射问题

@Entity(name = "person") public class Person1 { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true) private List<Phone1> phones = new ArrayList<Phone1>(); public List<Phone1> getPhones() { return phones; } } @Entity(name = "phone") public class Phone1 { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "number") private String number; public Phone1(String number) { this.number = number; } public Phone1(){}; public Long getId() { return id; } public String getNumber() { return number; } } @Test public void test1(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Person1 person = new Person1(); Phone1 phone1 = new Phone1( "123-456-7890" ); Phone1 phone2 = new Phone1( "321-654-0987" ); person.getPhones().add( phone1 ); person.getPhones().add( phone2 ); session.save(person); session.getTransaction().commit(); session.beginTransaction(); person.getPhones().remove( phone1 ); session.getTransaction().commit(); session.close(); } 以上分别是两张对应的实体类,第3个是我写的测试用例。运行之后的SQL语句是 insert into person values ( ) insert into phone (number) values (?) insert into phone (number) values (?) insert into person_phone (person_id, phones_id) values (?, ?) insert into person_phone (person_id, phones_id) values (?, ?) delete from person_phone where person_id=? insert into person_phone (person_id, phones_id) values (?, ?) delete from phone where id=? 可以看出如果要移除Person的一个号码,会先删除中间表所有与Person有关的数据后再插入。比如person有phone1和phone2两个号码,现在执行操作删除phone1,那么hibernate的做法是会先在中间表删除person与phone的所有关联,然后再插入phone2的数据。 想知道Hibernate为什么会这样执行呢?效率不是太低了吗?

save the transient instance before flushing:

SSH开发save()报错: 严重: Exception occurred during processing request: object references an unsaved transient instance - save the transient instance before flushing: com.resume.demain.Resume org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.resume.demain.Resume at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:279) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:455) at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:281) at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:291) at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:296) at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4079) at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:532) at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:215) at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:142) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1224) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:464) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2905) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2281) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:230) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) at com.resume.dao.impl.ResumeDaoImpl.save(ResumeDaoImpl.java:28) at com.resume.service.impl.ResumeServiceImpl.save(ResumeServiceImpl.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) 前台jsp页面,动态添加: <script type="text/javascript" src="js/jquery-1.8.0.js"></script> <script type="text/javascript"> $(function() { $("#btnAddeducation").click( function() { var num = $("#educationhidNum").val(); num = parseInt(num); num++; $("#educationhidNum").val(num); $("#edcationaddtable").clone(true).attr("id", "edcationaddtable" + num).appendTo("#educationbackgrroundadd"); //clone $("#edcationaddtable" + num).each(function() { $(this).find("input[type='text']").val(""); $(this).find("input[name='educationBackgroundlist[0].startTime']").attr("id","educationStartTime"+ num).attr("name","educationBackgroundlist["+ num+"].startTime"); $(this).find("input[name='educationBackgroundlist[0].university']").attr("id","university"+ num).attr("name","educationBackgroundlist["+ num+"].university"); $(this).find("input[name='educationBackgroundlist[0].overTime']").attr("id","educationOverTime"+ num).attr("name","educationBackgroundlist["+ num+"].overTime"); $(this).find("input[name='educationBackgroundlist[0].professional']").attr("id","professional"+ num).attr("name","educationBackgroundlist["+ num+"].professional"); $(this).find("input[name='educationBackgroundlist[0].qualification']").attr("id","qualification"+ num).attr("name","educationBackgroundlist["+ num+"].qualification"); $(this).find("input[name='deletenum']").attr("class","edcationdeletetable"+ num).attr("name","deletenum"+ num).attr("onclick","deletethiseducation('"+num+"')"); }); }); }); </script> <script type="text/javascript"> function deletethiseducation(a){ a = parseInt(a); if(a==0){ alert("该项不能删除!"); return; } document.getElementById("edcationaddtable"+a).remove(); } </script> <div id="educationbackgrroundadd"> <table id = "edcationaddtable"> <tr> <td colspan="4" style="font-weight:bold; font-size:20px;">教育背景:</td> </tr> <tr> <td>开始&nbsp;时间:<input type="text" name="educationBackgroundlist[0].startTime" id="educationStartTime" /></td> <td ></td> <td >学&nbsp;&nbsp;&nbsp;校:<input type="text" name="educationBackgroundlist[0].university" id="university" /></td> <td ></td> </tr> <tr> <td>结束&nbsp;时间:<input type="text" name="educationBackgroundlist[0].overTime" id="educationOverTime" /></td> <td></td> <td>专&nbsp;&nbsp;&nbsp;业:<input type="text" name="educationBackgroundlist[0].professional" id="professional" /></td> <td></td> </tr> <tr> <td>学&nbsp;&nbsp;&nbsp;位:<input type="text" name="educationBackgroundlist[0].qualification" id="qualification" /></td> <td></td> <td> </td> <td><input type="button" name="deletenum" class="edcationdeletetable" value="点击删除" onclick="deletethiseducation('0')" /></td> </tr> </table> <table> <tr> <td></td> <td></td> <td></td> <td> <input id="educationhidNum" type="hidden" name="hidNum" value="0" /> <input type="button" style="margin-left:100%;" value="继续添加" id="btnAddeducation" onmouseover="this.style.backgroundColor='red';" onmouseout="this.style.backgroundColor='#d4e3e5';" /> </td> </tr> </table> 后台Action: private List<EducationBackground> educationBackgroundlist = new ArrayList<EducationBackground>(); public Resume backresume() throws Exception { List<EducationBackground> educationBackgroundlist1 = this.educationBackgroundlist(); Resume resume = new Resume(); resume.setResumeID(resumeID); resume.setApartment(apartment); resume.setAppliedPosition(appliedPosition); resume.setDestination(destination); resume.setEducationBackground(educationBackgroundlist1); resume.setEmail(email); resume.setEvaluation(evaluation); resume.setExpectation(expectation); resume.setFamilySituation(familySituation); resume.setLanguageProficiency(languageProficiency); resume.setMotivation(motivation); resume.setNationality(nationality); resume.setOperatingTime(operatingTime); resume.setOperator(operator); resume.setOther(other); resume.setPersonalAge(personalAge); resume.setPersonalName(personalName); resume.setPersonalSex(personalSex); resume.setPhoneNum(phoneNum); resume.setResumeState(resumeState); resume.setSourceCompany(sourceCompany); resume.setWorkSeniority(workSeniority); return resume; } public String addresume() throws Exception { Resume resume = this.backresume(); resumeService.save(resume); Pageres pageres = this.pageser(); list = resumeService.queryresumelist(resume,pageres,workSeniority1,workSeniority2,pageNo,pageSize); return SUCCESS; } Resume简历为主表,EducationBackground为简历从表教育背景表,两个表都有主外键关系, @OneToMany(fetch = FetchType.EAGER,targetEntity=EducationBackground.class,cascade={CascadeType.ALL},orphanRemoval=true) // @Cascade(value={org.hibernate.annotations.CascadeType.ALL}) // @NotFound(action = NotFoundAction.IGNORE) @JoinColumn(name="resume_id") public List<EducationBackground> getEducationBackground() { return educationBackground; } public void setEducationBackground(List<EducationBackground> educationBackground) { this.educationBackground = educationBackground; } @ManyToOne(targetEntity=Resume.class,fetch = FetchType.EAGER) @JoinColumn(name="resume_id",referencedColumnName="resumeID", insertable=true, updatable=true) public Resume getResume() { return resume; } public void setResume(Resume resume) { this.resume = resume; } 数据访问层的sava()方法; @Override public void save(Resume resume) { Session session = sessionFactory.openSession(); //Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); //session.persist(resume); //session.save(resume); session.persist(resume); tx.commit(); session.close(); } 当我在action中手动添加教育背景的数据时,数据为多条,可以插入数据库,但是我换成jsp动态添加时 就报上面的错误,是怎么回事啊 ?? 求大神帮帮忙,万分感谢!

关于监听多次触发的问题

求助各路大神 此处有一个登录验证的小程序,里面有个登录按钮设有监听,按钮监听里有一个验证函数,第一次跑程序,验证涵数没问题但如果第一次验证失败,当第二次触发监听后,验证数就会莫名其妙的跳过去,(我想可能和验证函数第一次返回NULL有关),如过真是这样,我该怎么样解决 监听位置位于LoadActivity.class中的 bt_load.setOnclickListener()内 ``` //登录函数 LoadActivity package cn.edu.nuc.skid_menu; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.content.DialogInterface; import java.util.List; import cn.edu.nuc.skid_menu.sqlite_utils.utils; /** * Created by Administrator on 2017/6/9. */ public class LoadActivity extends Activity{ private EditText met_name; private EditText met_pw; private Button bt_load; private Button bt_register; private cn.edu.nuc.skid_menu.sqlite_utils.utils utils; private List list; @Override protected void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_load); met_name = (EditText) findViewById(R.id.et_name); met_pw = (EditText) findViewById(R.id.et_pw); bt_load = (Button) findViewById(R.id.bt_load); bt_register = (Button) findViewById(R.id.bt_register); utils = new utils(LoadActivity.this); //String s= utils.execDate("delete from db_user where _id = ? ",new Object[]{"wsy123"});//增删改数据 //Log.i("wsy", s+""); utils.insert("wsy123","123456","male","运汽集团");//插入数据库 // utils.db.delete("db_user","_id = ?",new String[]{"wsy"});//删除数据 //utils.update();//更改数据 list = utils.selectAll(); utils.show_list(list);//显示数据库 Log.i("wsy", "分开!"); //String i ="wsy12345"; //List list1 = utils.select(i); //utils.show_list(list1); //显示_id为wsy12345的信息 // list = utils.select(met_name.getText().toString()); //!!!!!!!!就是这个监听!!!!!!!!!!!!!!!!!! bt_load.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("wsy", "触发登录监听"); String checkResult=checkInfo(); //!!!!!!!二次验证上面的函数checkInfo会被跳过!!!!!!! Log.i("wsy", "完成验证"); list = utils.select(met_name.getText().toString()); if(checkResult==null){ Intent intent=new Intent(LoadActivity.this,Main_activity.class); startActivity(intent); Log.i("wsy", "发送成功"); } else{ Log.i("wsy", "发送失败"); AlertDialog.Builder builder=new AlertDialog.Builder(LoadActivity.this); builder.setTitle("错误提示"); builder.setMessage(checkResult); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { met_pw.setText(""); met_name.setText(""); } }); builder.create().show(); } } }); bt_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(LoadActivity.this,RegisterActivity.class); startActivity(intent); } }); } private String checkInfo(){ if(met_name.getText().toString()==null||met_name.getText().toString().equals("")){ Log.i("wsy", "用户名不能为空!"); return "用户名不能为空"; } if(met_pw.getText().toString().trim().length()<6||met_pw.getText().toString().equals("")||met_pw.getText().toString().trim().length()>15){ Log.i("wsy", "密码长度为6-15位"); return "密码长度为6-15位"; } if(utils.select(met_name.getText().toString()).size()==0) { Log.i("wsy", "账号不存在"); return "账号不存在"; } if(!met_pw.getText().toString().trim().equals(utils.test_list(list).toString().trim())) { Log.i("wsy", "密码错误"); return "密码错误";} Log.i("wsy", "可以登录"); return null; } } //数据库管理工具 utils. package cn.edu.nuc.skid_menu.sqlite_utils; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.Cursor; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class utils extends SQLiteOpenHelper { SQLiteDatabase db = null; private final static String DBNAME = "db_user"; private final static int VERSION = 1; public utils(Context context) { super(context, DBNAME, null, VERSION); db = this.getReadableDatabase(); } public Cursor selectCursor(String sql, String[] selectionArgs) { return db.rawQuery(sql, selectionArgs); } public int selectCount(String sql, String[] selectionArgs) { Cursor cursor = db.rawQuery(sql, selectionArgs); int result = cursor.getCount(); if (cursor != null) { cursor.close(); } return result; } public List<Map<String, Object>> selectAll() { Log.i("wsy", "小成 1"); Cursor cursor = db.rawQuery("select * from db_user limit ?,? ", new String[]{"0", "999"}); Log.i("wsy", "小成2 "); return cursorToList(cursor); } public List<Map<String, Object>> select(String i) { Log.i("wsy", "成1"); String[] strings = {i}; Cursor cursor = db.query("db_user",new String[]{"_id","password","sex","school_name"},"_id =?",strings,null,null,"_id desc","0,5"); Log.i("wsy", "成2 "); return cursorToList(cursor); } public List<Map<String, Object>> cursorToList(Cursor cursor) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); while (cursor.moveToNext()) { Log.i("wsy", "有数据 "); Map<String, Object> map = new HashMap<String, Object>(); for (int i = 0; i < cursor.getColumnCount(); i++) { map.put(cursor.getColumnName(i), cursor.getString(i)); } list.add(map); } return list; } public String execDate(String sql, Object[] bindArgs) { try { db.execSQL(sql, bindArgs); return "成功"; } catch (Exception e) { return e.getMessage(); } } public void destroy() { if (db != null) { db.close(); } } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS db_user (_id VARCHAR(10) PRIMARY KEY ,password,sex,school_name)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { db.execSQL("DROP TABLE IF EXISTS db_users"); onCreate(db); } } public void show_list(List list) { Map map = null; String netMode1 = null; String netMode2 = null; String netMode3 = null; String netMode4 = null; for (int i = 0; i < list.size(); i++) { map = (HashMap) list.get(i); netMode1 = (String) map.get("_id"); if (netMode1 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "_id:" + netMode1); } netMode2 = (String) map.get("password"); if (netMode2 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "password:" + netMode2); } netMode3 = (String) map.get("sex"); if (netMode3 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "sex:" + netMode3); } netMode4 = (String) map.get("school_name"); if (netMode4 == null) { Log.i("wsy", "空了"); } else { Log.i("wsy", "school_name:" + netMode4); } } } public void insert(String s1,String s2,String s3,String s4) { ContentValues values = new ContentValues(); values.put("_id", s1); values.put("password", s2); values.put("sex", s3); values.put("school_name", s4); long rowId = db.insert("db_user", null, values); } public void update() { ContentValues values = new ContentValues(); values.put("_id", "wsy"); values.put("password", "a123a123"); values.put("sex", "female"); values.put("school_name", "运气集团"); int result = db.update("db_user", values, "_id=?", new String[]{"wsy"}); } public SQLiteDatabase get_db(){ return db; } public String test_list(List list){ Map map = null; String netMode2 = null; map = (HashMap) list.get(0); netMode2 = (String) map.get("password"); return netMode2; } } //登录成功后的界面activity public class Main_activity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); Intent intent = getIntent(); } } //登录页面 activity_load.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.edu.nuc.skid_menu.LoadActivity" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="驾考通" android:textSize="40sp" android:layout_gravity="center" android:textColor="#00cc00" android:layout_marginTop="120dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一考就通" android:textSize="25sp" android:layout_marginRight="15dp" android:layout_gravity="right" android:textColor="#CC0000" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="账号 : " android:textSize="24sp" android:textColor="#000000" android:layout_marginLeft="15dp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/et_name" android:hint="请输入账号" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码 : " android:textSize="24sp" android:textColor="#000000" android:layout_marginLeft="15dp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/et_pw" android:hint="请输入密码" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" android:textColor="#000000" android:textSize="20sp" android:layout_marginTop="15dp" android:id="@+id/bt_load"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册" android:textColor="#000000" android:textSize="20sp" android:layout_marginTop="15dp" android:id="@+id/bt_register"/> </LinearLayout> </LinearLayout> //登录成功后的界面 Activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#6699ff" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="王绍阳,欢迎您" android:textSize="30sp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顺序刷题" android:layout_marginTop="40dp" android:textSize="30sp" android:id="@+id/bt_question" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="错题攻克" android:layout_marginTop="20dp" android:textSize="30sp" android:id="@+id/bt_dif_question" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改信息" android:layout_marginTop="20dp" android:textSize="30sp" android:id="@+id/bt_revise" /> </LinearLayout>

在界面上连续按F5刷新Tomcat报错,显示连接池已满

错误信息:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object Tomcat与数据库使用连接池,封装在一个类里面: public class BaseDAO { private Connection conn = null; private ResultSet rs = null; private Statement stmt = null; private PreparedStatement pstmt = null; //1)、获取数据库连接对象 private Connection getConnection(){ try { Context context = new InitialContext(); DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/sms"); conn = dataSource.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return this.conn; } //2)、获得结果集 public ResultSet executeQuery(String sql){ try { conn = getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } /* * 执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数 */ public ResultSet executeQuery(String sql,Object ... paramValues){ try { conn = getConnection(); pstmt = conn.prepareStatement(sql); if(paramValues != null){ for (int i = 0; i < paramValues.length; i++) { pstmt.setObject((i+1), paramValues[i]); } } rs = pstmt.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } //3)、用来执行一个不需要置换参数的更新(插入、更新或删除)操作。 public int executeUpdate(String sql){ int affectedRows = 0; try { conn = getConnection(); stmt = conn.createStatement(); affectedRows = stmt.executeUpdate(sql); } catch (Exception e) { e.printStackTrace(); }finally{ closeAll(null,stmt,null,conn); } return affectedRows; } //用来执行一个需要置换参数的更新(插入、更新或删除)操作。 public int executeUpdate(String sql,Object ... paramValues){ int affectedRows = 0; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); if(paramValues != null){ for (int i = 0; i < paramValues.length; i++) { pstmt.setObject((i+1), paramValues[i]); } } affectedRows = pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ closeAll(null,null,pstmt,conn); } return affectedRows; } //(5)通用查询工具方法 public List<Map<Object,Object>> query(String sql,Object ...paramValues){ List<Map<Object,Object>> list = new ArrayList<Map<Object,Object>>(); try { conn = getConnection(); pstmt = conn.prepareStatement(sql); if(paramValues != null){ for (int i = 0; i < paramValues.length; i++) { pstmt.setObject((i+1), paramValues[i]); } } rs = pstmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); //获取元数据 while(rs.next()){ Map<Object,Object> map = new HashMap<Object,Object>(); for (int j = 1; j <= rsmd.getColumnCount(); j++) { //获取列名 String columnLabel = rsmd.getColumnLabel(j); //根据列名从结果集中获取对应的列值 Object columnValue = rs.getObject(columnLabel); map.put(columnLabel, columnValue); } //end for list.add(map); }//end while } catch (SQLException e) { e.printStackTrace(); }finally{ closeAll(rs,null,pstmt,conn); } return list; } //4)、释放资源 public void closeAll(ResultSet rs,Statement stmt,PreparedStatement pstmt,Connection conn){ if(rs!=null){ try{ //关闭存储查询结果的ResultSet对象 rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(stmt!=null){ try{ //关闭负责执行SQL命令的Statement对象 stmt.close(); }catch (Exception e) { e.printStackTrace(); } } if(pstmt!=null){ try{ //关闭负责执行SQL命令的PreparedStatement对象 pstmt.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ //将Connection连接对象还给数据库连接池 conn.close(); }catch (Exception e) { e.printStackTrace(); } } } } 执行查询时ResultSet的实例rs在调用后就关闭了,但是无法关闭Connection的实例conn 和Statement的实例stmt

使用JAX-RS框架搭建WebService使用Hibernate访问MySQL出现不能实例化类问题

问题描述:大体思路是这样,我最近在做IOS开发想通过WebService访问服务器端数据库的数据,所以想使用Java搭建一个WebService于是在网上找资料使用Java实现的框架JAX-RS.代码如下: ## com.hnu.hibernate.bean包下的Student.java类 package com.hnu.hibernate.bean; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.OneToMany; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @Entity @Table(name="student") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer userid; @Column(name="username") private String username; @Column(name="password") private String password; @Column(name="realname") private String realname; @Column(name="age") private Integer age; @Column(name="nationality") private String nationality; @Column(name="language") private String language; @Column(name="year") private float year; @Column(name="studyabroadschool") private String studyabroadschool; public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getNationality() { return nationality; } public void setNationality(String nationality) { this.nationality = nationality; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public float getYear() { return year; } public void setYear(float year) { this.year = year; } public String getStudyabroadschool() { return studyabroadschool; } public void setStudyabroadschool(String studyabroadschool) { this.studyabroadschool = studyabroadschool; } } ## com.hnu.hibernate.dao包 package com.hnu.hibernate.dao; import java.io.Serializable; import java.util.List; import org.hibernate.Session; import com.hnu.hibernate.util.HibernateSessionFactory; import com.hnu.hibernate.util.HibernateUtil; public class BaseDAO<T> { /** * 插入数据 * * @param object */ public int create(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.persist(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 更新数据库 * * @param object */ public int update(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.update(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 从数据库中删除 * * @param object */ public int delete(T object) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); session.delete(object); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); return 0; } finally { session.close(); } return 1; } /** * 查找单个Entity Bean * * @param clazz * @param id * @return */ @SuppressWarnings("unchecked") public T find(Class<? extends T> clazz, Serializable id) { Session session = HibernateSessionFactory.getSession(); try { session.beginTransaction(); return (T) session.get(clazz, id); } finally { session.getTransaction().commit(); session.close(); } } /** * 查找多个Entity Bean * * @param hql * @return */ @SuppressWarnings("unchecked") public List<T> list(String hql) { Session session =HibernateSessionFactory.getSession(); try { session.beginTransaction(); return session.createQuery(hql).list(); } finally { session.getTransaction().commit(); session.close(); } } } ## com.hnu.hibernate.bean包下生成的WebService Javabean StudentsResource.java类 package com.hnu.hibernate.bean; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import com.hnu.hibernate.dao.BaseDAO; @Produces("application/xml") @Path("students") public class StudentsResource { private BaseDAO<Student> baseDAO=new BaseDAO<Student>(); @GET public List<Student> getStudents() { return baseDAO.list("from Student"); } } ## com.hnu.hibernate.util包下Hibernate获取Session的类 HibernateSessionFactory.java类 package com.hnu.hibernate.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */ public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static org.hibernate.SessionFactory sessionFactory; private static Configuration configuration = new Configuration(); private static ServiceRegistry serviceRegistry; static { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private HibernateSessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory * */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } /** * return hibernate configuration * */ public static Configuration getConfiguration() { return configuration; } } ## hibernate.cfg.xml部署文件 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="hbm2ddl.auto">update</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql://localhost:3306/vocabularyadaptivetestingsystem?characterEncoding=UTF-8</property> <property name="connection.username">root</property> <property name="connection.password">123</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="show_sql">true</property> <property name="current_session_context_class">thread</property> <mapping class="com.hnu.hibernate.bean.Student"/> </session-factory> </hibernate-configuration> 使用本地的ApplicationServer使用Hibernate访问数据库没有任何问题。但是一旦把访问Hibernate的方法部署到Tomcat服务器上,访问WebService方法没有问题,但是使用WebService调用如下代码:baseDAO.list("from Student"); 就出现了如图所示的错误: ![图片说明](https://img-ask.csdn.net/upload/201607/20/1468960531_454273.png) 希望各位高手帮忙看一下,搞了好久没搞出来,重分酬谢!

初学hibernate,简单地用了一下SSH2,出现一种难明的错误

用《开发者突击》里面的初步搭建SSH2的代码,连接sqlserver2005,出现下面提示: Hibernate: select user0_.ID as ID, user0_.username as username0_, user0_.password as password0_, user0_.email as email0_ from user user0_ where user0_.username=? WARN - SQL Error: 156, SQLState: S0001 ERROR - 关键字 'user' 附近有语法错误。 2010-12-28 22:22:11 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet default threw exception com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'user' 附近有语法错误。 数据库中我建了表 user,属性有id username password email。 applicationContext 代码如下: [code="xml"] <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=DeviceManagement;"> </property> <property name="username" value="sa"></property> <property name="password" value="123456"></property> </bean> <!-- 配置Hibernate --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/demo/hibernate/beans/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServerDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <!-- 配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- 定义DAO --> <bean id="userDAO" class="com.demo.hibernate.dao.UserDAO"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- 定义DAO代理 --> <bean id="UserDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref local="userDAO" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <!-- 定义Struts配置 --> <bean name="loginAction" class="com.demo.struts2.actions.LoginAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <bean name="logoutAction" class="com.demo.struts2.actions.LogoutAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <bean name="registerAction" class="com.demo.struts2.actions.RegisterAction"> <property name="userDAO"> <ref local="userDAO" /> </property> </bean> <!-- 配置拦截器 --> <bean name="logger" class="com.demo.spring.aop.LoggingInterceptor" /> <!-- 配置拦截器代理 --> <bean name="loggingAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>/login</value> <value>/register</value> </list> </property> <property name="interceptorNames"> <list> <value>logger</value> </list> </property> </bean> [/code] [size=x-large]提示错误行在UserDao里面, [/size]UserDao [code="java"] package com.demo.hibernate.dao; import java.util.ArrayList; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.demo.hibernate.beans.User; public class UserDAO extends HibernateDaoSupport implements IUserDAO { // 验证用户名和密码 public boolean isValid(final String username, final String password) { System.out.println("UserDao检验是否有效"); System.err.println("username:"+username+",password:"+password); List list = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { /////////////////////////////////////这里报错/////////////////////////////// List result = session.createCriteria(User.class).add( Restrictions.eq("username", username)).add( Restrictions.eq("password", password)).list(); return result; } }); if (list.size() > 0) { return true; } else { return false; } } // 判断某个用户是否存在,只需用用户名查询就可以 public boolean isExist(final String username) { System.err.println("UserDao进行查询"); List list = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { List result = session.createCriteria(User.class).add( Restrictions.eq("username", username)).list(); return result; } }); if (list.size() > 0) { return true; } else { return false; } } //插入新的用户对象到数据库 public void insertUser(User user) { System.err.println("UserDao插入数据"); getHibernateTemplate().saveOrUpdate(user); } //从数据库中取得用户对象 public User getUser(String userid) { System.err.println("UserDao取得对象"); return (User) getHibernateTemplate().get(User.class, new Integer(userid)); } //取得用户所有详细信息 public List getUsers() { System.err.println("UserDao取得数据"); return getHibernateTemplate().find("from User"); } //删除某个用户的所有信息 public void deleteUser(String userid) { System.err.println("UserDao删除某个用户的所有信息"); Object p = getHibernateTemplate().load(User.class, new Integer(userid)); getHibernateTemplate().delete(p); } } [/code] 请问这是为什么呢?

定量遥感中文版 梁顺林著 范闻捷译

这是梁顺林的定量遥感的中文版,由范闻捷等翻译的,是电子版PDF,解决了大家看英文费时费事的问题,希望大家下载看看,一定会有帮助的

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

远程工具,免费

远程工具,免费

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

csma/ca和csma/cd的matlab仿真源代码带有详细的注释

csma/ca和csma/cd的matlab仿真源代码带有详细的注释,载波侦听,随意设置节点数,带有炫酷的图形展示效果。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

pokemmo的资源

pokemmo必须的4个rom 分别为绿宝石 火红 心金 黑白 还有汉化补丁 资源不错哦 记得下载

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Java8零基础入门视频教程

这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

想学好JAVA必须要报两万的培训班吗? Java大神勿入 如果你: 零基础想学JAVA却不知道从何入手 看了一堆书和视频却还是连JAVA的环境都搭建不起来 囊中羞涩面对两万起的JAVA培训班不忍直视 在职没有每天大块的时间专门学习JAVA 那么恭喜你找到组织了,在这里有: 1. 一群志同道合立志学好JAVA的同学一起学习讨论JAVA 2. 灵活机动的学习时间完成特定学习任务+每日编程实战练习 3. 热心助人的助教和讲师及时帮你解决问题,不按时完成作业小心助教老师的家访哦 上一张图看看前辈的感悟: &nbsp; &nbsp; 大家一定迫不及待想知道什么是极简JAVA学习营了吧,下面就来给大家说道说道: 什么是极简JAVA学习营? 1. 针对Java小白或者初级Java学习者; 2. 利用9天时间,每天1个小时时间; 3.通过 每日作业 / 组队PK / 助教答疑 / 实战编程 / 项目答辩 / 社群讨论 / 趣味知识抢答等方式让学员爱上学习编程 , 最终实现能独立开发一个基于控制台的‘库存管理系统’ 的学习模式 极简JAVA学习营是怎么学习的? &nbsp; 如何报名? 只要购买了极简JAVA一:JAVA入门就算报名成功! &nbsp;本期为第四期极简JAVA学习营,我们来看看往期学员的学习状态: 作业看这里~ &nbsp; 助教的作业报告是不是很专业 不交作业打屁屁 助教答疑是不是很用心 &nbsp; 有奖抢答大家玩的很嗨啊 &nbsp; &nbsp; 项目答辩终于开始啦 &nbsp; 优秀者的获奖感言 &nbsp; 这是答辩项目的效果 &nbsp; &nbsp; 这么细致的服务,这么好的氛围,这样的学习效果,需要多少钱呢? 不要1999,不要199,不要99,只要9.9 是的你没听错,只要9.9以上所有就都属于你了 如果你: 1、&nbsp;想学JAVA没有基础 2、&nbsp;想学JAVA没有整块的时间 3、&nbsp;想学JAVA没有足够的预算 还等什么?赶紧报名吧,抓紧抢位,本期只招300人,错过只有等时间待定的下一期了 &nbsp; 报名请加小助手微信:eduxy-1 &nbsp; &nbsp;

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

HoloLens2开发入门教程

本课程为HoloLens2开发入门教程,讲解部署开发环境,安装VS2019,Unity版本,Windows SDK,创建Unity项目,讲解如何使用MRTK,编辑器模拟手势交互,打包VS工程并编译部署应用到HoloLens上等。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干 目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

Ubuntu18.04安装教程

Ubuntu18.04.1安装一、准备工作1.下载Ubuntu18.04.1 LTS2.制作U盘启动盘3.准备 Ubuntu18.04.1 的硬盘空间二、安装Ubuntu18.04.1三、安装后的一些工作1.安装输入法2.更换软件源四、双系统如何卸载Ubuntu18.04.1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列...

sql语句 异常 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your

在我们开发的工程中,有时候会报 [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ------ 这种异常 不用多想,肯定是我们的sql语句出现问题,下面...

西南交通大学新秀杯数学建模试题

题目比较难,如果符合大家的口味欢迎大家下载哈,提高你的思维想象能力

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

Spring Boot -01- 快速入门篇(图文教程)

Spring Boot -01- 快速入门篇 今天开始不断整理 Spring Boot 2.0 版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到【慕课网】手机 app,去找【Spring Boot 2.0 深度实践】的课程,令人开心的是,课程完全免费! 什么是 Spring Boot? Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot...

相关热词 c# 解析cad c#数字格式化万 c#int转byte c#格式化日期 c# wpf 表格 c# 实现ad域验证登录 c#心跳包机制 c#使用fmod.dll c#dll vb 调用 c# outlook
立即提问
相关内容推荐