前言
最近在重构老项目 在原来的基础上加了mysql数据库的使用 主要是为了记录一些重要数据! 第一次使用记得还是三四年前 现在很久没操作了 先写个demo练习一下 这里记录一下流程和使用方法!
效果图
导入mysql-connector-java-5.1.30-bin.jar包
mysql-connector-java-5.1.30-bin.jar包 CSDN下载地址
将jar下载后,在新建的demo项目app/src/main 目录下 创建libs文件夹,将jar包复制到该文件夹下,然后右键选择 Add As Library 进行导入即可
等待gradle同步jar包后,打开gradle文件依赖内容如下说明导入成功 如下图所示
xml文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_select_for_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:text="根据字段查询"
android:textSize="16sp"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_select_table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:text="整表查询"
android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@id/btn_select_for_id" />
<Button
android:id="@+id/btn_insert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="插入数据"
android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@id/btn_select_table" />
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="删除表数据"
android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@id/btn_insert" />
<TextView
android:id="@+id/tv_data_for_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:padding="10dp"
android:text="显示单个查询的数据"
android:textSize="16sp"
app:layout_constraintTop_toBottomOf="@id/btn_delete" />
<TextView
android:id="@+id/tv_data_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="显示整个表的数据"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MySQL 数据库
代码层面 就是 先连接到mysql数据库 然后对其操作 增删改查 一起来看下demo的实现吧
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button btnSelectForId, btnSelectTable, btnInsert, btnDelete;
private TextView tvShowId, tvShowTable;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x11:
case 0x12:
String s = (String) msg.obj;
tvShowId.setText(s);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initView
btnSelectForId = findViewById(R.id.btn_select_for_id);
btnSelectTable = findViewById(R.id.btn_select_table);
btnInsert = findViewById(R.id.btn_insert);
btnDelete = findViewById(R.id.btn_delete);
tvShowId = findViewById(R.id.tv_data_for_id);
tvShowTable = findViewById(R.id.tv_data_show);
//设置监听事件
initListener();
}
private void initListener() {
// 查询单个字段
btnSelectForId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建一个线程来连接数据库并获取数据库中对应表的数据
new Thread(new Runnable() {
@Override
public void run() {
// 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
HashMap<String, Object> map = DBUtils.getInfoById();
Message message = handler.obtainMessage();
if (map != null) {
StringBuilder s = new StringBuilder();
for (String key : map.keySet()) {
s.append(key).append(":").append(map.get(key)).append("\n");
}
message.what = 0x12;
message.obj = s.toString();
} else {
message.what = 0x11;
message.obj = "查询结果为空";
}
// 发消息通知主线程更新UI
handler.sendMessage(message);
}
}).start();
}
});
//查询整个表
btnSelectTable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//查询整表数据
final List<LogBean> logBeanData = DBUtils.getLogBeanData();
runOnUiThread(new Runnable() {
@Override
public void run() {
//展示整个表数据
tvShowTable.setText(logBeanData.toString());
Log.e(TAG, "table data ---" + logBeanData.toString());
}
});
}
}).start();
}
});
//插入
btnInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
int status = 0;
try {
status = DBUtils.insertData("身份证识别模块",
"正常", "0", "{姓名:小明,性别:男,出生日期:20180219}");
} catch (SQLException e) {
e.printStackTrace();
}
Log.e(TAG, "insert data status ------" + status);
if (status == 1) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "插入失败", Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
}
});
//删除表数据
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
int code = DBUtils.deleteDataForTable("身份证识别模块");
Log.e(TAG, "code ---" + code);
if (code == 1) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
}
});
}
}
MySQL封装工具类 DBUtils
该工具类主要是链接mysql数据库 还有增删改查的方法 如果要借用 记得改掉表名和ip地址 还有数据库名字
/**
* Author by Lyu
* Date on 2021/10/27-10:58
* Description: 数据库的ip地址记得写本机IPV4地址,然后手机与电脑连接同一个网络,只有这样条件下,手机才能成功的连接上本机的mysql数据库。
*/
public class DBUtils {
private static final String DATA_BASE_TABLE_NAME = "xwc_android_log";
private static Connection getConn() {
Connection connection = null;
try {
// MySql驱动
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);// 动态加载类
String ip = "192.168.31.7";// 写成本机地址,不能写成localhost,同时手机和电脑连接的网络必须是同一个
// 尝试建立到给定数据库URL的连接
// 用户名
String LogBean = "root";
// 密码
String password = "****";
connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + "xwc-client",
LogBean, password);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
static HashMap<String, Object> getInfoById() {
HashMap<String, Object> map = new HashMap<>();
// 根据数据库名称,建立连接
Connection connection = getConn();
try {
// mysql简单的查询语句。这里是根据MD_CHARGER表的NAME字段来查询某条记录
String sql = "select * from " + DATA_BASE_TABLE_NAME + " where content = ?";
// connection不为null表示与数据库建立了连接
if (connection != null) {
PreparedStatement ps = connection.prepareStatement(sql);
if (ps != null) {
// 设置上面的sql语句中的?的值为id
ps.setString(1, "id");
// 执行sql查询语句并返回结果集
ResultSet rs = ps.executeQuery();
if (rs != null) {
int count = rs.getMetaData().getColumnCount();
Log.e("DBUtils", "列总数:" + count);
while (rs.next()) {
// 注意:下标是从1开始的
for (int i = 1; i <= count; i++) {
String field = rs.getMetaData().getColumnName(i);
map.put(field, rs.getString(field));
}
}
closeAll(connection, ps);
return map;
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("DBUtils", "异常:" + e.getMessage());
return null;
}
}
public static int insertData(String name, String type, String status, String content) throws SQLException {
// 根据数据库名称,建立连接
Connection connection = getConn();
//向course表插入数据,其中id字段插入的值对应第一个问号,type字段插入的值对应第二个问号
String sql = "insert into " + DATA_BASE_TABLE_NAME + " (type,name,status,content,create_time) values (?,?,?,?,?);";
PreparedStatement ps = connection.prepareStatement(sql);
//通过setString赋值
ps.setString(1, type);
ps.setString(2, name);
ps.setString(3, status);
ps.setString(4, content);
ps.setTimestamp(5, new Timestamp(System.currentTimeMillis()));
//执行更新数据库 返回一个状态码 可以根据这个码 判断是否插入成功
int insertCode = ps.executeUpdate();
closeAll(connection, ps);//关闭相关操作
return insertCode;
}
/**
* 查整个表的数据
*
* @return
*/
public static List<LogBean> getLogBeanData() {
//结果存放集合
List<LogBean> list = new ArrayList<>();
PreparedStatement ps = null;
ResultSet rs = null;
//MySQL 语句
String sql = "select * from " + DATA_BASE_TABLE_NAME;
//获取链接数据库对象
Connection conn = getConn();
try {
if (conn != null && (!conn.isClosed())) {
ps = conn.prepareStatement(sql);
if (ps != null) {
rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
LogBean log = new LogBean();
log.setId(rs.getString("id"));
log.setName(rs.getString("name"));
log.setType(rs.getString("type"));
log.setContent(rs.getString("status"));
log.setStatus(rs.getString("content"));
log.setCreate_time(rs.getTimestamp(6));
list.add(log);
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
closeAll(conn, ps, rs);//关闭相关操作
return list;
}
/**
* 修改数据库中某个对象的状态 改
*/
public int updateUserData(String name) {
int result = -1;
PreparedStatement ps = null;
//获取链接数据库对象
Connection conn = getConn();
if (!TextUtils.isEmpty(name)) {
//获取链接数据库对象
//MySQL 语句
String sql = "update " + DATA_BASE_TABLE_NAME + " set status=? where name=?";
try {
boolean closed = conn.isClosed();
if (!closed) {
ps = conn.prepareStatement(sql);
ps.setString(1, "1");//第一个参数status 一定要和上面SQL语句字段顺序一致
ps.setString(2, name);//第二个参数name 一定要和上面SQL语句字段顺序一致
result = ps.executeUpdate();//返回1 执行成功
}
} catch (SQLException e) {
e.printStackTrace();
}
}
closeAll(conn, ps);//关闭相关操作
return result;
}
/**
* 根据字段删除
*
* @return
*/
public static int deleteDataForTable(String name) {
int result = -1;
PreparedStatement ps = null;
//获取链接数据库对象
Connection conn = getConn();
if (!TextUtils.isEmpty(name)) {
//MySQL 语句
String sql = "delete from " + DATA_BASE_TABLE_NAME + " where name=?";
try {
boolean closed = conn.isClosed();
if (!closed) {
ps = conn.prepareStatement(sql);
ps.setString(1, name);
result = ps.executeUpdate();//返回1 执行成功
}
} catch (SQLException e) {
e.printStackTrace();
}
}
closeAll(conn, ps);//关闭相关操作
return result;
}
/**
* 关闭数据库 三参
*
* @param conn
* @param ps
* @param rs
*/
public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭数据库 两参
*
* @param conn
* @param ps
*/
public static void closeAll(Connection conn, PreparedStatement ps) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
网络权限
mysql数据库 就是实现客户端向服务器发送 所以网络权限一定要的
总结
很早以前学习过mysql数据库的操作方法 那时候还是用jdbc的原始方法 好多年没用了 今天复习了一下 感觉记忆有加深了不少! 又多了一项技能 哈哈哈 温故而知新,可以为师矣。
|