/*******************************************************************
* 作者: # maki #
* 创建日期: # 2019年9月5日18:05:56 #
* 描述: 数据库 SqlBase的帮助类 单例模式
******************************************************************/
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using UnityEngine;
namespace DataBaseTool
{
public class DataBaseHelper
{
private DataBaseHelper() { }
private static DataBaseHelper instance;
//单例
public static DataBaseHelper Instance
{
get
{
if (instance == null)
{
instance = new DataBaseHelper();
}
return instance;
}
}
private IDataBase dbBase;
///
/// 初始化数据库
///
/// 用的是哪种数据库
public void Init(IDataBase dbBase, string loginSql)
{
this.dbBase = dbBase;
this.dbBase.Open(loginSql);
}
///
/// 关闭数据库
///
public void CloseDB()
{
if (dbBase != null)dbBase.Close();
}
/**************************** 对表操作 ************************************/
///
/// 检查数据库里是否存在数据表
///
/// 表名
///
public bool CheckTableIsExist(string tableName)
{
if (dbBase.CheckTableIsExist(tableName))
{
return true;
}
Debug.Log("该类型对应的数据表不存在" + tableName);
return false;
}
///
/// 创建一个表
///
///
/// 字段名
/// 运算符
/// 结果
///
public bool CreatTable(T t)
{
string tableName = typeof(T).Name;
if (CheckTableIsExist(tableName))
{
Debug.Log(tableName);
return false;
}
PropertyInfo[] pros = typeof(T).GetProperties();
//要修改的字段集合
List colNames = new List();
//对应的内容
List colTypes = new List();
for (int i = 0; i < pros.Length; i++)
{
//判断属性的特性,具有某些特性的特殊处理
object[] ob = pros[i].GetCustomAttributes(typeof(PropertySign), true);
PropertyType proType = PropertyType.None;
if (ob.Length > 0)
proType = ((PropertySign)ob[0]).fieldType;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.NotInDataBase)
continue;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.PrimaryKeyInDataBase)
continue;
colNames.Add(pros[i].Name);
var result = pros[i].PropertyType.Name;Debug.Log(result);
colTypes.Add(result);
}
CreatTable(tableName, colNames.ToArray(), colTypes.ToArray());
return true;
}
///
/// 创建一个表
///
///
/// 字段名
/// 运算符
/// 结果
///
public void CreatTable(string tableName, string[] colNames, string[] colTypes)
{
dbBase.CreatTable(tableName, colNames, colTypes);
}
/**************************** 保存或者更新 ************************************/
///
/// 保存或者更新数据,数据库会判断ID是否已存在,存在则更新数据,不存在则插入数据
///
/// 数据类型
/// 插入的数据实体
///
public bool SaveOrUpdate(T t)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
Debug.Log(tableName);
return false;
}
PropertyInfo[] pros = typeof(T).GetProperties();
//要修改的字段集合
List colNames = new List();
//对应的内容
List colValues = new List();
for (int i = 0; i < pros.Length; i++)
{
//判断属性的特性,具有某些特性的特殊处理
object[] ob = pros[i].GetCustomAttributes(typeof(PropertySign), true);
PropertyType proType = PropertyType.None;
if (ob.Length > 0)
proType = ((PropertySign)ob[0]).fieldType;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.NotInDataBase)
continue;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.PrimaryKeyInDataBase)
continue;
colNames.Add(pros[i].Name);
var result = pros[i].GetValue(t, null);
colValues.Add(result);
}
return dbBase.UpdateOrSave(tableName, colNames.ToArray(), colValues.ToArray());
}
///
/// 保存或者更新数据,数据库会判断ID是否已存在,存在则更新数据,不存在则插入数据
///
/// 数据类型
/// 插入的数据实体集合
///
public bool SaveOrUpdate(List tList)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return false;
}
PropertyInfo[] pros = typeof(T).GetProperties();
List listColNames = new List();
List listColValues = new List();
foreach (var t in tList)
{
//要修改的字段集合
List colNames = new List();
//对应的内容
List colValues = new List();
for (int i = 0; i < pros.Length; i++)
{
//判断属性的特性,具有某些特性的特殊处理
object[] ob = pros[i].GetCustomAttributes(typeof(PropertySign), true);
PropertyType proType = PropertyType.None;
if (ob.Length > 0)
proType = ((PropertySign)ob[0]).fieldType;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.NotInDataBase)
continue;
//如果属性特性为不存在数据库里,则跳过当前循环
if (proType == PropertyType.PrimaryKeyInDataBase)
continue;
colNames.Add(pros[i].Name);
var result = pros[i].GetValue(t, null);
colValues.Add(result);
}
listColNames.Add(colNames.ToArray());
listColValues.Add(colValues.ToArray());
}
return dbBase.UpdateOrSave(tableName, listColNames, listColValues);
}
/**************************** 删除 ************************************/
///
/// 删除指定UUID的数据
///
///
/// 唯一标识符
///
public bool DeleteById(string id)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return false;
}
return dbBase.DeleteAnyone(tableName, new string[] { "id" }, new string[] { "=" }, new string[] { id });
}
///
/// 删除符合条件的数据
///
///
/// 唯一标识符
///
public bool DeleteByCondition(string colName, string operation, string colValue)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return false;
}
return dbBase.DeleteAnyone(tableName, new string[] { colName }, new string[] { operation }, new string[] { colValue });
}
/**************************** 获取 ************************************/
///
/// 获取符合一个条件的对应一条数据
///
///
/// 字段名
/// 运算符
/// 结果
///
public T GetEveryone(string colName, string operation, string colValue)
{
string[] colNames = new string[] { colName };
string[] operations = new string[] { operation };
string[] colValues = new string[] { colValue };
var list = GetEveryone(colNames, operations, colValues);
if (list.Count > 0)
return GetEveryone(colNames, operations, colValues)[0];
else
return default(T);
}
/
/ 获取符合一个条件的对应数据
/
/
/ 字段名
/ 运算符
/ 结果
/
//public List GetEveryone(string colName, string operation, string colValue)
//{
// string[] colNames = new string[] { colName };
// string[] operations = new string[] { operation };
// string[] colValues = new string[] { colValue };
// return GetEveryone(colNames, operations, colValues);
//}
///
/// 获取符合全部条件的数据
///
///
/// 字段名
/// 运算符
/// 结果
///
public List GetEveryone(string[] colNames, string[] operations, string[] colValues)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return default(List);
}
return dbBase.GetEveryone(tableName, colNames, operations, colValues);
}
///
/// 获取符合任一条件的数据
///
///
/// 字段名
/// 运算符
/// 结果
///
public List GetAnyone(string[] colNames, string[] operations, string[] colValues)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return default(List);
}
return dbBase.GetAnyone(tableName, colNames, operations, colValues);
}
///
/// 获取一张表的所有数据
///
///
///
public List GetAll()
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return null;
}
return dbBase.GetAll(tableName);
}
///
/// 获取指定的字段数据
///
/// 表名
/// 要获取的字段数据
/// 字段名
/// 运算符
/// 对应数据
///
public List GetValuesForItem(string item, string colName, string operation, string colValue)
{
string[] items = new string[] { item };
string[] colNames = new string[] { colName };
string[] operations = new string[] { operation };
string[] colValues = new string[] { colValue };
return GetForEveryone(items, colNames, operations, colValues)[0];
}
///
/// 获取符合所有条件的指定的某些字段数据
///
/// 表名
/// 要获取的字段数据
/// 字段名
/// 运算符
/// 对应数据
///
public List> GetForEveryone(string[] items, string[] colNames, string[] operations, string[] colValues)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return null;
}
return dbBase.GetForEveryone(tableName, items, colNames, operations, colValues);
}
///
/// 获取符合任一条件的指定的某些字段数据
///
/// 表名
/// 要获取的字段数据
/// 字段名
/// 运算符
/// 对应数据
///
public List> GetForAnyone(string[] items, string[] colNames, string[] operations, string[] colValues)
{
string tableName = typeof(T).Name;
if (!CheckTableIsExist(tableName))
{
return null;
}
return dbBase.GetForAnyone(tableName, items, colNames, operations, colValues);
}
/**************************** 获取表,名 相关数据 ************************************/
///
/// 获取数据库所有表的名字
///
///
public List GetAllTableName()
{
return dbBase.GetAllTableName();
}
///
/// 获取数据表的字段和字段类型
///
///
///
public DataTable GetTableInfo(string tableName)
{
if (!CheckTableIsExist(tableName))
{
return null;
}
return dbBase.GetTableInfo(tableName);
}
}
}
这样的话,全部实现SQLlite的调用
然后,我们再写个测试类,看看效果
/*******************************************************************
* 作者: # maki #
* 创建日期: # 2019年9月6日12:24:26 #
* 描述: 测试连接sqllite数据库
*
* TODO:我用代码创建的表/数据在studio里面不显示,我在studio里面创建的表,在代码中添加数据,也不显示
*
******************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DataBaseTool;
using System;
public class SqlLiteTest : MonoBehaviour {
private DataBaseHelper dbHelper;
// Use this for initialization
void Start () {
string path = Application.streamingAssetsPath + "MyTest.db3";
string url = "data source =" + path;
dbHelper = DataBaseHelper.Instance;
dbHelper.Init(new SqlLiteManager(), url);
Student stu = new Student()
{
id = Guid.NewGuid().ToString(),
name = "mmm",
age = 22,
grade = "七十一班",
score = 32.5f,
};
///**获取所有表名**/
//var names = dbHelper.GetAllTableName(); Debug.Log(names.Count);
//names.ForEach(u => Debug.Log(u));
// /**创建一个表**/
// var bo = dbHelper.CreatTable(stu);
// /**添加数据**/
dbHelper.SaveOrUpdate(stu);
// /**获取数据**/
var s = dbHelper.GetAll();
Debug.Log(s.Count);
//var m = dbHelper.GetAll(); Debug.Log(m.Count);
}
// Update is called once per frame
void Update () {
}
}
public class Student
{
public string id { get; set; }
public string name { get; set; }
public int age { get; set; }
public string grade { get; set; }
public float score { get; set; }
}
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
public in
/*
*使用对象类型
*/
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
name varchar2(10),gender varchar2(4),birthdate date
);
drop type p
what 什么
your 你
name 名字
my 我的
am 是
one 一
two 二
three 三
four 四
five 五
class 班级,课
six 六
seven 七
eight 八
nince 九
ten 十
zero 零
how 怎样
old 老的
eleven 十一
twelve 十二
thirteen
spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt
Bcrpt中的salt可以是随机的,比如:
int i = 0;
while (i < 10) {
String password = "1234
1.前言。
如题。
2.代码
(1)单表查重复数据,根据a分组
SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank>1 )k ON m.a=k.a
(2)多表查询 ,
使用改为le