安卓直连SQLSEVER数据库
1、导入连接SQLSEVER的jar包:可以支持android的SQL驱动(如:jtds-1.2.7.jar)
2、编写连接数据库的工具类
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import static android.text.TextUtils.split; //数据库得开启TCP/IP功能 的1433端口
public class DBUtil { //数据库
private static String IP = "192.168.1.666"; //类似的IP地址IP地址
private static String DBName = "XXX"; //数据库名
private static String USER = "XX";
private static String PWD = "XXX"; /**
* 创建数据库对象
*/
public static Connection getSQLConnection() {
Connection con = null;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
//加上 useunicode=true;characterEncoding=UTF-8 防止中文乱码
con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + IP + ":1433/" + DBName + ";useunicode=true;characterEncoding=UTF-8", USER, PWD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
} /**
* 返回的List的[1]数据时List<Map>
* @param sql
* @return
* @throws
*/
//region 传入sql,返回转换成List(查询)
public static List Query(String sql) {
List result = new ArrayList();
ResultSet rs = null;
try {
Connection conn = getSQLConnection(); Statement stmt = conn.createStatement();//
rs = stmt.executeQuery(sql);
result = convertList(rs);
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
String res = "查询数据异常" + e.getMessage();
e.printStackTrace();
result.add(res);
return result;
} catch (Exception e) {
String res = "无网络";
result.add(res);
return result;
} return result;
} //返回list,ResultSet转List<map>
public static List convertList(ResultSet rs) throws SQLException {
List all = new ArrayList();
List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取行的数量
String res = "ok"; all.add(res);
int coun = 0;
while (rs.next()) {
Map rowData = new HashMap();//声明Map
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
}
list.add(rowData);
coun++;
}
if (coun < 1) {
all.set(0, "nodate");
}
all.add(list); return all;
}
//endregion /**
* 更新数据,新增,修改,删除
*/
//region 更新数据,新增,修改,删除 返回int
public static int exesqlint(String sql){
int rs = 0;
try { Connection conn = getSQLConnection();
Statement stmt = conn.createStatement();//
rs = stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (SQLException e) {
String res = "查询数据异常" + e.getMessage();
e.printStackTrace();
return 0;
} catch (Exception e) {
return 0;
} return rs;
}
//endregion //region 更新数据,新增,修改,删除 返回LIST数据
public static List exesql(String sql) {
List result = new ArrayList();
int rs = 0;
try {
String ress = "";
Connection conn = getSQLConnection(); Statement stmt = conn.createStatement();//
rs = stmt.executeUpdate(sql);
if (rs > 0) {
ress = "ok";
} else {
ress = "nodate";
}
result.add(ress);
stmt.close();
conn.close();
} catch (SQLException e) {
String res = "查询数据异常" + e.getMessage();
e.printStackTrace();
result.add(res);
return result;
} catch (Exception e) {
String res = "无网络";
result.add(res);
return result;
}
return result;
} //endregion /**
* 查询,有无该条数据
* @param sql
* @return
* @throws
*/
//region 查询,又多少条行数
public static int hasrows(String sql) {
int result = 0; try {
Connection conn = getSQLConnection(); Statement stmt = conn.createStatement();//
ResultSet ss =stmt.executeQuery(sql);
if (!ss.next()) {
result=0;
} else {
result=1;
}
ss.close();
stmt.close();
conn.close();
} catch (SQLException e) {
String res = "查询数据异常" + e.getMessage();
return -1;
} catch (Exception e) {
String res = "无网络";
return -1; }
return result;
}
//endregion //region 传入sql,返回转换成List(查询)
public static <T> List QueryT(String sql,T t) {
List result = new ArrayList(); ResultSet rs = null;
try {
Connection conn = getSQLConnection(); Statement stmt = conn.createStatement();//
rs = stmt.executeQuery(sql);
result = util(t,rs); rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// String res = "查询数据异常" + e.getMessage();
// e.printStackTrace();
String res = "nodate";
result.add(res);
return result;
} catch (Exception e) {
String res = "无网络";
result.add(res);
return result;
} return result;
} /**
* ResultSet转List<T>
* @param t
* @param rs
* @return
* @throws
*/
public static <T> List util(T t, ResultSet rs) throws Exception {
// 创建一个对应的空的泛型集合
List<T> list = new ArrayList<T>();
List ALL=new ArrayList();
// 反射出类类型(方便后续做操作)
Class c = t.getClass();
// 获得该类所有自己声明的字段,不问访问权限.所有。所有。所有
Field[] fs = c.getDeclaredFields();
int count=0;
// 大家熟悉的操作,不用多说
ALL.add("nodate");
int ros=rs.getRow();
if (rs != null) {
while (rs.next()) {
count++;
if(count==1){
ALL.set(0,"ok");
}
// 创建实例
t = (T) c.newInstance();
// 赋值
for (int i = 0; i < fs.length; i++) {
/*
* fs[i].getName():获得字段名
*
* f:获得的字段信息
*/
Field f = t.getClass().getDeclaredField(fs[i].getName());
// 参数true 可跨越访问权限进行操作
f.setAccessible(true);
/*
* f.getType().getName():获得字段类型的名字
*/
// 判断其类型进行赋值操作
if (f.getType().getName().equals(String.class.getName())) {
f.set(t, rs.getString(fs[i].getName()));
} else if (f.getType().getName().equals(int.class.getName())) {
f.set(t, rs.getInt(fs[i].getName()));
}
} list.add(t);
}
} ALL.add((list));
// 返回结果
return ALL;
} //endregion
/**
* List<Map<String, Object>>转List<T>
* @param list
* @param clazz
* @return
* @throws
*/ public static <T> List<T> castMapToBean(List<Map<String, Object>> list, Class<T> clazz) throws Exception {
if(list == null || list.size()==0) {
return null;
}
List<T> tList = new ArrayList<T>();
// 获取类中声明的所有字段
Field[] fields = clazz.getDeclaredFields(); T t;
for(Map<String, Object> map : list) {
// 每次都先初始化一遍,然后再设置值
t = clazz.newInstance();
for(Field field : fields) {
// 把序列化的字段去除掉
if(!"serialVersionUID".equals(field.getName())){
// 由于Field都是私有属性,所有需要允许修改
field.setAccessible(true); // 设置值, 类型要和vo对应好,不然会报类型转换错误
field.set(t, map.get(field.getName()));
}
}
tList.add(t);
} return tList;
} /**
* 返回的List的[1]数据时List<T>
* @param sql
* @return
* @throws
*/ //
/**
* 过滤非法字段
* @param str
* @return
* @throws
*/
public static boolean sql_inj(String str) { String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; String inj_stra[] = split(inj_str, "|"); for (int i = 0; i < inj_stra.length; i++) { if (str.indexOf(inj_stra[i]) >= 0) {
return true;
} } return false; } public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
if (map == null)
return null;
Object obj = beanClass.newInstance(); Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if(Modifier.isStatic(mod) || Modifier.isFinal(mod)){
continue;
} field.setAccessible(true);
field.set(obj, map.get(field.getName()));
}
return obj;
}
} 3、根据上个工具类,构造专属自己专属工具类(。。。。。。)
public class SqlDto { private String sql; public SqlDto() {
} public SqlDto(String sql) {
this.sql = sql;
} public String getSql() {
return sql;
} public void setSql(String sql) {
this.sql = sql;
} @Override
public String toString() {
return "SqlDto{" +
"sql='" + sql + '\'' +
'}';
}
}
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class DbHelper { //region 常规操作数据库
//批量执行sql语句,都执行成功,返回ok,存在失败语句,返回no
public static String listsql(List<SqlDto> sql) { String res = "";
int count = 0;
String tip = "";
for (int i = 0; i < sql.size(); i++) { List ret = DBUtil.exesql(sql.get(i).getSql());
String dd = ret.get(0).toString();
String status = dd; List<Production> p = new ArrayList<Production>(); switch (dd) {
case "ok":
count++;
break;
case "nodate": //更新sql语句失败
break;
case "无网络": //脱机操作
//脱机操作
break;
default: //其他异常
break;
} } if (count > 0) { res = "ok";
} else { res = "no";
} return res ;
} //单独执行sql语句 执行成功 返回ok ,执行失败,返回no
public static String ExcuteSql(String sql) { String res = ""; int i = DBUtil.exesqlint(sql); if (i > 0) {
//插入成功
res = "ok"; } else {
res = "no";
} return res; } // 入参数 sql + 需要查询的字段构造一个对象
//返回 list<查询对象> 集合
public static <T> List QueryData(String sql, T t) { List list = DBUtil.QueryT(sql, t);
String dd = list.get(0).toString();
String status = dd;
String tip = "";
List<T> t2 = new ArrayList<T>();
switch (dd) {
case "ok":
t2 = (List<T>) list.get(1);
break;
case "nodate": //没有获取到数据
break;
case "无网络": //脱机操作
break;
default: //其他异常 }
return t2;
}
//endregion //region 调用数据库中的存储过程
/**
* 存储过程返回的是一个行数据,构造一个接收对象,有无该条数据
* @param tm,worker,inputer,T
* @return List<T>
* @throws
*/
public static List<接收对象> 存储过程名字(传入的参数列表)
{ List<接收对象> list = new ArrayList<>();
try { Connection conn =DBUtil.getSQLConnection();
String call = "{call SQLSEVER存储过程( 有几个参数,几个问号)}";
CallableStatement callStatement = conn.prepareCall(call);
callStatement.setString("参数一的名字", 参数一的值);
callStatement.setString("参数二的名字", 参数二的值); ResultSet set = callStatement.executeQuery();
/* callStatement.get
ResultSet set = callStatement.getResultSet();*/ //List<Map>
List list1 = new ArrayList();
list1 = DBUtil.convertList(set); Map<String,Object> map = new HashMap<>(); if(list1.get(0).toString().equals("ok")){
ArrayList list2 = (ArrayList) list1.get(1);
for (int i = 0 ; i < list2.size() ; i ++)
{
map = (Map<String,Object>)list2.get(i);
对象 实例 = new 对象(); 实例.set参数名(map.get("参数名").toString());
。。。。。。
list.add(p);
}
} callStatement.close();
conn.close(); } catch (SQLException e) {
String res = "执行数据异常" + e.getMessage();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return list; }
//endregion //获取远程服务器时间
public static Date getSystemTime(){
Map<String,Object> map = new HashMap<>();
String sql = "select GETDATE() as datetime";
List list = DBUtil.Query(sql);
String time = "";
if(list.size() > 0){
map = (Map<String,Object>)list.get(0);
time = map.get("datetime").toString();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
try {
date = sdf.parse(time);
} catch (ParseException e) {
e.printStackTrace();
} return date; } //获取远程服务器小时
public static int getRemoteSystemHour(){ Hour hour = new Hour();
String sql = "SELECT DateName(hour,GetDate()) as hour";
List<Hour> list = DbHelper.QueryData(sql,hour);
String h = "";
if(list.size() > 0){
h = list.get(0).getHour();
}
int hour2 = Integer.parseInt(h); return hour2; } } 4:实例调用
(1)批量调用(增、删、改SQL)
List<SqlDto> sql_list = new ArrayList<>();
for (int i = 0; i < arr1.size(); i++) {
String sql = arr1.get(i).toString();
SqlDto sqlDto = new SqlDto();
sqlDto.setSql(sql);
sql_list.add(sqlDto);
}
其中数组arr1中存储的是sql语句的集合
String res = DbHelper.listsql(sql_list); //去执行
if (res.equals("ok")) {
//批量SQL语句执行成功
} (2)查询SQL 查询对象:是SQL语句返回列的列名构造的查询对象,构造时无参构造函数+getset方法
查询对象 实例 = new 查询对象
List<查询对象> 对象集合= new ArrayList<>();
对象集合= DbHelper.QueryData(sql语句,实例);
遍历对象集合,可以查询到相关数据。 (3)执行SQLSEVER存储过程(有返回值得存储过程)
List<接受对象> 接受对象集合 = DbHelper.自己写的存储过程函数(入参列表);
遍历对象集合,可获取到存储过程的返回值
安卓直连SQLSEVER数据库的更多相关文章
- 连接SQLsever数据库在C#中不能操作的问题
最近小组成员在用C#连接数据库进行操作的时候,总是注册不起用户,提示为sql.client值不能为NULL,经过了一上午的百度查询,讨论,总是找不到问题所在,不得已去问了老师,老师是专业的软件工程师, ...
- SQLSever数据库基本操作
一.SQLSever数据库基本操作 1.创建数据库 use master if exists(select * from sysdatabases where name='SMDB') drop da ...
- 安卓项目-利用Sqlite数据库,开发新闻发布系统
本教程致力于程序员可以快速的学习安卓移动端手机开发. 适合于已经习得一种编程语言的同仁. 更多志同道合,想要学习更多编程技术的大神们. 小弟不才,麻烦关注一下我的今日头条号-做全栈攻城狮. 本文章是基 ...
- Microsoft SqlSever 数据库--软谋1
百度百科--Microsoft SqlSever SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按 ...
- SqlSever数据库实践周
资源下载 进行了为期5天的数据库设计,虽然以前用过数据库,但是这一次是使用书上规范的设计流程设计的数据库,感觉有必要记录一下,希望对其他人有帮助. 我的收获:在这个博客中会体现到我的收获,对于将要进行 ...
- Jmeter直连postgresql数据库进行压测
关于Jmeter直连数据库进行压测,网上有好多教程了,pg数据库的相对少一些,今天自己测试了下,还是挺简单的,有个别需要注意的地方.相较于Loadrunner这么全面庞大的压测工具,Jmeter在数据 ...
- 安卓项目集成objectbox-java数据库框架教程(非关系型)
objectbox数据库是greenrobot团队开发的全新非关系型数据库框架,该团队还开发过greenDao,EventBus等热门框架,objectbox可能是第一次听说,但是greenDao,E ...
- web界面直连MySql数据库
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 安卓基础之Sqlite数据库最最基础操作
Sqlite数据库基础操作 摘要:在应用中新建一个数据库,并创建一个数据表写入数据,然后读取表中数据并展示. 主要逻辑: 1.通过继承SQLiteOpenHelper自定义类,定制数据库的表结构,初始 ...
随机推荐
- SpringCloud学习成长之路 五 路由器网关
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...
- 常用SQL50句
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- 获取src 内容
获取(代码): ].src; // 测试无效 修改(代码): 1 $("#img").attr('src',path);
- JBPM使用
jbpm+mysql5.7 https://blog.csdn.net/tyn243222791/article/details/79033555
- 使用PHP实现命令模式(转)
<?php /** * 命令模式 2010-08-21 sz * @author phppan.p#gmail.com http://www.phppan.com * 哥学社成员(http:// ...
- LODOP设置同一个任务发送到不同打印机
前面的博文Lodop打印语句最基本结构介绍(什么是一个任务),一个任务只能有一个打印语句(最后PRINT,PRINTA,PREVIEW等),如果执行多个,LODOP会弹出多次,C-LODOP会提示窗口 ...
- 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置
处理[由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] 详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 ...
- 第六章 Realm及相关对象——《跟我学Shiro》
转发地址:https://www.iteye.com/blog/jinnianshilongnian-2022468 目录贴:跟我学Shiro目录贴 6.1 Realm [2.5 Realm]及[3. ...
- 【ARTS】01_36_左耳听风-201900715~201900721
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【数据库开发】在Windows上利用C++开发MySQL的初步
[数据库开发]在Windows上利用C++开发MySQL的初步 标签(空格分隔): [编程开发] Windows上在上面配置环境的基础上开展一个小demo链接数据库,没想到中间也出现了这么多的问题,简 ...