Android sqlite数据库操作通用框架AHibernate(二)源码-用于交流

贴出源代码供大家交流使用,欢迎朋友们对代码提供宝贵意见,直接写到评论中即可.使用示例和步骤见上一篇博客:http://blog.csdn.net/lk_blog/article/details/7455992

源码和示例下载地址: http://download.csdn.net/detail/lk_blog/4222048

(一)注解类:Table.java
[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.annotation;  import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Retention(RetentionPolicy.RUNTIME)  
@Target( { java.lang.annotation.ElementType.TYPE })  
public @interface Table {  /** * 表名 *  * @return */  public abstract String name();  
}</span>  
Column.java[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.annotation;  import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Retention(RetentionPolicy.RUNTIME)  
@Target( { java.lang.annotation.ElementType.FIELD })  
public @interface Column {  /** * 列名 *  * @return */  public abstract String name();  public abstract String type() default "";  public abstract int length() default 0;  
}</span>  
Id.java
[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.annotation;  import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Retention(RetentionPolicy.RUNTIME)  
@Target( { java.lang.annotation.ElementType.FIELD })  
public @interface Id {  
}</span>  
(二)Util类:TableHelper.java[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.util;  import android.database.sqlite.SQLiteDatabase;  
import android.util.Log;  import java.lang.reflect.Field;  
import java.sql.Blob;  
import java.util.ArrayList;  
import java.util.LinkedHashMap;  
import java.util.List;  
import java.util.Map;  import com.tgb.lk.ahibernate.annotation.Column;  
import com.tgb.lk.ahibernate.annotation.Id;  
import com.tgb.lk.ahibernate.annotation.Table;  public class TableHelper {  private static final String TAG = "AHibernate";  public static <T> void createTablesByClasses(SQLiteDatabase db,  Class<?>[] clazzs) {  for (Class<?> clazz : clazzs)  createTable(db, clazz);  }  public static <T> void dropTablesByClasses(SQLiteDatabase db,  Class<?>[] clazzs) {  for (Class<?> clazz : clazzs)  dropTable(db, clazz);  }  public static <T> void createTable(SQLiteDatabase db, Class<T> clazz) {  String tableName = "";  if (clazz.isAnnotationPresent(Table.class)) {  Table table = (Table) clazz.getAnnotation(Table.class);  tableName = table.name();  }  StringBuilder sb = new StringBuilder();  sb.append("CREATE TABLE ").append(tableName).append(" (");  List<Field> allFields = TableHelper  .joinFields(clazz.getDeclaredFields(), clazz.getSuperclass()  .getDeclaredFields());  for (Field field : allFields) {  if (!field.isAnnotationPresent(Column.class)) {  continue;  }  Column column = (Column) field.getAnnotation(Column.class);  String columnType = "";  if (column.type().equals(""))  columnType = getColumnType(field.getType());  else {  columnType = column.type();  }  sb.append(column.name() + " " + columnType);  if (column.length() != 0) {  sb.append("(" + column.length() + ")");  }  if (((field.isAnnotationPresent(Id.class)) && (field.getType() == Integer.TYPE))  || (field.getType() == Integer.class))  sb.append(" primary key autoincrement");  else if (field.isAnnotationPresent(Id.class)) {  sb.append(" primary key");  }  sb.append(", ");  }  sb.delete(sb.length() - 2, sb.length() - 1);  sb.append(")");  String sql = sb.toString();  Log.d(TAG, "crate table [" + tableName + "]: " + sql);  db.execSQL(sql);  }  public static <T> void dropTable(SQLiteDatabase db, Class<T> clazz) {  String tableName = "";  if (clazz.isAnnotationPresent(Table.class)) {  Table table = (Table) clazz.getAnnotation(Table.class);  tableName = table.name();  }  String sql = "DROP TABLE IF EXISTS " + tableName;  Log.d(TAG, "dropTable[" + tableName + "]:" + sql);  db.execSQL(sql);  }  private static String getColumnType(Class<?> fieldType) {  if (String.class == fieldType) {  return "TEXT";  }  if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) {  return "INTEGER";  }  if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {  return "BIGINT";  }  if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {  return "FLOAT";  }  if ((Short.TYPE == fieldType) || (Short.class == fieldType)) {  return "INT";  }  if ((Double.TYPE == fieldType) || (Double.class == fieldType)) {  return "DOUBLE";  }  if (Blob.class == fieldType) {  return "BLOB";  }  return "TEXT";  }  // 合并Field数组并去重,并实现过滤掉非Column字段,和实现Id放在首字段位置功能  public static List<Field> joinFields(Field[] fields1, Field[] fields2) {  Map<String, Field> map = new LinkedHashMap<String, Field>();  for (Field field : fields1) {  // 过滤掉非Column定义的字段  if (!field.isAnnotationPresent(Column.class)) {  continue;  }  Column column = (Column) field.getAnnotation(Column.class);  map.put(column.name(), field);  }  for (Field field : fields2) {  // 过滤掉非Column定义的字段  if (!field.isAnnotationPresent(Column.class)) {  continue;  }  Column column = (Column) field.getAnnotation(Column.class);  if (!map.containsKey(column.name())) {  map.put(column.name(), field);  }  }  List<Field> list = new ArrayList<Field>();  for (String key : map.keySet()) {  Field tempField = map.get(key);  // 如果是Id则放在首位置.  if (tempField.isAnnotationPresent(Id.class)) {  list.add(0, tempField);  } else {  list.add(tempField);  }  }  return list;  }  
}</span>  
MyDBHelper.java
[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.util;  import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  public class MyDBHelper extends SQLiteOpenHelper {  private Class<?>[] modelClasses;  public MyDBHelper(Context context, String databaseName,  SQLiteDatabase.CursorFactory factory, int databaseVersion,  Class<?>[] modelClasses) {  super(context, databaseName, factory, databaseVersion);  this.modelClasses = modelClasses;  }  public void onCreate(SQLiteDatabase db) {  TableHelper.createTablesByClasses(db, this.modelClasses);  }  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  TableHelper.dropTablesByClasses(db, this.modelClasses);  onCreate(db);  }  
}</span>  
(三)接口和实现:
BaseDao.java[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.dao;  import java.util.List;  
import java.util.Map;  import android.database.sqlite.SQLiteOpenHelper;  public interface BaseDao<T> {  public SQLiteOpenHelper getDbHelper();  public abstract long insert(T entity);  public abstract void delete(int id);  public abstract void delete(Integer... ids);  public abstract void update(T entity);  public abstract T get(int id);  public abstract List<T> rawQuery(String sql, String[] selectionArgs);  public abstract List<T> find();  public abstract List<T> find(String[] columns, String selection,  String[] selectionArgs, String groupBy, String having,  String orderBy, String limit);  public abstract boolean isExist(String sql, String[] selectionArgs);  /** * 将查询的结果保存为名值对map. *  * @param sql *            查询sql * @param selectionArgs *            参数值 * @return 返回的Map中的key全部是小写形式. */  public List<Map<String, String>> query2MapList(String sql,  String[] selectionArgs);  /** * 封装执行sql代码. * @param sql * @param selectionArgs */  public void execSql(String sql, Object[] selectionArgs);  }</span>  BaseDaoImpl.java
[java] view plaincopy
<span style="font-size:18px;">package com.tgb.lk.ahibernate.dao.impl;  import android.content.ContentValues;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  
import android.util.Log;  
import java.lang.reflect.Field;  
import java.sql.Blob;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  import com.tgb.lk.ahibernate.annotation.Column;  
import com.tgb.lk.ahibernate.annotation.Id;  
import com.tgb.lk.ahibernate.annotation.Table;  
import com.tgb.lk.ahibernate.dao.BaseDao;  
import com.tgb.lk.ahibernate.util.TableHelper;  /** * AHibernate概要 <br/> * (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表. 2.自动支持增删改 * ,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作. * 3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式. * 4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架. * 5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些. * 6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数. <br/> * (二)不足之处: <br/> * 1.id暂时只支持int类型,不支持uuid,在sqlite中不建议用uuid. * 2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务. <br/> * (三)作者寄语:<br/> * 昔日有JavaScript借Java发展,今日也希望AHibernate借Hibernate之名发展. * 希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利. * 欢迎访问我的博客:http://blog.csdn.net/lk_blog, * 这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动中国开源事业的发展,AHibernate期待与您共创美好未来!!! */  
public class BaseDaoImpl<T> implements BaseDao<T> {  private String TAG = "AHibernate";  private SQLiteOpenHelper dbHelper;  private String tableName;  private String idColumn;  private Class<T> clazz;  private List<Field> allFields;  public BaseDaoImpl(SQLiteOpenHelper dbHelper) {  this.dbHelper = dbHelper;  this.clazz = ((Class<T>) ((java.lang.reflect.ParameterizedType) super  .getClass().getGenericSuperclass()).getActualTypeArguments()[0]);  if (this.clazz.isAnnotationPresent(Table.class)) {  Table table = (Table) this.clazz.getAnnotation(Table.class);  this.tableName = table.name();  }  // 加载所有字段  this.allFields = TableHelper.joinFields(this.clazz.getDeclaredFields(),  this.clazz.getSuperclass().getDeclaredFields());  // 找到主键  for (Field field : this.allFields) {  if (field.isAnnotationPresent(Id.class)) {  Column column = (Column) field.getAnnotation(Column.class);  this.idColumn = column.name();  break;  }  }  Log.d(TAG, "clazz:" + this.clazz + " tableName:" + this.tableName  + " idColumn:" + this.idColumn);  }  public SQLiteOpenHelper getDbHelper() {  return dbHelper;  }  public T get(int id) {  String selection = this.idColumn + " = ?";  String[] selectionArgs = { Integer.toString(id) };  Log.d(TAG, "[get]: select * from " + this.tableName + " where "  + this.idColumn + " = '" + id + "'");  List<T> list = find(null, selection, selectionArgs, null, null, null,  null);  if ((list != null) && (list.size() > 0)) {  return (T) list.get(0);  }  return null;  }  public List<T> rawQuery(String sql, String[] selectionArgs) {  Log.d(TAG, "[rawQuery]: " + sql);  List<T> list = new ArrayList<T>();  SQLiteDatabase db = null;  Cursor cursor = null;  try {  db = this.dbHelper.getReadableDatabase();  cursor = db.rawQuery(sql, selectionArgs);  getListFromCursor(list, cursor);  } catch (Exception e) {  Log.e(this.TAG, "[rawQuery] from DB Exception.");  e.printStackTrace();  } finally {  if (cursor != null) {  cursor.close();  }  if (db != null) {  db.close();  }  }  return list;  }  public boolean isExist(String sql, String[] selectionArgs) {  Log.d(TAG, "[isExist]: " + sql);  SQLiteDatabase db = null;  Cursor cursor = null;  try {  db = this.dbHelper.getReadableDatabase();  cursor = db.rawQuery(sql, selectionArgs);  if (cursor.getCount() > 0) {  return true;  }  } catch (Exception e) {  Log.e(this.TAG, "[isExist] from DB Exception.");  e.printStackTrace();  } finally {  if (cursor != null) {  cursor.close();  }  if (db != null) {  db.close();  }  }  return false;  }  public List<T> find() {  return find(null, null, null, null, null, null, null);  }  public List<T> find(String[] columns, String selection,  String[] selectionArgs, String groupBy, String having,  String orderBy, String limit) {  Log.d(TAG, "[find]");  List<T> list = new ArrayList<T>();  SQLiteDatabase db = null;  Cursor cursor = null;  try {  db = this.dbHelper.getReadableDatabase();  cursor = db.query(this.tableName, columns, selection,  selectionArgs, groupBy, having, orderBy, limit);  getListFromCursor(list, cursor);  } catch (Exception e) {  Log.e(this.TAG, "[find] from DB Exception");  e.printStackTrace();  } finally {  if (cursor != null) {  cursor.close();  }  if (db != null) {  db.close();  }  }  return list;  }  private void getListFromCursor(List<T> list, Cursor cursor)  throws IllegalAccessException, InstantiationException {  while (cursor.moveToNext()) {  T entity = this.clazz.newInstance();  for (Field field : this.allFields) {  Column column = null;  if (field.isAnnotationPresent(Column.class)) {  column = (Column) field.getAnnotation(Column.class);  field.setAccessible(true);  Class<?> fieldType = field.getType();  int c = cursor.getColumnIndex(column.name());  if (c < 0) {  continue; // 如果不存则循环下个属性值  } else if ((Integer.TYPE == fieldType)  || (Integer.class == fieldType)) {  field.set(entity, cursor.getInt(c));  } else if (String.class == fieldType) {  field.set(entity, cursor.getString(c));  } else if ((Long.TYPE == fieldType)  || (Long.class == fieldType)) {  field.set(entity, Long.valueOf(cursor.getLong(c)));  } else if ((Float.TYPE == fieldType)  || (Float.class == fieldType)) {  field.set(entity, Float.valueOf(cursor.getFloat(c)));  } else if ((Short.TYPE == fieldType)  || (Short.class == fieldType)) {  field.set(entity, Short.valueOf(cursor.getShort(c)));  } else if ((Double.TYPE == fieldType)  || (Double.class == fieldType)) {  field.set(entity, Double.valueOf(cursor.getDouble(c)));  } else if (Blob.class == fieldType) {  field.set(entity, cursor.getBlob(c));  } else if (Character.TYPE == fieldType) {  String fieldValue = cursor.getString(c);  if ((fieldValue != null) && (fieldValue.length() > 0)) {  field.set(entity, Character.valueOf(fieldValue  .charAt(0)));  }  }  }  }  list.add((T) entity);  }  }  public long insert(T entity) {  Log.d(TAG, "[insert]: inset into " + this.tableName + " "  + entity.toString());  SQLiteDatabase db = null;  try {  db = this.dbHelper.getWritableDatabase();  ContentValues cv = new ContentValues();  setContentValues(entity, cv, "create");  long row = db.insert(this.tableName, null, cv);  return row;  } catch (Exception e) {  Log.d(this.TAG, "[insert] into DB Exception.");  e.printStackTrace();  } finally {  if (db != null) {  db.close();  }  }  return 0L;  }  public void delete(int id) {  SQLiteDatabase db = this.dbHelper.getWritableDatabase();  String where = this.idColumn + " = ?";  String[] whereValue = { Integer.toString(id) };  Log.d(TAG, "[delete]: delelte from " + this.tableName + " where "  + where.replace("?", String.valueOf(id)));  db.delete(this.tableName, where, whereValue);  db.close();  }  public void delete(Integer... ids) {  if (ids.length > 0) {  StringBuffer sb = new StringBuffer();  for (int i = 0; i < ids.length; i++) {  sb.append('?').append(',');  }  sb.deleteCharAt(sb.length() - 1);  SQLiteDatabase db = this.dbHelper.getWritableDatabase();  String sql = "delete from " + this.tableName + " where "  + this.idColumn + " in (" + sb + ")";  Log.d(TAG, "[delete]: " + sql);  db.execSQL(sql, (Object[]) ids);  db.close();  }  }  public void update(T entity) {  SQLiteDatabase db = null;  try {  db = this.dbHelper.getWritableDatabase();  ContentValues cv = new ContentValues();  setContentValues(entity, cv, "update");  String where = this.idColumn + " = ?";  int id = Integer.parseInt(cv.get(this.idColumn).toString());  cv.remove(this.idColumn);  Log.d(TAG, "[update]: update " + this.tableName + " where "  + where.replace("?", String.valueOf(id)));  String[] whereValue = { Integer.toString(id) };  db.update(this.tableName, cv, where, whereValue);  } catch (Exception e) {  Log.d(this.TAG, "[update] DB Exception.");  e.printStackTrace();  } finally {  if (db != null)  db.close();  }  }  private void setContentValues(T entity, ContentValues cv, String type)  throws IllegalAccessException {  for (Field field : this.allFields) {  if (!field.isAnnotationPresent(Column.class)) {  continue;  }  Column column = (Column) field.getAnnotation(Column.class);  field.setAccessible(true);  Object fieldValue = field.get(entity);  if (fieldValue == null)  continue;  if (("create".equals(type))  && (field.isAnnotationPresent(Id.class))) {  continue;  }  cv.put(column.name(), fieldValue.toString());  }  }  /** * 将查询的结果保存为名值对map. *  * @param sql *            查询sql * @param selectionArgs *            参数值 * @return 返回的Map中的key全部是小写形式. */  public List<Map<String, String>> query2MapList(String sql,  String[] selectionArgs) {  Log.d(TAG, "[query2MapList]: " + sql);  SQLiteDatabase db = null;  Cursor cursor = null;  List<Map<String, String>> retList = new ArrayList<Map<String, String>>();  try {  db = this.dbHelper.getReadableDatabase();  cursor = db.rawQuery(sql, selectionArgs);  while (cursor.moveToNext()) {  Map<String, String> map = new HashMap<String, String>();  for (String columnName : cursor.getColumnNames()) {  map.put(columnName.toLowerCase(), cursor.getString(cursor  .getColumnIndex(columnName)));  }  retList.add(map);  }  } catch (Exception e) {  Log.e(TAG, "[query2MapList] from DB exception");  e.printStackTrace();  } finally {  if (cursor != null) {  cursor.close();  }  if (db != null) {  db.close();  }  }  return retList;  }  /** * 封装执行sql代码. *  * @param sql * @param selectionArgs */  public void execSql(String sql, Object[] selectionArgs) {  SQLiteDatabase db = null;  Log.d(TAG, "[execSql]: " + sql);  try {  db = this.dbHelper.getWritableDatabase();  if (selectionArgs == null) {  db.execSQL(sql);  } else {  db.execSQL(sql, selectionArgs);  }  } catch (Exception e) {  Log.e(TAG, "[execSql] DB exception.");  e.printStackTrace();  } finally {  if (db != null) {  db.close();  }  }  }  
}</span>  

转载于:https://www.cnblogs.com/zlja/archive/2012/04/13/2446561.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1120. 子树的最大平均值(DFS自底向上)

文章目录1. 题目2. 解题1. 题目 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子树是树中的任意节点和它的所有后代构成的集合。 树的平均值是树中节点值的总和除以节点数。 示例&#xff1a;输入&#xff1a;[5,6,1] 输出&a…

JAVA校内报纸实验_实验(实训)中心2011—2012学年第二学期工作计划

实验(实训)中心2011—2012学年第二学期工作计划在2011—2012学年第二学期里&#xff0c;实验(实训)中心将树立为教学、为教师、为学生服务的理念&#xff0c;增强管理人员工作责任心&#xff0c;以学院评建为契机&#xff0c;全面提高实验实训教学质量&#xff0c;强化主人翁意…

Java compiler level does not match the version of the installed Java project facet.

问题&#xff1a; myeclipse在problem控制台里有如下错误提示&#xff1a; Java compiler level does not match the version of the installed Java project facet. elipse这种情况一般可以在项目上右键-->properties-->然后找到project facets和 Java Compiler两个选项…

LeetCode 1100. 长度为 K 的无重复字符子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 S&#xff0c;找出所有长度为 K 且不含重复字符的子串&#xff0c;请你返回全部满足要求的子串的 数目。 示例 1&#xff1a; 输入&#xff1a;S "havefunonleetcode", K 5 输出&#xff1a;6 解释&#xff1a; 这…

java点击按钮结线程_多线程的Java应用程序在调试工具Netbeans中单击“停止”按钮时输出一个奇怪的结果...

我使用wait()和notify()机制学习了java中的多线程。但我很好奇输出一个简单的多线程Java应用程序。代码如下&#xff1a;class Q {int n;boolean valueSet false;synchronized int get() {if (!valueSet) {try {wait();} catch (InterruptedException e) {System.out.println(…

LeetCode 544. 输出比赛匹配对(NBA季后赛对阵图)

文章目录1. 题目2. 解题1. 题目 在 NBA 季后赛中&#xff0c;我们总是安排较强的队伍对战较弱的队伍&#xff0c;例如用排名第 1 的队伍和第 n 的队伍对决&#xff0c;这是一个可以让比赛更加有趣的好策略。 现在&#xff0c;给你 n 支队伍&#xff0c;你需要以字符串格式输出…

Simple IOCP Server代码解读

1&#xff0c;如何处理乱序。 按照投递Read的次序&#xff0c;收到ReadComplete时&#xff0c;看收到的buffer中序号跟连接中的序号是否相等。 不如用例子表示&#xff1a;b1&#xff0c;b2表示两个Read请求用的buffer。连接Context中序列号为0&#xff0c;b1保存的序号为0&…

java json转二进制数据_JSON字符串中的二进制数据 . 比Base64更好的东西

UTF-8的问题在于它不是最节省空间的编码 . 此外&#xff0c;一些随机二进制字节序列是无效的UTF-8编码 . 因此&#xff0c;您不能将随机二进制字节序列解释为某些UTF-8数据&#xff0c;因为它将是无效的UTF-8编码 . 这种对UTF-8编码的约束的好处在于它使得它很可靠并且可以定位…

CF 46D Parking Lot

CF_46D 由于数据范围很小&#xff0c;实际上可以直接暴力的。但为了练练线段树合并区间的操作所以就用线段树写了。 更多和线段树合并区间有关的题目可以参考胡浩的博客&#xff1a;http://www.notonlysuccess.com/index.php/segment-tree-complete/。 #include<stdio.h>…

LeetCode 1428. 至少有一个 1 的最左端列(二分查找)

文章目录1. 题目2. 解题2.1 二分查找2.2 直接走阶梯1. 题目 &#xff08;这是一个交互题&#xff09; 我们称只包含元素 0 或 1 的矩阵为二进制矩阵。 矩阵中每个单独的行都按非递减顺序排序。 给定一个这样的二进制矩阵&#xff0c;返回至少包含一个 1 的最左端列的索引&am…

Java的getcelltype用法_java getCellType的替代方法

我正在使用org.apache.poi 3.15讀取excel文件。這是我的代碼&#xff1a;try (FileInputStream fileInputStream new FileInputStream(file); XSSFWorkbook workbook new XSSFWorkbook(file)) {XSSFSheet sheet workbook.getSheetAt(0);Iterator rowIterator sheet.iterato…

网页间跳转

四种网页间跳转的方式 1、超链 2、Response.Redirect 3、Server.Transfer 4、PostBackUrl http://localhost:2035/DataReceive.aspx?namezhen&password密码 创建页面 - DataSend.aspx 添加超链接 链接地址&#xff1a;~/DataReceive.aspx?namezhen&password密码…

LeetCode 370. 区间加法(差分思想)

文章目录1. 题目2. 解题1. 题目 假设你有一个长度为 n 的数组&#xff0c;初始情况下所有的数字均为 0&#xff0c;你将会被给出 k​​​​​​​ 个更新的操作。 其中&#xff0c;每个操作会被表示为一个三元组&#xff1a;[startIndex, endIndex, inc]&#xff0c;你需要将…

2018java多线程面试题_2018年最全Java面试通关秘籍汇总集!

此套面试题适用于Java开发的各个阶段面试&#xff0c;不过更偏向初级和中级开发人员&#xff01;由于每一个问题的答案不唯一且都可以在网上搜索到答案&#xff0c;这里只给出问题&#xff0c;不列出参考答案&#xff0c;有兴趣的可以留言讨论&#xff0c;也欢迎大家的补充&…

LeetCode 1256. 加密数字(bitset)

文章目录1. 题目2. 解题1. 题目 给你一个非负整数 num &#xff0c;返回它的「加密字符串」。 加密的过程是把一个整数用某个未知函数进行转化&#xff0c;你需要从下表推测出该转化函数&#xff1a; 示例 1&#xff1a; 输入&#xff1a;num 23 输出&#xff1a;"10…

《C语言程序设计》第三章练习与习题答案

[练3-1]不需要&#xff1b;因为已经涵盖了所有可能的条件。[练3-2]#include<stdio.h>int main(void){int y;double x;printf("Enter x:");scanf("%lf",&x);if(x<0)y-1;else if(x0)y0;elsey1;printf("ysign(%f)%d\n",x,y);return 0;…

java 调用js 解析yml_nodejs库yaml读取yml或yaml配置文件

最近在使用TypeScript编写后台接口时&#xff0c;需要读取yaml配置文件&#xff0c;使用到了yaml这个nodejs库&#xff0c;其npm官网地址为&#xff1a;https://www.npmjs.com/package/yaml&#xff0c;github源代码地址为&#xff1a;github.com/eemeli/yaml比如有如下的confi…

java执行程序默认多线程吗_Java多线程 执行程序(1)

本文由作者收集整理所得&#xff0c;作者不保证内容的正确行&#xff0c;转载请标明出处。作者&#xff1a;关新全Java多线程执行程序(1)1.1Thread类static Thread.currentThread返回当前正在执行的线程对象的引用。join 等待线程终止。yield 暂停当前正在执行的线程对象&#…

LeetCode 531. 孤独像素 I

文章目录1. 题目2. 解题1. 题目 给定一幅黑白像素组成的图像, 计算黑色孤独像素的数量。 图像由一个由‘B’和‘W’组成二维字符数组表示, ‘B’和‘W’分别代表黑色像素和白色像素。 黑色孤独像素指的是在同一行和同一列不存在其他黑色像素的黑色像素。 示例: 输入: [[W,…

SSL证书配置指南

http://verisign.itrus.com.cn/html/fuwuyuzhichi/fuwuqizhengshuanzhuangpeizhizhinan/转载于:https://www.cnblogs.com/freeman-rain/archive/2012/04/27/2472856.html