精华内容
下载资源
问答
  • 数据库的常用操作一、技术起源数据库操作,不管是服务端、前端、移动端,都或多或少的会涉及到数据的存储查询、修改。所以作为一名开发者,数据库操作也是开发必备的一项技能。SQL全称是Structured Query Language...

    数据库的常用操作

    2eaf7ce316a42a50d8d5838febb0b8b3.png

    一、技术起源

    数据库操作,不管是服务端前端移动端,都或多或少的会涉及到数据的存储、查询、修改。所以作为一名开发者,数据库操作也是开发必备的一项技能。

    SQL全称是Structured Query Language,翻译后就是结构化查询语言,是一种数据库查询和设计语言,用于存取数据与及查询、更新和管理关系数据库系统

    常见的数据库有MySQLSQLServerORACLEDB2等等。

    二、数据库基础

    数据库操作概览图:

    数据库的基本操作步骤:

    • 1、创建数据库
    • 2、连接(打开)数据库
    • 3、创建表
    • 4、往表中加入数据
    • 5、更新数据、查询数据、删除数据
    • 6、断开(关闭)数据库

    1、建表(CREATE TABLE)

    CREATE TABLE emp ( id int NOT NULL PRIMARY KEY, //添加主键 name varchar(20), gender varchar(2), performance int, salary double)

    如果创建表后,忘记添加主键或者外键,可以使用ALERT添加。

    ALERT TABLE emp ADD PRIMARY KEY(id); //添加主键ALERT TABLE orders ADD FOREIGN KEY (e_id) REFERENCE emp(id); //添加外键

    2、INSERT(插入)

    向表中加入数据。

    //向emp 表中插入一条数据,插入字符串时使用''INSERT INTO emp VALUES(1, 'yijie', 'male', 85, 18000.0);

    向表中插入数据的标准格式是:

    insert into tableName(column1, column2...) values('value1', 'value2'...)

    3、UPDATE(更新)

    更新表中的数据。

    update emp set salary=20000 where name='yijie';

    4、DELETE (删除)

    delete from emp where id=8;//删除表中的某条数据,where后面的为条件delete * from emp;//删除表中的所有数据,清空表drop table 表名称; //删除某张表

    注意:在使用delete删除表中数据时,如果该表与其他表有关联关系,如:外键,得先删除关联表中的外键。

    5、DISTINCT(去重)

    一张表经过一段时间的操作,避免不了会出现数据重复的情况。重复的数据不仅没有意义,而且占用存储空间。这个时候distinct就悄然登场了。distinct用于根据条件去除表中的重复内容。

    //查询emp中的name,返回唯一的名字select distinct name from emp;

    6、Select (查询)

    查询是数据库操作中最常用的操作,也是最难的。select语句用于从表中查询数据,结果被存储在一个结果表中(称为结果集)。

    SELECT 语法:

    SELECT 列名称 FROM 表名称; //查询表中的某列数据

    SELECT * FROM 表名称; //查询整张表

    还有更为复杂的条件查询。

    三、基础函数

    数据库还为我们提供了一些函数,方便我们进行数据库操作。这些基础函数基本都是列名为函数参数,返回某一列的计算结果。

    1.AVG()平均值

    avg()用于返回某列的平均值,NULL不包含在计算中。

    select AVG(salary) as avg_salary form emp; //查询员工的平均薪水

    2.COUNT()

    COUNT函数用于返回匹配指定条件的行数。

    select COUNT(*) from emp; //返回表的记录数

    3.MAX()

    MAX函数返回指定列的最大值,NULL字不包括在计算中。

    4.MIN()

    MIN函数返回指定列的最小值,NULL字不包括在计算中。

    5.SUM()

    SUM函数返回指定列的总数。

    6.ROUND()

    ROUND函数用于把数值字段舍入为指定的小数位数。

    select ROUND(salary,1) as n_salary from emp; //将salary保留一位小数

    select ROUND(column_name,decimals) from table_name;

    参数描述column_name要舍入的字段decimals规定要返回的小数位数

    7.FORMAT()

    FORMAT用于对指定字段的显示进行格式化

    SELECT FROMAT(column_name,format) FROM table_name;

    参数描述column_name要格式化的字段format指定的格式

    四、高级用法

    还有一些SQL的高级用法,分页模糊匹配排序等等。

    1.分页(LIMIT)

    分页查询就是返回返回当前页码对应的页面的数据。

    分页查询的基本公式:(page - 1) * pageSize + 当前页要显示的数据条数

    select * from emp limit 4; //返回前4条数据

    2.模糊匹配(LIKE)

    模糊匹配是配合where条件使用的。

    //%可以理解为定义通配符select * from emp where name like 'a%'; //返回以a开头的所有姓名

    3.IN

    返回特定列在某个集合中的所有数据。

    select * from emp where name in ('AA', 'BB'); //返回name为AA、BB的所有数据。

    4.JOIN

    联表运算符JOIN,用于将两个或者两个以上的表进行关联,并从这些表中查询数据。

    常用的几种连接方式:

    • INNER JOIN: 内连接。
    • LETF JOIN:就算右表中没有匹配,也从左表中返回所有的行。
    • RIGHT JOIN:就算左表中没有匹配,也从右表中返回所有的行。
    • FULL JOIN:只要有一个表存在就返回。

    5.UNION

    UNION运算符用于合并两个或多个SELECT语句的结果集。

    UNION内部的SELECT语句必须具有相同数量的列,列也必须具有相似的数据类型。同时,每条SELECT语句中列的顺序必须相同。

    6.AUTO_INCREMENT(自增)

    一般用于修饰主键,使其保持自增。

    7.ORDER BY (排序)

    使用order by对查询结果进行排序,默认是升序

    • ASC:升序(从小到大)
    • DESC:降序(从大到小)
    select * from emp order by name;

    8.GROUP BY

    通常匹配合计函数使用,根据一个或者多个列队结果集进行分组。

    9.HAVING

    用于给分组设置条件。

    10.DEFAULT

    default约束用于向列中插入默认值。

    写在最后

    本文是对数据库中经常用到的一些写法与及函数的归纳总结,方便以后用到的时候能够快速查询到。

    题外话:主要是前段时间去面试的时候,被问到修改一条数据的语句怎么写时,竟然没有回到上来,所以决定对数据库的常用操作做一个总结。

    展开全文
  • “本文将结合实例介绍了如何使用MySQL的存储过程功能来实现对数据库数据的递归查询。”01—场景在开发企业级应用的时候,通常会涉及到对企业组织结构信息的管理,通过对组织结构层级关系的描述可以对数据访问权限...

     本文将结合实例介绍了如何使用MySQL的存储过程功能来实现对数据库数据的递归查询。

    01

    场景

            在开发企业级应用的时候,通常会涉及到对企业组织结构信息的管理,通过对组织结构层级关系的描述可以对数据访问权限进行有效的控制。例如:总公司的操作员能够查看到所有分公司的数据,而分公司操作员则不能查看其他分公司的数据。

           在数据库设计当中,通常我们会添加一个 parent_id 字段来指向当前单位的上级单位,以此描述企业组织结构的层级关系。例如:“热力分公司” 的上级单位是 “热力总公司”,则它的 parent_id 为 “热力总公司” 的 ID。

    8faf4748d9251c535b4606258779c696.png

    unit 表数据

            在进行数据库查询的时候,就可以使用如下语句查询到某个单位的所有下一级单位。

    SELECT * FROM unit WHERE parent_id = 1

           但是,事情往往没有那么简单,如果想要改变某个单位的上级单位,这时候会有一个约束条件:不能够将某个单位的上级单位修改为该单位自身以及其下属单位。因为这会导致循环引用的问题的出现。

    0817023df0003d98947c21f54439f342.png

    组织结构管理界面

    02

    实现

            要想满足上述的约束条件,我们就不能允许修改的 parent_id 为当前单位的ID或者其所有下属单位的ID。由于企业的组织结构的层级数量往往是不确定的,所以要想查询到某个单位所有下属单位的ID,必然是需要进行一个递归查询的,通过不断的查询指定单位的下属单位ID,下属单位的下属单位ID,下属单位的下属单位的下属单位ID等等,直到再没有下属单位为止。

            要想实现这样的递归查询,我们可以使用MySQL提供的存储过程功能。存储过程功能和编程语言当中函数其实是比较类似的,里面包含了一条或多条的数据库操作语句,一个存储过程可以去调用另外一个存储过程,也可以自己调用自己。因此利用存储过程的能力,可以很轻易的实现递归查询的功能。

            正文开始

           首先,我们定义一个可以递归调用的存储过程,用来查询指定单位的下一级单位,该存储过程的入参是 parentId,也就是指定单位的ID。

            存储过程会查找 unit 表中字段 parent_id 值为 parentId 的数据,并将找到的下属单位ID存放到一张临时表(tmp_unit)当中,通过一个循环遍历当前单位的下属单位ID列表,继续调用存储过程 findChildUnit 自身,逐层的查找所有下属单位。 

    CREATE PROCEDURE `findChildUnit`(IN parentId INT)BEGIN  DECLARE v_unit_id INT DEFAULT -1;    # 循环终止标志  DECLARE done INT DEFAULT 0;    # 查询当前部门的子部门ID列表  DECLARE cur_unit CURSOR FOR SELECT id  FROM unit WHERE parent_id = parentId;  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    INSERT INTO tmp_unit VALUES(parentId);    # 打开游标(游标指向有待遍历的部门ID)  OPEN cur_unit;  FETCH cur_unit INTO v_unit_id;  WHILE (done = 0)  DO    CALL findChildUnit(v_unit_id);    FETCH cur_unit INTO v_unit_id;  END WHILE;END

            定义一个存储过程需要使用 CREATE PROCEDURE  关键字,后面紧跟着的是存储过程的名称,调用的使用可以使用 CALL 关键字进行调用。再后面的(IN parentId INT)  部分是存储过程的参数列表,类似与函数的参数列表,IN关键字描述了该 parentId 是一个入参,另外还有关键字 OUT 表示参数为输出的变量,INOUT则表示既可以该参数即作为输出变量也同时作为输入变量。

            紧接着,我们还要创建另外一个存储过程,作为上述递归调的存储过程的入口,在这个存储过程当中创建一张临时表来存储找到的下属单位的ID。

    CREATE PROCEDURE `findChildUnitRecursive`(IN parentId INT)BEGIN  # 创建临时表,存储查询结果  DROP TEMPORARY TABLE IF EXISTS tmp_unit;  CREATE TEMPORARY TABLE tmp_unit(unit_id INT);  DELETE FROM tmp_unit;    # 调用子存储过程  CALL `findChildUnit`(parentId);  # 输出结果  SELECT DISTINCT unit_id FROM tmp_unit ORDER BY unit_id;END

            最后,如果项目采用的是 MyBatis+MyBatis Plus作为数据持久层框架的话可以采用以下方法调用存储过程来获得所有下属单位的ID列表。

    @Repositorypublic interface UnitMapper extends BaseMapper<Unit> {    @Select("CALL findChildUnitRecursive(#{ parentId })")    ListgetSubUnitRecursive(Integer parentId);}

          正文结束

    03

    实践

            纸上得来终觉浅,绝知此事要躬行。看完文章不妨自己也实践起来试试看。以下是用于测试的数据库表结构的数据。

    CREATE TABLE `unit`  (  `id` int NOT NULL AUTO_INCREMENT COMMENT '单位ID',  `name` varchar(128) NOT NULL COMMENT '单位名称',  `enable` bit(1) NULL COMMENT '是否启用',  `parent_id` int NULL COMMENT '上级单位',  PRIMARY KEY (`id`));
    INSERT INTO `unit` VALUES (1, '热力总公司', b'1', NULL);INSERT INTO `unit` VALUES (2, '热力分公司', b'1', 1);INSERT INTO `unit` VALUES (3, '热力所1', b'1', 2);INSERT INTO `unit` VALUES (4, '热力站1', b'1', 3);INSERT INTO `unit` VALUES (5, '热力站2', b'1', 3);INSERT INTO `unit` VALUES (9, '热力站3', b'1', 3);

    04

    结尾

          个人认为使用递归查找某个单位的所有下属单位这个实例是很好的一个MySQL 进阶实践,因为其中涉及到了存储过程、临时表、游标、变量之类的很多 MySQL 的知识点。实践一下,对提高 MySQL 数据库的操作能力来说是有很大帮助的。

    展开全文
  • 第一次发博客,这是写过的一个作业,学的不是很到位,写的也很简单~需求如下: 网上书店系统中,有书籍表,表结构如下:书号(主键),书名,价格,出版社和书的封面;书的封面字段存储的是图片文件的路径。图片的...

    第一次发博客,这是写过的一个作业,学的不是很到位,写的也很简单~

    需求如下:

              

    网上书店系统中,有书籍表,表结构如下:

    书号(主键),书名,价格,出版社和书的封面;

    书的封面字段存储的是图片文件的路径。图片的源文件存在web项目的某个子目录中。

    用户表中包含的数据是用户名(主键),年龄,密码,Email。

    (1).按照要求完成数据库的创建。

    (2).以类库方式,读取配置文件,连接数据库。

    (3).完成用户注册,注册页面中用户名不能为空,年龄是整数,Email格式正确;(JavaScrpit)

    (4).构建用户登录界面,验证用户名和密码,如果登录成功,把用户名存入Session中,跳转到主页面,显示用户名。

    (5)用户登录后可以根据书名进行模糊查询,支持高级查询(书名,价格等综合查询)。将查询结果以表格方式显示在界面上,表格中显示的是书的名字和价格。

    (6)表格中添加查看按钮列,用户点击查询,可以跳转页面显示这本书的详细信息,包括封面图片。要求用到重定向。(HttpHandler)

    (7) 表格中添加下载按钮列,用户点击下载书的封面。

    (8) 可以把查询结果保存为excel文件。

    详细步骤:

    1、创建数据库:

    书籍表:

    USE [bookshop]
    GO
    
    /****** Object:  Table [dbo].[book]    Script Date: 2018/6/8 10:39:09 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[book](
    	[bookid] [int] IDENTITY(1,1) NOT NULL,
    	[bookname] [nchar](10) NOT NULL,
    	[price] [money] NULL,
    	[adress] [nvarchar](50) NULL,
    	[pic] [nvarchar](50) NULL,
     CONSTRAINT [PK_book] PRIMARY KEY CLUSTERED 
    (
    	[bookid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    

    用户表:

    USE [bookshop]
    GO
    
    /****** Object:  Table [dbo].[userinfo]    Script Date: 2018/6/8 10:39:57 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[userinfo](
    	[userID] [nchar](50) NOT NULL,
    	[password] [nchar](50) NOT NULL,
    	[userage] [nchar](10) NULL,
    	[Email] [nchar](50) NULL,
     CONSTRAINT [PK_userinfo] PRIMARY KEY CLUSTERED 
    (
    	[userID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    

    2、以类库方式,读取配置文件,连接数据库

    数据库连接,操作类库

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace MySqlTool
    {
        public class Tool
        {
            /// <summary>
            /// sql执行
            /// </summary>
            /// <param name="ConnectionStrings">连接串</param>
            /// <param name="strSql">sql语句</param>
            /// <param name="paras">SqlParameter集合</param>
            /// <param name="cmdType">CommandType类型</param>
            /// <returns>返回DataSet结果集</returns>
            public DataSet ExecuteSql(string ConnectionStrings,string strSql, SqlParameter[] paras, CommandType cmdType)
            {
                SqlConnection con = new SqlConnection(ConnectionStrings);
                con.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = cmdType;
                cmd.CommandText = strSql;
                foreach (SqlParameter p in paras)
                {
                    cmd.Parameters.Add(p);
                }
    
    
                SqlDataAdapter data = new SqlDataAdapter(cmd);
                 DataSet rs = new DataSet(); //内存的数据库
                data.Fill(rs, "temp");
    
    
                con.Close();
                return rs;
               
            }
    
    
    
    
            /// <summary>
            /// sql插入数据方法
            /// </summary>
            /// <param name="ConnectionStrings">连接串</param>
            /// <param name="strSql">sql语句</param>
            /// <param name="paras">SqlParameter集合</param>
            /// <param name="cmdType">CommandType类型</param>
            /// <returns>返回受影响的行数</returns>
            public int insertSql(string ConnectionStrings, string strSql, SqlParameter[] paras, CommandType cmdType)
            {
                SqlConnection con = new SqlConnection(ConnectionStrings);
                con.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = cmdType;
                cmd.CommandText = strSql;
                foreach (SqlParameter p in paras)
                {
                    cmd.Parameters.Add(p);
                }
    
    
                int num = cmd.ExecuteNonQuery();//执行
    
    
                con.Close();
                return num;
    
    
            }  
    
    
            public int SqlReturnLine(string connstr, string sql)
            {
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                SqlCommand command = new SqlCommand(sql, conn);
                object Onum = command.ExecuteScalar();
                int num = Convert.ToInt32(Onum);
                return num;
            }
    
    
    
    
            /// <summary>
            /// 登录验证
            /// </summary>
            /// <param name="username"></param>
            /// <param name="password"></param>
            /// <param name="connectstring"></param>
            /// <returns></returns>
            public bool SqlDataCheck(SqlParameter[]paras, string connectstring,string sql)
        {
            SqlConnection conn = new SqlConnection(connectstring);//where userID=@username
            conn.Open();
            SqlCommand mycom = new SqlCommand();         //创建SQL命令执行对象
            mycom.Connection=conn;
            mycom.CommandText = sql;                           //执行SQL命令
            SqlDataAdapter myDA = new SqlDataAdapter();       //实例化数据适配器
                foreach (SqlParameter p in paras)
                {
                    mycom.Parameters.Add(p);
                }
    
    
                SqlDataAdapter data = new SqlDataAdapter(mycom);
                DataSet rs = new DataSet();   //实例化结果数据集
                int n = data.Fill(rs, "temp");//将结果放入数据适配器,返回元祖个数          
            if (n != 0)
            {
                return true;
            }
            else return false;
    
    
        }
        }
    }

    3、用户注册功能,注册页面中用户名不能为空,年龄是整数,Email格式正确


    验证功能直接用的验证控件。

    注册功能代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class register : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
            try
            {
            string insertsql = "insert into [userinfo] ([userID],[password],[userage],[Email]) values (@myuserID,@mypassword,@myuserage,@myEmail) ";
            SqlParameter[] parameters = {   
                            new SqlParameter("@myuserID", this.TBusername.Text),
                            new SqlParameter("@mypassword", this.TBpwd.Text),
                             new SqlParameter("@myuserage", this.TBage.Text),
                              new SqlParameter("@myEmail", this.TBemail.Text)
                            
                                        };
            MySqlTool.Tool tool = new MySqlTool.Tool();
            int rs = tool.insertSql(connstr, insertsql, parameters, CommandType.Text);
            this.Label1.Text = "注册成功";
              this.Label1.Visible = true;
              Session["LoginUser"] = this.TBusername.Text.Trim();
            Response.Redirect("Main.aspx");
            }
            catch
            {
                this.Label1.Text = "用户名已经存在!";
                this.Label1.Visible = true;
                //
            }
        }
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Response.Redirect("login.aspx");
        }
    }

    4、构建用户登录界面,验证用户名和密码,如果登录成功,把用户名存入Session中,跳转到主页面,显示用户名。

    普通用户、管理员登录,普通用户登录只能查询,管理员可以增加:

    登陆成功后进入用户主界面,查询书籍:

    管理员登录后跳转到添加图书信息界面:

    登录功能代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
      
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Response.Redirect("register.aspx");//重定向到注册页面
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
           
            string connectstring = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
    
    
            string username = TextBox1.Text.Trim();  //取出账号
    
            string pw = TextBox2.Text.Trim();         //取出密码
    
            string s1 = "select userID,password from userinfo where userID=@username and password=@password";                                            //编写SQL命令
            MySqlTool.Tool tool = new MySqlTool.Tool();
            SqlParameter[] parameters = {   
                            new SqlParameter("@username",username.Trim()), 
                            new SqlParameter("@password",pw.Trim())
                                            };
            bool temp = tool.SqlDataCheck(parameters, connectstring, s1);
            if (temp == true)
            {
                Label3.Text = "登录成功";
                Label3.Visible = true;
                Session["LoginUser"] = TextBox1.Text.Trim();       
                Response.Redirect("Main.aspx");
            }
            else
            {
                Label3.Text = "用户名或密码有错。请重新输入!";
                Label3.Visible = true;
                TextBox1.Text = "";   //清空账号
                TextBox2.Text = "";    //清空密码?
                TextBox1.Focus();     //光标设置在账号上
            }     
        }
        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            Response.Redirect("loginAd.aspx");
        }
       
    }

    5、用户登录后可以根据书名进行模糊查询,支持高级查询(书名,价格等综合查询)。将查询结果以表格方式显示在界面上,表格中显示的是书的名字和价格。

    上传几组图书数据:


    数据库中数据:

    上传功能代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    //add
    using System.Data.SqlClient;
    using System.Data; 
    public partial class Default2 : System.Web.UI.Page
    {
        //实例化tool类
        MySqlTool.Tool tool = new MySqlTool.Tool();
        protected void Page_Load(object sender, EventArgs e)
        {
    
            if (Session["LoginUser"] == null)  //上面Session名字用LoginUser,这里的名字要和上面的相同,可以随便改,保持一致就行了,注意:Session["LoginUser"]后面,没有ToString()哦,你要是加上的话,就会出错了.
            {
                Response.Redirect("login.aspx"); //如果Session为空,则转到登陆页.
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
         
        }
        protected void Button2_Click(object sender, EventArgs e)
        {   
            int bookid;//定义bookid,用作生成图片序号。
            //定义连接串
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
         //定义查询表中行数sql语句
            string numinsertsql = "select count(1) from [dbo].[book]";
    
            bookid = tool.SqlReturnLine(connstr, numinsertsql) + 1;//调用SqlReturnLine方法获取数据库行数
          
            string path = Server.MapPath("") + "\\upload\\" + bookid.ToString() + ".jpg";//定义图片存储路径
            FileUpload1.SaveAs(path);//图片存储
    
            //定义sql语句,插入book数据到数据库
            string insertsql = "insert into Book (bookname,price,adress,pic) values (@bookname,@myprice,@myadress,@mypic) ";
            //定义SqlParameter数组,存储参数
            SqlParameter[] parameters = {   
                            new SqlParameter("@bookname",this.TextBox1.Text),
                            new SqlParameter("@myprice",this.TextBox2.Text),
                             new SqlParameter("@myadress",this.TextBox3.Text),
                              new SqlParameter("@mypic","~\\upload\\" + bookid.ToString()+".jpg")
                                        };
    
    
            int rs = tool.insertSql(connstr, insertsql, parameters, CommandType.Text);//调用insertSql方法插入数据到数据库
            if (rs != null)
            {
                this.Label1.Text = "上传文件到web子目录成功";
                this.Label1.Visible = true;
            }
        }
        protected void Button3_Click(object sender, EventArgs e)
        {
            //定义连接串
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
            string selectSql = "select * from book ";//定义查询sql语句
            SqlParameter[] parameters = { };
    
            DataSet rs = tool.ExecuteSql(connstr, selectSql, parameters, CommandType.Text);//调用ExecuteSql方法返回Dataset
            //将数据传递到GridView1
            this.GridView1.DataSource = null;
            this.GridView1.DataSourceID = null;
            this.GridView1.DataSource = rs.Tables[0];
            this.DataBind();
          
        }
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
    
          
            //下载封面,按钮事件
            string abc = e.CommandArgument as string;
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
            string bd = e.CommandName as string;
            Response.AddHeader("Content-Disposition", "attachment;filename=test.jpg");
            string filename = Server.MapPath("upload/" + abc + ".jpg");
            Response.TransmitFile(filename);  
        }
      
    }

    跳转到用户查询界面:

    (1)不添加查询条件,默认查询全部。

    (2)模糊查询,可以查询到包含java的书籍

     

    (3)高级查询,可以精确查询到一本书

    相关代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class Main : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["LoginUser"] == null)  //上面Session名字用LoginUser,这里的名字要和上面的相同,可以随便改,保持一致就行了,注意:Session["LoginUser"]后面,没有ToString()哦,你要是加上的话,就会出错了.
            {
                Response.Redirect("login.aspx"); //如果Session为空,则转到登陆页.
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            //查询
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
            string selectSql = "select * from book where (bookname like '%'+@mybookname2+'%')and(adress like '%'+@myadress+'%')and(price like '%'+@myprice+'%')";
            SqlParameter[] parameters = {   
                            new SqlParameter("@mybookname2", this.TextBox2.Text.Trim()),
                                        new SqlParameter("@myprice", this.TextBox3.Text.Trim()),
                                        new SqlParameter("@myadress", this.TextBox4.Text.Trim()),
                                        };
    
            MySqlTool.Tool tool = new MySqlTool.Tool();
            DataSet rs = tool.ExecuteSql(connstr, selectSql, parameters, CommandType.Text);
    
            //bind to view 
            this.GridView1.DataSource = null;
            this.GridView1.DataSourceID = null;
            this.GridView1.DataSource = rs.Tables[0];
            this.GridView1.Visible = true;
            this.DataBind();
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            //查询
            string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
            string selectSql = "select * from book where 1=1";
            List<SqlParameter> ilistStr = new List<SqlParameter>();
            if (TextBox5.Text.ToString()!=null&&TextBox5.Text.Length!=0)
            {
                ilistStr.Add(new SqlParameter("@mybookname2", this.TextBox5.Text.Trim()));
                selectSql += "and (bookname=@mybookname2)";
            }
            if (TextBox6.Text.ToString() != null && TextBox6.Text.Length != 0)
            {
                ilistStr.Add(new SqlParameter("@myprice", this.TextBox6.Text.Trim()));
                selectSql += "and (price=@myprice)";
            }
            if (TextBox7.Text.ToString() != null && TextBox7.Text.Length != 0)
            {
                ilistStr.Add(new SqlParameter("@myadress", this.TextBox7.Text.Trim()));
                selectSql += "and (adress=@myadress)";
            }
    
            SqlParameter[] param = ilistStr.ToArray();
            MySqlTool.Tool tool = new MySqlTool.Tool();
            DataSet rs = tool.ExecuteSql(connstr, selectSql, param, CommandType.Text);
    
            this.GridView1.DataSource = null;
            this.GridView1.DataSourceID = null;
            this.GridView1.DataSource = rs.Tables[0];
            this.GridView1.Visible = true;
            this.DataBind();
     
           
        }
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            
    
            if (e.CommandName == "LinkButton")
            {
                Response.Write("第一个按钮");
                string abc = e.CommandArgument as string;
                Response.Redirect("~/books/" + abc + ".shtml");
    
    
            }
            else
            {
                //下载封面,按钮事件
                string abc = e.CommandArgument as string;
                string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
                string bd = e.CommandName as string;       
                Response.AddHeader("Content-Disposition", "attachment;filename=test.jpg");  
                string filename = Server.MapPath("upload/"+abc+".jpg");  
                Response.TransmitFile(filename);  
                }  
            }
        
        
    }



    6、表格中添加查看按钮列,用户点击查询,可以跳转页面显示这本书的详细信息,包括封面图片。要求用到重定向。(HttpHandler),根据书籍ID生成重定向页面。

     

    相关代码:

    webconfig中添加:

      <httpHandlers>
          <!-- verb 请求的方式,post ,get  path对谁进行拦截,预处理;type=类名(httpHandler,完整的类名) -->
          <!--<add verb="*" path="back/*.jpg" type="mytool.StringHandler"/>-->
          <!--<add verb="*" path ="img/*.jpg" type="mytool.LogoPicHandler"/>-->
          <add verb="*" path="books/*.shtml" type="mytool.ReWrite"/>
        </httpHandlers>
    建一个rewrite类:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// ReWrite 的摘要说明
    /// </summary>
    namespace mytool
    {
        public class ReWrite : IHttpHandler
        {
    
    
            public bool IsReusable
            {
                get { return false; }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                //throw new NotImplementedException();
                string Url = context.Request.Url.ToString();
                string id = Url.Substring(Url.LastIndexOf("/") + 1);
                string idd = id.Replace(".shtml", "");
                context.Server.Execute("~/DefaultBook.aspx?bid=" + idd);
            }
        }
    }


    7、表格中添加下载按钮列,用户点击下载书的封面,可以把查询结果保存为excel文件。

    GridView1中查看和下载功能代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using Microsoft.Office.Interop; 
    using Microsoft.Office.Interop.Excel;
    public partial class DefaultBook : System.Web.UI.Page
    {
        DataSet rs = new DataSet(); //内存的数据库
        MySqlTool.Tool tool = new MySqlTool.Tool();//实例化tool类
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
    
                this.Label1.Text = Request["bid"];
                string bookid = Request["bid"];//获取bookid
                //定义连接串
                string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["myconnstr"].ConnectionString;
                string selectSql = "select * from book where bookid=@mybookid";//定义查询sql语句
                //定义SqlParameter数组,存储参数
                SqlParameter[] parameters = {   
                            new SqlParameter("@mybookid",bookid)  
                                            };
                //调用ExecuteSql方法返回Dataset
                DataSet rs = tool.ExecuteSql(connstr, selectSql, parameters, CommandType.Text);
                this.GridView1.DataSource = null;
                this.GridView1.DataSourceID = null;
                this.GridView1.DataSource = rs.Tables[0];   //将数据传递到GridView1
                this.GridView1.Visible = true;
                this.DataBind();           
            }
            catch {
    
                Response.Redirect("login.aspx");//捕获异常,重定向到登录页
            
            }
        }
    
        
        
        protected void Button1_Click(object sender, EventArgs e)
        {
            Export(".xls", "test.xls");//下载excel文件
          
        }
       
        private void Export(string FileType, string FileName)
        {
            //
            Response.Charset = "GB2312";
            Response.ContentEncoding = System.Text.Encoding.UTF8;
            //HTTP协议规定的,PHP,JSP,ASP.NET  web
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
            Response.ContentType = FileType;
            //页面的状态
            this.EnableViewState = false;
    
            StringWriter tw = new StringWriter(); //reader ,writer 字符流         
            HtmlTextWriter hw = new HtmlTextWriter(tw);
    
             int nHideCols = 0;
             for (int i = 0; i < GridView1.Columns.Count; i++)
             {
                 if (GridView1.Columns[i].HeaderText == "封面")
                 {
                     GridView1.Columns[i].Visible = false;
                     GridView1.Columns[i].ControlStyle.Width = 0;
                     nHideCols = 1;
                     break;
                 }
             }
            GridView1.RenderControl(hw); //error 的原因,runat server 覆盖一个处理
            Response.Write(tw.ToString());
            Response.End();
        }
    
        public override void VerifyRenderingInServerForm(Control control)
        {
            //base.VerifyRenderingInServerForm(control);
        }
    }

    目前就写成了这样,感觉还有好多地方需要优化,希望和大佬交流学习。大部分代码都已经粘在这里了,完整代码放在下载页了,地址:点击打开链接





    展开全文
  • 优化查询,可以进行模糊查询,不限制输入 页面发生相应的改变 这次几乎全部都进行了修改,遇到了很多错误(特别是对查询的优化,卡了好久) 代码结构: 表结构: 其中:sysuser用来存储用户信息(账号、...
    • 本次处理,完全更新了表结构
    • 因为表结构改变代码相应的修改
    • 对用户密码进行了加密和解密处理(自写函数封装在工具类中)
    • 注册加密,登陆解密(之前存储的用户信息清空)
    • 优化查询,可以进行模糊查询,不限制输入
    • 页面发生相应的改变
    • 这次几乎全部都进行了修改,遇到了很多错误(特别是对查询的优化,卡了好久)


    代码结构:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 表结构:

    在这里插入图片描述

    • 其中:sysuser用来存储用户信息(账号、密码、学校、生日等等,其中密码加密存储):

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    SC表

    在这里插入图片描述

    Course表

    在这里插入图片描述
    注册界面发生相应的改变(验证方式相应的也改变):
    在这里插入图片描述

    • 一般用户界面:左侧显示当前登录用户信息,查询时候不再限制输入,都可匹配:
      在这里插入图片描述
      学生选课信息栏(可以输入任何信息进行查询):
      在这里插入图片描述

    • 代码如下:(Course.java)

    package entity;
    
    public class Course {
    	private String sno;
    	private String name;
    	private int grade;
    	private String cno;
    	private String course_name;
    	
    	public String getCourse_name() {
    		return course_name;
    	}
    
    	public void setCourse_name(String course_name) {
    		this.course_name = course_name;
    	}
    
    	public Course(String sno , String name ,String cname, int grade) {
    		this.course_name = cname;
    		this.grade = grade;
    		this.sno = sno;
    		this.name = name;
    	}
    	
    	public String getSno() {
    		return sno;
    	}
    
    	public void setSno(String sno) {
    		this.sno = sno;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getGrade() {
    		return grade;
    	}
    
    	public void setGrade(int grade) {
    		this.grade = grade;
    	}
    
    	public String getCno() {
    		return cno;
    	}
    
    	public void setCno(String cno) {
    		this.cno = cno;
    	}
    }
    
    
    • User.java
    package entity;
    
    public class User {
    	
    	private String username;
    	private String password;
    	private String image_path;
    	private String school_name;
    	
    	private String mobile;
    	private String birthday;
    	
    	public String getImage_path() {
    		return image_path;
    	}
    
    	public void setImage_path(String image_path) {
    		this.image_path = image_path;
    	}
    
    	public String getSchool_name() {
    		return school_name;
    	}
    
    	public void setSchool_name(String school_name) {
    		this.school_name = school_name;
    	}
    
    	public String getMobile() {
    		return mobile;
    	}
    
    	public void setMobile(String mobile) {
    		this.mobile = mobile;
    	}
    
    	public String getBirthday() {
    		return birthday;
    	}
    
    	public void setBirthday(String birthday) {
    		this.birthday = birthday;
    	}
    
    
    	private int is_admin;
    	
    	public User(String name , String pwd , int is_admin , String school , String birth , String mobile){
    		this.is_admin = is_admin;
    		this.username = name;
    		this.password = pwd;
    		this.school_name = school;
    		this.birthday = birth;
    		this.mobile = mobile;
    	}
    	
    	public String getUsername() {
    		return username;
    	}
    
    
    	public void setUsername(String username) {
    		this.username = username;
    	}
    
    
    	public String getPassword() {
    		return password;
    	}
    
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    
    	public int getIs_admin() {
    		return is_admin;
    	}
    
    
    	public void setIs_admin(int is_admin) {
    		this.is_admin = is_admin;
    	}
    }
    
    
    • Servlet类:
    • CourseResultServlet.java
    package servlet;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class CourseResultServlet
     */
    public class CourseResultServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		String path;
    		String stu;
    		String ss;
    		if(request.getParameter("student_num").equals("")) {
    			path = "course.jsp";
    		}else {
    			stu = (request.getParameter("student_num"));
    			//转换编码:
    			ss = new String(stu.getBytes("ISO-8859-1"),"utf-8");
    			path = "search_result/course_result.jsp";
    			request.setAttribute("stu", ss);
    		}
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
    		
    		dispatcher.forward(request, response);
    
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		doGet(request, response);
    	}
    
    }
    
    
    • RegistServlet.java
    package servlet;
    
    import java.io.IOException;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.mysql.jdbc.Connection;
    
    import db_connect.DBConnect;
    import util.Encryption;
    
    /**
     * Servlet implementation class RegistServlet
     */
    public class RegistServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
       
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		Connection connection = (Connection) DBConnect.getConnection();
    		Statement statement = null;		
    		ResultSet resultSet = null;
    		
    		
    		String username = (String)request.getParameter("username");
    		
    		String password1 = (String)request.getParameter("password");
    		System.out.println(password1);
    		String password2 = (String)request.getParameter("password2");
    		
    		Encryption asd = new Encryption();
    		String mi;
    		
    		String school_1 = (String)request.getParameter("school");
    		String school = new String(school_1.getBytes("ISO-8859-1"),"utf-8");
    		
    		String birthday = (String)request.getParameter("birthday");
    		String birth = new String(birthday.getBytes("ISO-8859-1"),"utf-8");
    		
    		String phone = (String)request.getParameter("phone");
    		
    		System.out.println(school + " " + birth + " " + phone);
    		
    		String path = "";
    		String msg = "";
    		int temp = 0;//判断注册账户是否已经存在
    		
    		//接收客户端浏览器提交上来的验证码
    		
    		String use_code = request.getParameter("check");
    		
    		//提取图片的验证码
    		String system_code =  (String) request.getSession().getAttribute("checkcode");
    		
    	
    		
    		String user = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
    		//密码必须同时有字母和数字
    		String pwd = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$";
    		if(username != null && password1 != null && password2 != null && use_code != null 
    				&& system_code != null) {
    			//转换成小写
    			use_code = use_code.toLowerCase();
    			system_code = system_code.toLowerCase();
    			if(use_code.equals(system_code)) {
    				if(username.matches(user)) {
    					if(password1.equals(password2)) {
    						if(password1.matches(pwd)) {
    							mi = asd.secreat(password1);
    							String sql = "insert into sysuser values(\'"+ username + "\',\'" +
    									mi + "\',\'" + school + "\',\'" + phone + "\'," + "\'" + 
    									birth + "\',0," + "\'\')";
    							//将数据库中的数据提取出来
    							try {
    								statement = connection.createStatement();
    							}catch(SQLException e) {
    								e.printStackTrace();
    							}
    							//查询语句
    							String sql2 = "select * from sysuser";
    							
    							try {
    								//将所有信息存入结果集
    								resultSet = statement.executeQuery(sql2);
    							}catch(SQLException e) {
    								e.printStackTrace();
    							}
    							
    							try {
    								while(resultSet.next()) {
    									String user_name = (String)resultSet.getString("UserID");
    									System.out.println(user_name);
    									if(username.equals(user_name)) {
    										temp = 1;
    										break;
    									}
    								}
    							} catch (SQLException e) {
    								e.printStackTrace();
    							}
    							System.out.println(temp);
    							if(temp == 0) {
    								try {
    									statement.executeUpdate(sql);
    								} catch (SQLException e) {
    									e.printStackTrace();
    								}
    								path = "login.jsp";
    								msg = "注册成功,请登录";
    							}else {
    								path = "regist.jsp";
    								msg = "用户已经存在,请换一个用户名注册";
    							}
    						}else {
    							path = "regist.jsp";
    							msg = "密码格式错误";
    						}
    					}else {
    						path = "regist.jsp";
    						msg = "两次输入密码不相同";
    					}
    				}else {
    					path = "regist.jsp";
    					msg = "账号格式错误";
    				}
    			}else {
    				msg = "验证码输入错误";
    				path = "regist.jsp";
    			}
    			
    		System.out.println(msg + path);
    		request.setAttribute("username", username);
    		request.setAttribute("msg", msg);
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
    		
    		dispatcher.forward(request, response);
    		
    	}
    }
    
    	
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    
    }
    
    
    • 加密方法:
    package util;
    
    public class Encryption {
    	String pwd = null;
    	char [] c;
    	public String secreat(String a) {
    		
    		c = a.toCharArray();
    		for(int i = 0 ; i < c.length ; i++) {
    			c[i] = (char)(c[i]+64);
    		}
    		pwd = new String(c);
    		return pwd;
    	}
    	
    	public String free(String a) {
    		c = a.toCharArray();
    		for(int i = 0 ; i < c.length ; i++) {
    			c[i] = (char)(c[i]-64);
    		}
    		pwd = new String(c);
    		return pwd;
    	}
    	
    	public static void main(String [] args) {
    	//用来测试
    		String name = "Hello!";
    		Encryption a = new Encryption();
    		String mi = a.secreat(name);
    		System.out.println(mi);
    		String free = a.free(mi);
    		System.out.println(free);
    	}
    }
    
    
    • jsp文件几乎都发生了改变,先列出一个吧:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="util.Read_user" %>
    <%@ page import="util.Read_student" %>
    <%@ page import = "util.Read_course" %>
    <%@ page import = "entity.Student" %>
    <%@ page import = "entity.Course" %>
    <%@ page import="entity.User" %>
    <%@ page import="java.util.List" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    
    	<SCRIPT LANGUAGE=javascript> 
    		function logout() { 
    		 var msg = "您真的确定要退出吗?"; 
    		 if (confirm(msg)==true){ 
    		  	return true; 
    		 }else{ 
    		  		return false; 
    		 	} 
    		} 
    	</SCRIPT> 
    		<meta name="viewport" content="width=device-width, initial-scale=1">
    		<title></title>
    		<style type="text/css">
    			/* 媒体查询 根据 用户设备的屏幕尺寸来显示, */
    			#all { width: 80%; height: 550px; background-color: pink;
    			margin: auto;overflow-y: auto;}
    			#nav{height: 100px; background-color: lightblue; text-align:center;color:yellow;}
    			#mid{height: 350px;}
    			#mid #midleft{width: 20%; height:350px ;float: left; text-align:center;}
    			#mid #midmid{width: 70%; height:350px ; background-color: lime;float: left;overflow-y: auto;overflow-x: auto;}
    			#mid #midright{width: 10%; height:350px ; background-color: khaki;float: left;}
    			#foot{height: 90px; background-color: yellow; text-align:center;padding-top:15px;
    				padding-left:30px;align:center;}
    			
    			@media only screen and (max-width:1400px ) {
    				#all{width: 80%;}
    			}
    			@media only screen and (max-width:700px ) {
    				#all{width: 100%;}
    			}
    		
    			#all ul{ margin: 0px; padding: 0px; list-style-type: none;
    				height: 60px; background-color: #C71585;}
    			#all li{ float: left; width: 20%;height: 60px;}
    			#all ul li a{display: block;height: 45px; text-align: center; font-size: 22px;
    			font-family: "courier new"; font-weight: 700; color: white; text-decoration: none;
    				/* 塞泡沫 */
    				padding-top:15px;
    				border-right: 2px solid white;
    			}
    			
    			
    			#all ul li a#a1{background-color: blue;}
    			#all ul li a#a2{background-color: forestgreen;}
    			#all ul li a#a3{background-color: black;}
    			#all ul li a#a4{background-color: forestgreen;}
    			#all ul li a#a5{background-color: blue;}
    			#all ul li a:hover {background-color: crimson;}
    			#all ul li a#a1:hover {background-color: gray;}
    			#all ul li a#a2:hover {background-color: gray;}
    			
    		
    	        .search{
    	        	margin-left:36%;
    	            width: 30%;            
    	            display: flex;
    	            text-align:center;
    	            float:left;
    	            /*border: 1px solid red;*/
    	        }
    	        .search input{
    	            float: left; 
    	            flex: 3;
    	            height: 30px;
    	            outline: none;
    	            border: 1px solid red;
    	            box-sizing: border-box;
    	            padding-left: 15px;
    	        }
    	        .search button{
    	            float: right;
    	            flex: 1;
    	            height: 30px;
    	            background-color: red;
    	            color: white;
    	            border-style: none;
    	            outline: none;
    	        }
    	        .search button i{
    	            font-style: normal;
    	        }
    	        .search button:hover{
    	            font-size: 16px;
    	        }
    			
    		</style>
    </head>
    <body>
    	
    	<div id="all">
    			<div id="nav">
    				<ul>
    					<li><a href="user_main.jsp" id="a1" >学生列表</a></li>
    					<li><a href="" id="a2">选修课程</a></li>
    					<li><a href="" id = "a3">课程成绩</a></li>
    					<li><a href="" id = "a4">综合排名</a></li>
    					<li><a href="login.jsp" id = "a5" onclick="javascript:return logout()">退出登录</a></li>
    				</ul>
    				课程信息如下
    				
    			</div>
    			
    			
    			<div id="mid">
    				<div id="midleft">
    					<br>
    					当前用户:
    					<br><br>
    					<table border = '1' cellspacing="1">
    						
    						<tr>
    							<%	
    								String username = (String)session.getAttribute("username");
    								System.out.println(username);
    								Read_user readuser = new Read_user();
    								List<?> list = readuser.read_user(username);
    								for(Object u1:list){
    									User u = (User)u1;
    								%>
    							
    							<td width="200px">姓名</td>
    							<td width="200px"><%=u.getUsername() %></td>
    						</tr>
    						<tr>
    							<td>学校</td>
    							<td><%=u.getSchool_name() %></td>
    						</tr>
    						<tr>
    							<td>生日</td>
    							<td><%=u.getBirthday() %>
    						</tr>
    						<tr>
    							<td>电话</td>
    							<td><%=u.getMobile() %></td>
    						</tr>
    						<tr>
    							<td>身份</td>
    							<td>
    								<%
    									if(u.getIs_admin() == 1){
    										out.print("管 理 员");
    									}else{
    										out.print("普通用户");
    									}
    								%>
    							</td>
    						</tr>
    						<tr>
    							<td>头像</td>
    							<td>null</td>
    						</tr>
    							<%
    								}
    							%>
    					
    					</table>
    				
    				</div>
    				<div id="midmid">
    					<table border = '1' style="margin:auto ;text-align:center" >
    					<tr>
    						<td width="200px">学号</td>
    						<td width="200px">姓名</td>
    						<td width="200px">课程</td>
    						<td width="200px">分数</td>
    					</tr>
    					<%
    						Read_course readcourse = new Read_course();
    						List<?> list2 = readcourse.read_course();
    						for(Object u1:list2){
    							Course u = (Course)u1;
    					%>
    						<tr>
    							<td> <%=u.getSno() %> </td>
    							<td> <%=u.getName() %> </td>
    							<td> <%=u.getCourse_name()%> </td>
    							<td> <%=u.getGrade() %> </td>
    						</tr>
    					<%
    						}
    					%>
    					
    				</table>
    				</div>
    				<div id="midright"></div>
    			</div>
    			<div id="foot">
    				<!--  	<li><a href=" " id="a1" >增加信息</a></li>
    					<li><a href=" " id="a2">删除信息</a></li>
    					<li><a href=" ">修改信息</a></li>
    				-->
    				 <form action="CourseResultServlet">
    				 	<div class="search" >
    						
    						<input type="text" id = "v" placeholder="学号、姓名、课程名(模糊查询)" name="student_num" />
    			            <button><i>搜索</i></button>
    					
    		        	</div>
    				 </form>
    					
    				
    			</div>
    		</div>
    
    </body>
    </html>
    
    展开全文
  • MongoDB详解--MongoDB模糊查询及Java实现

    千次阅读 2019-03-21 14:57:40
    虽然非关系型数据库与传统关系型数据库存储结构和存储方式有很大的不同,但在MongoDB中也可以实现模糊查询。这也大大方便了我们的使用。下面来介绍一下如何操作。 1、在MongoDB客户端进行模糊查询: db....
  • 通过用心设计各种数据结构类型的数据存储,可以实现部分的数据查询功能。因为在Redis的设计中,key是一切,对于Redis是可见的,而value对于Redis来说就是一个字节数组,Redis并不知道你的value中存储的是什么,所以...
  • 数蚕内存数据库基于列式存储,支持C++基础数据结构类型,包括整型、浮点型、字符串型。 数蚕内存数据库任意字段隐含一个基于平衡树的索引,详见create语句,sql语句中save和load语句支持表的保存与加载。 说明:数...
  • 一、Redis基础简介1、Redis官方介绍Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径...
  • Oracle 01 目录 Oracle数据库的安装步骤 搭建上课所用的数据库环境 table (二维表) ***** 查看表结构 ***** ...模糊查询 *** 存储数据 学员管理系统: 内存: 存取的速度很快 数据较容易丢失 贵 文件: 便宜 , 可...
  • 索引是为了加速对表中数据行的检索和创建的一种分散存储的数据结构 很多人在面试的时候说索引是书的目录之类的答案。其实很多面试官不是要你回答这种模糊的概念。记住:索引是一种数据结构 索引上面储存这表数据在...
  • 6.4.4 使用TOP子句 6.4.5 NULL的判断 6.5 模糊查询 6.5.1 使用LIKE运算符进行查询 6.5.2 使用“_”通配符进行查询 6.5.3 使用“%”通配符进行查询 6.5.4 使用“[]”通配符进行查询 6.5.5 使用“[^]”通配符进行查询...
  • 数据库 : 硬盘中的一块空间,按照一定的结构存储数据 数据库管理系统:一个软件 数据库分类:关系型 非关系型 关系型数据库 : 表 字段 记录 数据元素 二维表 mysql的特征 : 开源 关系型 应用广泛 操作方便 安装mysql ...
  • Mysql数据库基础

    2019-12-26 12:40:02
    --请遵循一个程序员的基本素养Mysql数据库操作存储引擎MySQL常用列类型查看表结构和删除表表的约束单表查询简单查询消除结果中重复的数据过滤查询比较运算逻辑运算优先级范围查询集合查询空值查询模糊查询结果排序...
  •  现有的许多不同类型 的技术系统,如关系型数据库、键值存储、操作磁盘文件的map-reduce【映射-规约】引擎、图数据库等,都是为了帮助用户解决颇具挑战性的数据存储与检索问题而设计的。而搜索引擎,尤其是Solr,...
  • 数据库简单理解就是按照数据结构组织,存储和管理数据的仓 库。类似于超市里面的文件柜,按照一定的规律去存储物品。 数据库也是一样,按照一定的规律去存储数据。 2 关系性数据库概念 说人话关系库数据库就是: ...
  • Redis 是什么Redis 是开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串strings, 散列 hashes, 列表 lists, 集合 sets, 有序集合 sorted sets 与范围...
  • 数据库知识点

    2018-04-15 18:58:48
    数据库索引数据库中对数据表的一个或多个字段的值进行排序存储结构;提高数据查找的速度;索引失效的情况使用or查询,前后条件不全带有索引的;使用like模糊查询时,以%开头;索引字段为字符串类型时,查询没带...
  • Docker中使用mongoDB数据Mongodb的介绍MongoDB存储的数据特点什么是MongoDBMongoDB的体系结构Docker安装与启动Mongodbdocker安装mongodb镜像运行mongo的容器查看Docker容器启动的服务添加防火墙端口连接Mongo创建...
  • Orcale以二维表的形式表示数据,并提供了SQL(结构查询语言),可完成数据查询、操作、定义和控制等基本数据库管理功能。Orcale具有很好的可移植性,通过它的通信功能,微型计算机上的程序可以同小型乃至大型计算机...
  • 删除库四、表的基本操作1、创建表2、查看数据表3、查看已有表的字符集4、查看表结构5、删除表五、数据库操作1、插入(insert)2、查询(select)3、更新表记录(update)4、删除表记录(delete)六、高级查询语句1、模糊...
  • 5.3.1 简单OQL查询数据库入口点和迭代变量 92 5.3.2 查询结果和路径表达式 93 5.3.3 OQL的其他特性 95 5.4 C++语言绑定概述 98 5.5 对象数据库概念设计 99 5.5.1 ODB与RDB概念设计的区别 99...
  • 不幸的是,虽然关系型数据库历经了约30年的发展,有成熟的理论和大量的实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务的需要和编程的方便,把字段这张表放几个那张表放几个...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    4.当进行模糊查询时,应使用关键字like和通配符问号(?)或百分号"%"。 5.Where子句可以接收From子句输出的数据,而HAVING子句则可以接收来自WHERE、FROM或GROUP BY子句的输入。 6.在SQL语句中,用于向表中插入数据...
  • 查询DB一样查询redis

    万次阅读 2017-04-12 18:31:52
    设计目的:希望查询redis缓存像查询数据库一样,支持多条件组合查询、模糊查询、区间查询、多字段排序查询、分页查询。其实,在redis中,就只有key-value这种存储结构,如何利用这种存储结构完成复杂的查询呢?让...
  • 可选存储数据结构:哈希表、B树、B+树。 它们作为单个数据查询都很快。但为什么最终选择B+树呢?我们先看它们的区别: ...但是对于关系数据中的批量查询、区间查询、模糊查询以及排序。B+树的性能...
  • 用户只需在创建表时添加FULLTEXT KEY类型索引即可利用模糊搜索功能,然后在查询中使用LIKE子句。 有关更多说明,请参见github 。 执照 baidu / BaikalDB已获得Apache License 2.0的许可 致谢 我们特别感谢RocksDB...
  • 6.2.4 数据库对象的存储分配 175 6.2.5 增加表空间的大小 176 6.2.6 删除表空间 177 6.2.7 用户表空间的数目 178 6.2.8 表空间限额 178 6.2.9 主动的表空间的空间预警 178 6.2.10 管理重做数据的生成 ...
  • 目录 1 需求分析 3 1.1 系统目标 3 1.2 需求定义 3 ...可以对图书进行的精确、模糊查询并讲查询信息以列表的方式呈现给用户,方便用户查找信息,另外,对超期的借阅情况能自动给出提示信息。 系统功能结构
  • 这里的静态结构化数据,是指从关系型数据库中抽取存储在NoSQL、文本文件或者其他格式文件的数据,并且数据不再变化。 全文检索是指任意字段的精确查询、模糊查询&范围查询。字母或数字模糊查询只支持前导查询,...
  • 我们的产品均基于Redis开发,但是Redis的...OnceDB并不改变Redis的数据存储结构,Redis数据库文件可以直接在OnceDB中操作,然后再返回Redis中使用。全文搜索OnceDB提供直接搜索指令,支持 String 和 Hash 等对象,搜...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

数据库存储结构模糊查询