工具mysql 5.6.19,mysql-connector-java-5.1.48.jar,android stuido&android studio自带模拟器

1.在mysql数据库中新建表customer,并创建相关字段

SQL命令如下

create table customer(username varchar(20),password varchar(20),email varchar(40));

alter table customer add id int(5) auto_increment primary key;

mysql> insert into customer(username,password,email) values('张三','123456','zhangsan@5429.com');

insert into customer(username,password,email) values('李四','234567','lisi@5429.com');

insert into customer(username,password,email) values('王五','345678','wangwu@5429.com');

insert into customer(username,password,email) values('陈六','456789','chenliu@5429.com');

select * from customer;

 2.JDBC连接数据库

------>页面布局

 ------>设置按钮点击监听

 ------>导入mysql-connector-java-5.1.48.jar包,搜索下载即可

复制粘贴到lib文件下,右键,add as library...

  ------>JDBC连接数据库

(1),添加网络许可<uses-permission android:name="android.permission.INTERNET"/>

(2)Util类代码(待优化)

package com.vocus.jdbctest

import java.lang.Exception
import java.sql.Connection
import java.sql.DriverManager class Util {
var conn:Connection?=null
val driver="com.mysql.jdbc.Drvier"
val url="jdbc:mysql://10.0.2.2:3306/test"
val user="root" //root用户
val psd="rs123456" //自己的密码
fun connection():Connection?{
try{
Class.forName(driver).newInstance()
}catch(e:Exception){
e.printStackTrace()
}
try{
conn=DriverManager.getConnection(url,user,psd)
}catch (e:Exception){
e.printStackTrace()
}
return conn
}
}

(3)针对数据库表customer的查询(待优化)

class Customer {
open val username:String?=null //权宜之计
open val password:String?=null
open val email:String?=null override fun toString(): String {
return "Customer(username=$username, password=$password, email=$email)"
} }
package com.vocus.jdbctest

import java.lang.Exception

class CustomerForQuery {
fun query(sql: String, vararg args: Any): Customer?{//sql语句如select username from customer where id=?,args不确定参数 try {
// Thread({
var conn = Util().connection()
var ps = conn!!.prepareStatement(sql) for (i in 0 until args.size) {//设置sql参数
ps.setObject(i + 1, args[i])
} var resultSet = ps.executeQuery()//获得查询结果集 var rsmd = resultSet.getMetaData()
var columns = rsmd.columnCount //获得结果集列数 if (resultSet.next()) {
var cust = Customer()
for (i in 0 until columns) {
var value = resultSet.getObject(i + 1) //获得查询的值
var columnsName = rsmd.getColumnName(i + 1) //获得值对应的列名,即字段名
//println("查询结果,${value}+${columnsName}")
val field = Customer::class.java.getDeclaredField(columnsName)
field.setAccessible(true)
field.set(cust, value)
}
println("已执行查询语句...")
return cust
}
// }).start()
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
}

(4)添加按钮点击监听执行

package com.vocus.jdbctest
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.concurrent.thread class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) connBtn.setOnClickListener {
thread{
var cust = CustomerForQuery().query("select username from customer where id=?", "3")
println(cust)
}
}
} }

 (5)优化关闭连接,引入泛型,实现针对不同表的通用查询等

------>DAO模式

(1)建立DAO抽象类(BaseDAO)

对于数据库的增删改查等基本操作封装在此类中

(2)针对具体的表提供接口(CustomerDAO)

用于说明具体的需求

interface CustomerDAO {
//查询用户名是否存在
fun logcheck(username:String,password:String):Boolean
}

(3)实现接口的类(CustomerDAOimpl)

用于需求的实现

class CustomerDAOImpl :BaseDAO(),CustomerDAO {
override fun logcheck(username: String, password: String): Boolean {
var cust:Customer?=null
try{
cust=query("select password from customer where username=?",username)
}catch (e:Exception){
println("用户名不存在...")
return false
}
if(cust!!.password==password){
return true
}
else{
println("账号和用户名不匹配...")
return false
}
}
}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) connBtn.setOnClickListener {
thread{
//var cust = CustomerForQuery().query("select password from customer where username=?", "张三")
//println(cust)
var exist=CustomerDAOImpl().logcheck("张三","123456")
println("exist?:${exist}")
}
}
} }

接2.17更新

现在开发后台基本上很少用kotlin,最近尝试做后台,所以用到的jdbc都采用java

实现数据库表的通用查询,以及数据库表通用查询下的返回多条数据,使用到泛型,测试代码如下

->数据库表查询通用方法

