安卓直连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.自己写的存储过程函数(入参列表);遍历对象集合,可获取到存储过程的返回值



原文地址:https://www.cnblogs.com/dosoftwarey/p/11686121.html

时间: 2024-08-11 15:27:13

安卓直连SQLSEVER数据库的相关文章

安卓项目-利用Sqlite数据库,开发新闻发布系统

本教程致力于程序员可以快速的学习安卓移动端手机开发. 适合于已经习得一种编程语言的同仁. 更多志同道合,想要学习更多编程技术的大神们. 小弟不才,麻烦关注一下我的今日头条号-做全栈攻城狮. 本文章是基于上篇文章基础之上进行深入学习的.程序员带你学习安卓开发-XML文档的创建与解析 Sqlite数据库: Sqlite数据库是在安卓中使用较广泛的数据库.其为简单.轻巧的Sql类文件型数据库.因以简单的文本形式保存,所以安全性不是很高.只要拿到sqlite数据库文件就可以得到数据.所以这就决定了sql

关于安卓通过webservice访问数据库问题

问题描述: 访问数据库时,手机能增删数据库的数据就是显示不了数据库的里的数据不知道是哪里的问题,用的HTTP这是我webservice中的产看所有信息的方法: public List<string> selectAllCargoInfor() { List<string> list = new List<string>(); try { string sql = "select * from C"; SqlCommand cmd = new SqlC

java项目源码 sqlsever数据库springmvc mybatis bootstrap html5

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

SQLSEVER数据库作业2

1.使用企业管理器新建一个数据库,名称为"图书数据库",其主要数据文件大小为2M,次要数据文件大小为1M,日志文件大小为1M,存放位置为"D:\SQLServer",其他选项都采用默认值 .(如操作不成功,分析原因,并按相关要求建立"图书数据库") 新建查询 CREATE DATABASE 图书馆数据库 ON ( NAME="图书数据库DB", FILENAME="D:\SQLSever\图书馆数据库db.mdf&q

破解电信光猫,外网直连局域网数据库

1,外网的服务器(比如Java web)如何连接局域网内的数据库呢? 2,公网的电脑如何访问局域网内的某个服务呢? 情景: 我们之前做的一个项目,是要做一个网站,并且网站要能访问到客户公司局域网内的SQL Server数据库. 公网的电脑访问局域网内的数据库??? 当时可把我们难倒了.在无计可施的时候,我打电话咨询了前公司的技术大牛,给我介绍了端口映射和花生壳 首先我们要明确3点: (a)公网中的电脑是可以访问局域网的网关(外网ip)的; (b)网关的外网ip是由运营商分配的,是不固定的(所以才

Microsoft SqlSever 数据库--软谋1

百度百科--Microsoft SqlSever SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言.SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS). 登陆方式:SqlSever 身份验证  账号 sa(默认)   密码  安装时设置  建表建库: 新建数据库个表:数据库和表格的名

安卓开发--------短信数据库的查找和添加

ContentResolver resolver = context.getContentResolver(); //内容提供者 Uri uri = Uri.parse("content://sms/");//短信的uri 增加 resolver.insert(uri, values);   values是 ContentValues values = new ContentValues();   一个键值对的集合     添加方法 values.put(key, value); 查找

【安卓9】SQLite数据库

SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎.它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 专为资源相对有限的移动设备开发的数据库系统 支持Windows/Linux/Unix等主流操作系统,同时能与很多程序语言结合,比如C#.PHP.Java等,还有ODBC接口. SQLite支持绝大部分的SQL92命令,并提供了简单的事务功能. SQLite的每个数据库都是一个文件 SQL

安卓java层操作数据库

一.在Android中查询数据库用到两个重要的类:  1.SQLiteDatabase:用来创建,删除,执行SQL命令,并执行其他常见的数据库管理任务. 2.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 返回Cursor对象 table:数据库里边表的名称 columns:需要查询出来数据库