发表于: 2018-02-20 22:18:46
1 644
今天完成:
想复习一下之前的任务,从任务1到任务三。按照官网中学生报名的信息,做一个网页,实现数据库的增删改查,并把这个程序发布到服务器上。
1,一个小的知识点:src是source源的意思,源文件,resources是资源的意思。The difference between source and resource is a resource is something useful (water, for example), and a source is where the thing came from,来自知乎:
作者:栗子
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2,一个小知识点。在xml文件中’&’符号不被识别,应该写成'&’,但是在jdbc.proterties文件中,可以被识别,应该写成’&’,如果写成'&’将不被识别。
3,尝试使用之前没有用过但是据说非常强的连接池,阿里巴巴的druid连接池。与dbcp连接池的区别体现在配置文件applicationContext.xml中:
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!--基本属性 url、user、password -->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat" />
</bean>
这其中有一些参数不是太理解。比如PSCache,配置监控统计拦截的filters,validationQuery等。反正是跑通了,学习了以后的任务,再回来看看。
4,尝试设计一个多条件模糊查询,要用到动态SQL语句这个知识点。之前将小课堂的时候遇到的一个问题,今天终于搞清楚原因了。
问题:使用<where>标签据说可以将下边<if>标签中多余的AND去掉,但是发现这样做什么都查不出来,Mapper.xml代码如下:
<select id="getStudentByCondition" resultType="com.byou.pojo.Student">
SELECT * FROM Student
<where>
<if test="name !=null">
name LIKE #{name}
</if>
<if test="QQ !=null">
AND QQ LIKE #{QQ}
</if>
<if test="XZType !=0">
AND XZType = #{XZType}
</if>
<if test="Entrance_Date !=0">
AND Entrance_Date = #{Entrance_Date}
</if>
<if test="Graduate_From !=null">
AND Graduate_From LIKE #{Graduate_From}
</if>
<if test="Online_No !=null">
AND Online_No LIKE #{Online_No}
</if>
<if test="Brother !=null">
AND Brother = #{Brother}
</if>
</where>
</select>
对应的test如下:
Student student = new Student();
// student.setName("%任%");
student.setQQ("%2%");
// student.setXZType(1);
// student.setEntrance_Date(20180112);
// student.setGraduate_From("梁山技校");
// student.setOnline_No("JAVA");
// student.setBig_Will("还我葵花宝典");
// student.setBrother("任我行");
// student.setKnow_From("道听途说");
List<Student> studentList = studentService.getStudentByCondition(student);
System.out.println(studentList);
发现test中的任何一个条件得到的结果都是[ ],查不到东西,也没有报错。
原因:在设计pojo类的时候,没有对参数进行初始化,比如“String name;”。我把所有的条件都初始化一下,例如“String name = null;”,之后,成功查到数据。
根本原因:对于String类型的局部变量,Java不会给它初始化(即赋值null),只有在String是全局变量时才会给他赋值null并占用一定的内存空间。程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
怎么改:将pojo类(即Student.class)中的所有变量都初始化一下,String类型初始化成null,整型初始化成0。成功查出数据库信息。
5,了解到在实际生产环境中,数据库是不提供删除操作的,因为删除操作有很大的隐患。替代的办法是在表中新建一列,使用这个列的数据标注此数据是否删除。所以我在mysql数据库中设计表如下图:
delete默认值是0,表示没有删除,需要删除的时候,只需要将这个数值改为1,即可表示已删除。
有了上边这个前提,当需要列出所有学员的时候,就需要改动一下SQL,如下:
<!-- 查询全部用户-->
<select id="getAllStudent" resultType="Student">
select * from Student WHERE delete=0
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>
其中start和count是为了分页显示。
遇到问题:
请看上边的过程。
收获:
回顾了之前的任务。
明天计划:
继续完善这个程序,回顾任务一到任务三。
评论