public <T> T queryForTable(Class<T> clazz,String sql,Object ...args){
Connection conn=null;
PreparedStatement statement=null;
ResultSet rs=null;
try{
conn=JdbcUtil.connection();
statement=conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
statement.setObject(i+1,args[0]);
} rs=statement.executeQuery();
//获得结果集原数据
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
if(rs.next()){
T t=clazz.newInstance();
for(int i=0;i<columnCount;i++){
Object columnValue=rs.getObject(i+1);
String columnName=rsmd.getColumnName(i+1);
//把查询到的每一行数据,映射到java类
Field field=clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t,columnValue);
}
return t; } }catch (Exception e){
e.printStackTrace();
}finally {
new JdbcUtil().closeResource(conn,statement,rs);
} return null;
}

->返回多条数据

public <T> ArrayList<T> query(Class<T> clazz,String sql,Object ...args) {
ResultSet rs = null;
PreparedStatement statement = null;
Connection conn = new JdbcUtil().connection();
ArrayList<T> customersList=new ArrayList<T>();//对象列表
try { //String sql = "select * from customer limit 0,10;";
statement = conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
statement.setObject(i+1,args[i]);
} rs = statement.executeQuery(); ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount(); for (int j=0;rs.next();j++) {
T t=clazz.newInstance();
for(int i=0;i<columnCount;i++){
String columnName=rsmd.getColumnName(i+1);
Object columnValue=rs.getObject(i+1);
Field field=clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t,columnValue);
}
customersList.add(t);
}
} catch (
SQLException | NoSuchFieldException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
} finally {
new JdbcUtil().closeResource(conn, statement, rs);
}
return customersList;
}

JDBC<android studio,kotlin>的更多相关文章

  1. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  2. Google Android Studio Kotlin

    Google Android Studio Kotlin 开发环境配置 Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对 ...

  3. Android Studio(Kotlin)之RecyclerView

    RecyclerView应该是ListView的增强版. RecyclerView与ListView的区别(我认为的): RecyclerView的性能比ListView高 RecyclerView支 ...

  4. android studio使用JDBC访问mysql数据库(Kotlin方法)

    工具:mysql-connector-java-5.1.48.jar,mysql version 5.6.19,android studio内置模拟器 1.connection import java ...

  5. Android Studio不更新到最新版使用Kotlin

    第一步:安装Kotlin插件 打开Settings面板,找到Plugins选项,点击Browse repositories(浏览仓库),输入“Kotlin”查找,然后安装即可.安装完成之后需要重启An ...

  6. Android Studio中创建Kotlin For Android项目

    Kotlin俗称Android中的Swift,它是Jetbrains公司开发的基于JVM的一门语言,JetBrains公司可能大家并不熟悉,不过相信IntelliJ IDE大家一定知道,Android ...

  7. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  8. Android Studio安装Kotlin插件

    1 Kotlin语言介绍 Kotlin 是 JetBrains 在 2010 年推出的基于 JVM 的新编程语言,是一种新的静态类型编程语言.开发者称,设计它的目的是避免 Java 语言编程中的一些难 ...

  9. Android Studio使用JDBC远程连接mysql的注意事项(附示例)

    JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...

随机推荐

  1. vue-i18n多语言文件归类的两种方法

    1.按语言类型归类 流行的做法是按照语言对文件进行归类,目录结构类似于: --lang ----en ------test.json --------"abc": "ab ...

  2. G. Repeat it

    G. Repeat it time limit per test 2.0 s memory limit per test 64 MB input standard input output stand ...

  3. [BJDCTF2020]EasySearch

    0x00 知识点 Apache SSI 远程命令执行漏洞 链接: https://www.cnblogs.com/yuzly/p/11226439.html 当目标服务器开启了SSI与CGI支持,我们 ...

  4. POJ 3735:Training little cats 联想到矩阵相乘

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11208   Accepted:  ...

  5. Jinja2语法小记

    jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...

  6. Java自学-集合框架 Comparator和Comparable

    Java Comparator和Comparable 步骤 1 : Comparator 假设Hero有三个属性 name,hp,damage 一个集合中放存放10个Hero,通过Collection ...

  7. HDU 3397 线段树 双懒惰标记

    这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了 自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了 跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全 ...

  8. 这篇干货让你在零点前完成学术Essay写作

    写论文,做研究,上课,参加课外活动,与他人social...在美国,你会有很多的事情需要你去做,如何将自己的时间平衡的分配到自己的学习生活以及私人生活中,就显得尤为重要,而这些问题也是影响中国学生的重 ...

  9. 【Android】家庭记账本手机版开发报告四

    一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...

  10. javascript 解决provisional headers are shown的过程

    请求没有被发送,因为是载入缓存资源. 大概是说 完全相同的请求间隔数毫秒(太短),导致加载失败,查看了chrome控制台发现 Provisional headers are shown 出现在 载入缓 ...