在数据库方面,主要是涉及到之前没有接触或者接触很少的知识点。比如存储过程、select top实现数据分页、短路表达式。下面使用简单的例子来说明
首先在数据库中简单建立一个数据表,如图
对于上表,只是截取部分,数据远不止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可以使用)
建立存储过程
右键新建存储过程,会得到下面的页面
本例中先使用简单的查询全部数据,稍后会进行参数的添加
如图:设置方法名为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>
打印结果:
2.select top实现数据分页
select top在数据库中是读取前多少条数据。
新建存储过程,如下
上图中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.短路表达式
在涉及模糊查询和全部查询时,可以分两条语句操作,需要写两个方法,但是会有重复代码,使用短路表达式可以将两条语句变为一条, 只需要一个方法即可。还是以上表为例,查询全部数据,查询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后面的代码。打印结果如下
主要知识点就是这些,都是按照自己的理解来写的,可能会有不全面的地方,如果有错误,欢迎指出共同探讨哈。