实习中接触到的数据库知识

作者: 雾里看花最是迷人 | 来源:发表于2017-03-02 18:33 被阅读120次

    在数据库方面,主要是涉及到之前没有接触或者接触很少的知识点。比如存储过程、select top实现数据分页、短路表达式。下面使用简单的例子来说明

    首先在数据库中简单建立一个数据表,如图


    users表.PNG

    对于上表,只是截取部分,数据远不止7个,建表时采用循环插入数据的方法共插入99条数据
    <pre>declare @i int,@j int;
    set @i=1;
    set @j=10;
    while @i < 100
    begin insert into test.dbo.users(id,name,password) values(@i,@j+1,@j+2);
    set @i=@i+1;
    set @j=@j+1;
    end </pre>

    在实际开发中建表时需要注意的问题:相似数据类型的区别
    char:使用时需固定长度,如char(10),表示它占有10个字节,如果实际数据并未达到10字节,则差的部分会以空格来填补
    varchar:使用时虽然设置有长度,如varchar(10),但是实际占位以实际数据为准,若数据只有5个字节则只占5个字节
    text:不需要定义长度,一般用来存储文本数据
    nchar、nvarchar、ntext:与char、varchar和text的区别在于存储数据的方式不同,nchar、nvarchar和ntext采用unicode字符存储数据,所有字符都是使用两个字节表示,因此存储总量(都是存储英文的情况下)char、varchar和text为8000,ncahr、nvarchar和ntext则只有4000

    1.存储过程:在数据库中进行sql代码编写,类似java中的一个方法,可以接收参数,在java代码中可以直接调用这个方法获取数据,避免在java代码中编写sql语句(只是举例,并不是只有java可以使用)
    建立存储过程

    新建存储过程.png
    右键新建存储过程,会得到下面的页面
    存储过程示例.PNG
    本例中先使用简单的查询全部数据,稍后会进行参数的添加
    存储过程getUsers.PNG
    如图:设置方法名为getUsers,查询全部数据
    然后在java代码中进行调用
    <pre>Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test","xxx","xxx");
    CallableStatement cs = conn.prepareCall("{call getUsers()}"); //调用getUser()方法
    ResultSet rs = cs.executeQuery(); //查询结果保存在ResultSet中
    while(rs.next()){ //读取ResultSet中的数据
    String name = rs.getString("name");
    String password = rs.getString("password");
    System.out.println("name is " + name + "and password is" + password);
    }</pre>
    打印结果:
    部分数据.PNG

    2.select top实现数据分页
    select top在数据库中是读取前多少条数据。
    新建存储过程,如下

    存储过程getUsersByIndex.PNG
    上图中select top部分的代码,pageSize是指每个页面显示多少数据,pageIndex是指当前的页面,@pageSize*(@pageIndex-1)得到的结果便是当前页之前已经显示了多少条数据,第二个select top就是获得这些数据的id,然后第一个select top则是从id不在这些id之中的数据开始选取前多少条,由此实现分页功能
    在java代码中进行调用
    <pre>CallableStatement cs = connection.prepareCall("{call getUsersByIndex(?,?)}");
    callableStatement.setInt(1, 10); //第一个参数指的是pageSize,就是每页显示多少数据
    callableStatement.setInt(2, 3); //第二个参数指的是pageIndex,当前的页码
    ResultSet rs = callableStatement.executeQuery();
    while (rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String password = rs.getString("password");
    System.out.println("id is " + id + " name is" + name + " password is " + password);
    }</pre>
    综上就是每页显示10条数据,当前显示第3页,打印结果如下
    第3页的10条数据.PNG

    3.短路表达式
    在涉及模糊查询和全部查询时,可以分两条语句操作,需要写两个方法,但是会有重复代码,使用短路表达式可以将两条语句变为一条, 只需要一个方法即可。还是以上表为例,查询全部数据,查询name中关键字为0的数据(这次不使用存储过程)
    <pre> keyword = "%" + keyword + "%"; //keyword由调用该方法时传入
    String sql = "select * from users where ((0=? and name like '%%') or (name like ?))";
    try {
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test","huangkunkun","312293");
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1, 1); //第一个参数作为判断条件,这里为了执行or后面的语句,直接设置成1
    ps.setString(2, keyword);
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String password = rs.getString("password");
    System.out.println("id is " + id + " name is " + name + " password is " + password);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }</pre>
    上面代码中的<pre>select * from users where ((0=? and name like '%%') or (name like ?))</pre> 如果0=?即传入的参数若满足和0相等,则执行or前面的代码,且忽略or后面的代码,如果等式不成立,则会执行or后面的代码。打印结果如下

    name关键字为0的数据.PNG

    主要知识点就是这些,都是按照自己的理解来写的,可能会有不全面的地方,如果有错误,欢迎指出共同探讨哈。

    相关文章

      网友评论

        本文标题:实习中接触到的数据库知识

        本文链接:https://www.haomeiwen.com/subject/pmdkgttx.html