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
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 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 p = new ArrayList();
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 List QueryData(String sql, T t) {
List list = DBUtil.QueryT(sql, t);
String dd = list.get(0).toString();
String status = dd;
String tip = "";
List t2 = new ArrayList();
switch (dd) {
case "ok":
t2 = (List) list.get(1);
break;
case "nodate": //没有获取到数据
break;
case "无网络": //脱机操作
break;
default: //其他异常
}
return t2;
}
//endregion
//region 调用数据库中的存储过程
/**
* 存储过程返回的是一个行数据,构造一个接收对象,有无该条数据
* @param tm,worker,inputer,T
* @return List
* @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
List list1 = new ArrayList();
list1 = DBUtil.convertList(set);
Map 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)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 map = new HashMap<>();
String sql = "select GETDATE() as datetime";
List list = DBUtil.Query(sql);
String time = "";
if(list.size() > 0){
map = (Map)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 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 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.自己写的存储过程函数(入参列表);
遍历对象集合,可获取到存储过程的返回值