網站首頁 編程語言 正文
一、創(chuàng)建數據庫 ?
1、新建數據庫幫助類
?包名——右擊——new——Java class——輸入類名:MyDBOpenHelper— —父類:SQLiteOpenHelper。
2、在數據庫幫助類中輸入代碼
public class MyDBOpenHelper extends SQLiteOpenHelper {
//定義數據庫名和版本號
private static final String DBNAME="student.db";
private static final int VERSION=1;
public MyDBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
//創(chuàng)建數據庫
@Override
public void onCreate(SQLiteDatabase db) {
//創(chuàng)建數據表
db.execSQL("create table stu_info(id INTEGER primary key autoincrement,sno varchar(10),name varchar(10),sex varchar(4),professional varchar(10),deparment varchar(20) )");
}
//升級數據庫
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
3、代碼講解 ?
(1)簡介:
? ? ? ? Android為了讓用戶能夠更加方便地管理數據庫,丏門提供了一個 SQLiteOpenHelper幫助類,借助這個類就可以非常簡單地對數據庫進行創(chuàng)建。
? ? ? ?SQLiteOpenHelper是一個抽象類,這意味著如果想使用它的話,這就需要自己 創(chuàng)建一個類去繼承他它就可以了。
例如:
public class MyDBOpenHelper extends SQLiteOpenHelper {
}
(2)方法
方法 | 作用 | 示例 |
onCreate(SQLiteDatabase db) | 創(chuàng)建數據庫 | ? |
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) | 升級數據庫 | ? |
db.execSQL( ……………… ) | 創(chuàng)建數據表 | db.execSQL(“create table stu_info (id INTEGER primary key autoincrement,sno varchar(10),..." ); |
getReadableDatabase() | 以只讀方式 打開數據庫 | db=mhelper. getReadableDatabase(); |
getWritableDatabase() | 以讀寫方式 打開數據庫 | db=mhelper.getWritableDatabase(); |
(3)構造方法
SQLiteOpenHelper中有三個構造方法可供重寫,一般使用參數少點的那個構造方 法即可,必須要有它才能對數據庫進行操作,這個構造方法中,接受4個參數:
Cursor游標結果集(本案例沒用到)
?游標是一段私有的SQL工作區(qū),即一段內存區(qū)域,用于暫時存放受SQL語句影響到的數據。通俗理解就是將受影響的數據暫時存放到一個內存區(qū)域的虛表中,這個虛表就是游標。
游標在數據庫的事務回滾中有非常重要的作用。由于對數據庫的操作會暫時存放在游標中,只要不提交,就可以根據游標中的內容進行回滾。這樣有利于數據庫的安全。
(4)總結
?integer這里都要大寫成INTEGER!!!
簡介 :
?對數據庫中的數據表的操作,一共有四種:添加、查詢、更新、刪除。每一種 操作又各自對應了一種SQL命令:insert(添加),select(查詢),update(更 新),delete(刪除)。
二、添加數據
1、界面效果
2、準備工作
(1)添加 3 個頁面
整個作品中,要完成學生信息的添加、查詢、修改、刪除四個功能。每個頁面完成某一個功能,所以,添加另外的 3 個頁面,類文件分別為:SecondActivity、ThirdActivity、 FoutActivity,
(2)準備背景圖片
選擇 4 張圖片,粘貼到工程的 drawable 文件夾下,當做 4 個頁面的背景圖片,
圖片如圖所示:
3、布局界面 activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/addbg" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信息添加頁面" android:textSize="30sp" android:textStyle="bold" android:textColor="#000000" android:layout_gravity="center" android:layout_margin="80dp"/> <EditText android:id="@+id/editText_onesno" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="學號" android:textSize="25sp"/> <EditText android:id="@+id/editText_onename" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="姓名" android:textSize="25sp"/> <EditText android:id="@+id/editText_onesex" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="性別" android:textSize="25sp"/> <EditText android:id="@+id/editText_onepro" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="專業(yè)班級" android:textSize="25sp"/> <EditText android:id="@+id/editText_onedep" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="所屬系部" android:textSize="25sp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button_oneadd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加" android:textSize="25sp" android:layout_weight="1"/> <Button android:id="@+id/button_oneclear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清除" android:textSize="25sp" android:layout_weight="1"/> </LinearLayout> <Button android:id="@+id/button_onenext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一頁" android:textSize="25sp" android:layout_gravity="right" android:layout_marginTop="30dp"/> </LinearLayout>
4、類文件代碼 MainActivity.java
public class MainActivity extends AppCompatActivity {
//定義對象
private EditText edit_onesno,edit_onename,edit_onesex,edit_onepro,edit_onedep;
private Button btn_oneadd,btn_oneclear,btn_onenext;
private MyDBOpenHelper mhelper;//定義數據庫幫助類對象
private SQLiteDatabase db;//定義一個可以操作的數據庫對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1 綁定控件
initView();
//2 添加按鈕功能的實現
btnAdd();
//3 清除和下一頁按鈕的功能
btnClearNext();
}
//綁定控件-------------代碼
private void initView() {
edit_onesno=findViewById(R.id.editText_onesno);
edit_onename=findViewById(R.id.editText_onename);
edit_onesex=findViewById(R.id.editText_onesex);
edit_onepro=findViewById(R.id.editText_onepro);
edit_onedep=findViewById(R.id.editText_onedep);
btn_oneadd=findViewById(R.id.button_oneadd);
btn_oneclear=findViewById(R.id.button_oneclear);
btn_onenext=findViewById(R.id.button_onenext);
mhelper=new MyDBOpenHelper(MainActivity.this);//實例化數據庫幫助類
db=mhelper.getWritableDatabase();//創(chuàng)建數據庫,獲取數據庫的讀寫權限
}
//2 添加按鈕功能的實現------代碼
private void btnAdd() {
btn_oneadd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//定義一個對象,構建一行數據
ContentValues values=new ContentValues();//用 value 表示一行
values.put("sno",edit_onesno.getText().toString());//把輸入的學號放到 sno 列
values.put("name",edit_onename.getText().toString());//把輸入的姓名放到 name 列
values.put("sex",edit_onesex.getText().toString());//把輸入的性別放到 sex 列
values.put("professional",edit_onepro.getText().toString());//把輸入的專業(yè)放到 professional 列
values.put("deparment",edit_onedep.getText().toString());//把輸入的系部放到 department 列
//將這一行數據存放到數據庫的數據表中。參數:(表名,某些為空的列自動賦值 null,ContentValue 對象)
db.insert("stu_info",null,values);
Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_SHORT).show();
}
});
}
//3 清除和下一頁按鈕的功能-----代碼
private void btnClearNext() {
//清除按鈕的功能
btn_oneclear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edit_onesno.setText("");
edit_onename.setText("");
edit_onesex.setText("");
edit_onepro.setText("");
edit_onedep.setText("");
}
});
//下一頁按鈕的功能
btn_onenext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
finish();
}
});
}
}
5、代碼講解
(1)插入一條數據的步驟
(2)insert()方法的三個參數
1、第一個參數表名;
2、第二個參數是某些為空的列自動賦值null;
3、第三個參數是ContentValue對象,它提供了一系列put()方法重載,用于向ContentValues中添加對象,只需要將表中的每個列名以及相應的待添加的數 據傳入即可。
(3)總結
三、查詢數據
1、界面效果圖
2、布局界面 activity_second.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/querybg" tools:context=".SecondActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信息查詢頁面" android:textSize="30sp" android:textStyle="bold" android:textColor="#000000" android:layout_gravity="center" android:layout_margin="80dp"/> <EditText android:id="@+id/editText_twosno" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入要查詢的學號" android:textSize="25sp"/> <Button android:id="@+id/button_twoquery" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查詢" android:textSize="25sp"/> <TextView android:id="@+id/textView_tworesult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顯示查詢結果" android:textSize="25sp" /> <Button android:id="@+id/button_twonext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一頁" android:textSize="25sp" android:layout_gravity="right" android:layout_marginTop="30dp"/> </LinearLayout>
3、類文件 SecondActivity.java
public class SecondActivity extends AppCompatActivity {
//定義對象
EditText edit_twosno;
Button btn_twoquery,btn_twonext;
TextView txt_tworesult;
MyDBOpenHelper mhelper;//定義一個數據庫幫助類對象
SQLiteDatabase db;//定義一個操作的數據庫的類對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//1 控件初始化
initView();
//2 查詢按鈕功能的實現
btnQuery();
//3 下一頁按鈕功能的實現
btnNext();
}
//1 控件初始化-----------------------代碼
private void initView() {
edit_twosno=findViewById(R.id.editText_twosno);
btn_twoquery=findViewById(R.id.button_twoquery);
txt_tworesult=findViewById(R.id.textView_tworesult);
btn_twonext=findViewById(R.id.button_twonext);
mhelper=new MyDBOpenHelper(SecondActivity.this);//實例化數據庫幫助類對象
db=mhelper.getWritableDatabase();//獲取數據庫的讀寫權限
}
//2 查詢按鈕功能的實現--------代碼
private void btnQuery() {
btn_twoquery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//開始查詢 參數:(實現查詢的 sql 語句,條件參數)
Cursor cursor =db.rawQuery("select * from stu_info where sno=?",new String[]{edit_twosno.getText().toString()});
if(cursor.getCount()!=0){//判斷結果集中是否有數據,有:查詢成功;無:查詢失敗
Toast.makeText(SecondActivity.this,"查詢成功",Toast.LENGTH_SHORT).show();
//循環(huán)遍歷結果集,取出數據,顯示出來
while (cursor.moveToNext()){
String mysno=cursor.getString(cursor.getColumnIndex("sno"));
String myname=cursor.getString(cursor.getColumnIndex("name"));
String mysex=cursor.getString(cursor.getColumnIndex("sex"));
String mypro=cursor.getString(cursor.getColumnIndex("professional"));
String mydep=cursor.getString(cursor.getColumnIndex("deparment"));
txt_tworesult.setText(mysno+"\n"+myname+"\n"+mysex+"\n"+mypro+"\n"+mydep);
}
}else{
Toast.makeText(SecondActivity.this,"沒有查詢到該學號的學生",Toast.LENGTH_SHORT).show();
txt_tworesult.setText("");
}
}
});
}
//3 下一頁按鈕功能的實現------代碼
private void btnNext() {
btn_twonext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
finish();
}
});
}
}
4、代碼講解
(1)查詢時用到的方法——方法1
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
方法各參數的含義:
?table:表名。相當于select語句from關鍵字后面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開。
columns:要查詢出來的列名。相當于select語句select關鍵字后面的部分。
selection:查詢條件子句,相當于select語句where關鍵字后面的部分,在條件子句允許使用占位符“?”
selectionArgs:對應于selection語句中占位符的值,值在數組中的位置與占位符在語句中的位置必須一致,否則就 會有異常。
groupBy:相當于select語句group by關鍵字后面的部分
?having:相當于select語句having關鍵字后面的部分
orderBy:相當于select語句order by關鍵字后面的部分,如:personid desc, age asc;
limit:指定偏移量和獲取的記錄數,相當于select語句limit關鍵字后面的部分。
(2)查詢時用到的方法——方法2
rawQuery(String sql,String[ ] selectionArgs)
方法各參數的含義:
sql :實現查詢的sql語句,例如: select * from stu_info where sno=?
?selectionArgs:是?條件參數,如果?這個內占位符容為null的話就表示把所有的學號的學生都查出來
(3)查詢結果處理
(4)總結
四、修改數據 ?
1、界面效果圖
2、布局界面 activity_ third.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/modifybg" tools:context=".ThirdActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信息修改頁面" android:textSize="30sp" android:textStyle="bold" android:textColor="#000000" android:layout_gravity="center" android:layout_margin="80dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginBottom="30dp"> <EditText android:id="@+id/editText_threeinputsno" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="請輸入要查詢的學號" android:textSize="25sp"/> <Button android:id="@+id/button_threequery" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查詢" android:textSize="25sp"/> </LinearLayout> <EditText android:id="@+id/editText_threesno" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="學號" android:textSize="25sp"/> <EditText android:id="@+id/editText_threename" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="姓名" android:textSize="25sp"/> <EditText android:id="@+id/editText_threedep" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="所屬系部" android:textSize="25sp"/> <Button android:id="@+id/button_threemodify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改" android:textSize="25sp" android:layout_gravity="right" android:layout_marginTop="30dp"/> <Button android:id="@+id/button_threenext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一頁" android:textSize="25sp" android:layout_gravity="right"/> </LinearLayout>
3、類文件 ThirdActivity.java
public class ThirdActivity extends AppCompatActivity {
//定義對象
EditText edit_threeinputsno,edit_threesno,edit_threename,edit_threedep;
Button btn_threequery,btn_threemodify,btn_threenext;
MyDBOpenHelper mhelper;//定義一個數據庫幫助類對象
SQLiteDatabase db;//定義一個操作的數據庫的類對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
//1 控件初始化
initView();
//2 查詢按鈕功能的實現
btnQuery();
//3 修改按鈕功能的實現
btnModify();
//4 下一步按鈕功能的實現
btnNext();
}
//1 控件初始化-------------代碼
private void initView() {
edit_threeinputsno=findViewById(R.id.editText_threeinputsno);
edit_threesno=findViewById(R.id.editText_threesno);
edit_threename=findViewById(R.id.editText_threename);
edit_threedep=findViewById(R.id.editText_threedep);
btn_threequery=findViewById(R.id.button_threequery);
btn_threemodify=findViewById(R.id.button_threemodify);
btn_threenext=findViewById(R.id.button_threenext);
mhelper=new MyDBOpenHelper(ThirdActivity.this);//實例化數據庫幫助類對象
db= mhelper.getWritableDatabase();//獲取數據庫的讀寫權限
}
//2 查詢按鈕功能的實現
private void btnQuery() {
btn_threequery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先查詢顯示,再修改。參數(String sql,String[ ] selectionArgs)
Cursor cursor=db.rawQuery("select * from stu_info where sno=?",new String[]{edit_threeinputsno.getText().toString()});
if(cursor.getCount()!=0){
Toast.makeText(ThirdActivity.this,"查詢成功",Toast.LENGTH_SHORT).show();
while(cursor.moveToNext()){
String mysno=cursor.getString(cursor.getColumnIndex("sno"));
String myname=cursor.getString(cursor.getColumnIndex("name"));
String mydep=cursor.getString(cursor.getColumnIndex("deparment"));
edit_threesno.setText(mysno);
edit_threename.setText(myname);
edit_threedep.setText(mydep);
}
}else{
Toast.makeText(ThirdActivity.this,"沒有查詢到該學號的學生",Toast.LENGTH_SHORT).show();
edit_threesno.setText("");
edit_threename.setText("");
edit_threedep.setText("");
}
}
});
}
//3 修改按鈕功能的實現---------代碼
private void btnModify() {
btn_threemodify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//修改數據代碼如何寫呢?參數:(表名,ContentValues 對象,更新的條件,條件的參數)
ContentValues values=new ContentValues();
values.put("deparment",edit_threedep.getText().toString());
db.update("stu_info",values,"sno=?",new String[]{edit_threesno.getText().toString()});
Toast.makeText(ThirdActivity.this,"修改成功",Toast.LENGTH_SHORT).show();
}
});
}
//4 下一頁按鈕功能的實現------代碼
private void btnNext() {
btn_threenext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(ThirdActivity.this,FourActivity.class);
startActivity(intent);
finish();
}
});
}
}
4、代碼講解
(1)update()方法的四個參數
update(String table,ContentValues values,String whereClause,String[ ] whereArgs)
? 1、第一個參數表名;
? 2、第二個參數是ContentValues對象,要把更新的數據在這里組裝進去;
? 3、第三個參數是更新的條件 ?
? 4、第四個參數是條件的參數
(2)總結
五、刪除數據 ?
1、界面效果圖
2、布局界面 activity_ four.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/deletebg" tools:context=".FourActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信息刪除頁面" android:textSize="30sp" android:textStyle="bold" android:textColor="#000000" android:layout_gravity="center" android:layout_margin="80dp"/> <EditText android:id="@+id/editText_foursno" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入要刪除的學號" android:textSize="25sp"/> <Button android:id="@+id/button_fourdelete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="刪除" android:textSize="25sp" android:layout_gravity="right"/> </LinearLayout>
3、類文件 FourActivity.java
public class FourActivity extends AppCompatActivity {
//定義對象
EditText edit_foursno;
Button btn_fourdelete;
MyDBOpenHelper mhelper;//定義一個數據庫幫助類對象
SQLiteDatabase db;//定義一個操作的數據庫的類對象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
//1 控件初始化
initView();
//2 刪除按鈕功能的實現
btnDelete();
}
//1 控件初始化----------代碼
private void initView() {
edit_foursno=findViewById(R.id.editText_foursno);
btn_fourdelete=findViewById(R.id.button_fourdelete);
mhelper=new MyDBOpenHelper(FourActivity.this);//實例化數據庫幫助類對象
db=mhelper.getWritableDatabase();//獲取數據庫的讀寫權限
}
//2 刪除按鈕功能的實現-----代碼
private void btnDelete() {
btn_fourdelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//怎么樣刪除呢?參數:(表名,刪除的條件,條件的參數)
db.delete("stu_info","sno=?",new String[]{edit_foursno.getText().toString()});
Toast.makeText(FourActivity.this,"刪除成功",Toast.LENGTH_SHORT).show();
}
});
}
}
4、代碼講解
(1)delete()方法的三個參數
delete(String table,String whereClause,String[ ] whereArgs)
? 1、第一個參數:表名;
? 2、第二個參數:刪除的條件 ?
? 3、第三個參數:條件的參數
(2)總結
原文鏈接:https://blog.csdn.net/indeedes/article/details/120046180
相關推薦
- 2022-07-26 在Pycharm set ops_config=local之后,直接echo %ops_config
- 2022-08-02 Redis跳躍表的基本原理和實現_Redis
- 2022-11-03 C++模板超詳細介紹_C 語言
- 2022-08-01 Qt實現矩形大小任意縮放的示例代碼_C 語言
- 2022-04-12 Trailing spaces not allowed no-trailing-spaces
- 2023-07-16 oracle 創(chuàng)建定時任務
- 2022-07-08 python?csv實時一條一條插入且表頭不重復問題_python
- 2022-05-22 利用DOSBox運行匯編的詳細步驟_匯編語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支