发表于: 2018-03-24 23:48:54
2 458
今天新学了不少东西呢,很多以前没搞懂的东西搞懂了
@Autowired
private StudentService studentService;
比如说这么一句话,@Autowired相当于一个声明,代表告诉spring,程序要开始装配了。
private StudentService studentService;可以这么理解。普通的类里面都有属性,比如private int id;private是限制级别符号,int是数据类型,id是属性;相对应的,private是限制级别符号,StudentService是类的类型,和数据类型的作用是一样的,只不过是一个类的类型而已。studentService是这个测试类的属性。通过这个属性,才能在接下来调用方法。
//RunWith就是一个运行期,括号里代表让测试运行与spring环境
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件
//Context(环境) Configuration(配置)
@ContextConfiguration(locations = {"classpath:AS.xml"})
这是写在测试类头上的东西 @RunWith是一个运行器,后面括号里的内容,代表在spring环境里用JUnit4测试。
@ContextConfiguration 意思是环境配置,后面的读取spring配置文件。classpath代表类路径,其实是相对路径。引用的是spring配置文件。location是位置的意思。
@Test
public void test1() {
Student student = new Student();
student.setId("010");
student.setAge(15);
student.setName("哈哈");
student.setSex("女");
studentService.saveStudent(student);
System.out.println(student);
}
从头开始解释,void代表这个test1方法没有返回值,Student是创建了一个新对象,新创建的对象调用setId方法,相当于给ID赋值,赋完四个值之后,因为我的目的是要往数据库写入数据,写入数据在mapper。xml文件里面就是saveStudent方法,SQL语句是insert into t_app_student (id,age,name,sex) values ("010",15,"哈哈","女");
<mapper namespace="com.ptteng.dao.StudentDao">
<insert id="saveStudent" parameterType="com.ptteng.entity.Student">
insert into t_app_student (id,name,sex,age) values (#{id},#{name},#{sex},#{age})
</insert>
<select id="getStudent" resultType="com.ptteng.entity.Student" parameterType="java.lang.String">
select * from t_app_student where id =#{id}
</select>
</mapper>
解释mapper.xml文件。sql语句没必要解释了,就说第一个参数类型,为什么save方法是studentDao里面的,但是参数类型却指向了Student类呢?因为方法把四个属性值都包括了,只有Student类里面有这四个属性值。
为什么到了查询的时候,参数类型又变成了java.long.String了呢?因为id的数据类型在Student类里面规定的是String,所以参数类型也是String。如果id数据类型是int的话,那么parameterType=java.lang.Int了。
那么它的结果类型怎么又变成了com.ptteng.entity.Student呢?是这样,因为根据id查另外三个参数是有返回值的,咱们看一下StudentDao里面的get方法,接口里面只有一个抽象的方法体,没有可执行的方法,具体执行的方法在StudentService里面。那里面的方法体是要求返回一个return student的,这就算是对抽象接口的实现吧?(不知道对不对)。而要求返回的属性,名字年龄性别什么的,依然是在Student这个实体类里面。
@Test
public void test4() {
Student student = new Student();
student.getName();
student.getSex();
student.getAge();
studentService.getStudent("1");
System.out.println(student);
}
我在测试类里面根据自己的理解,写了一个查询方法测试,结果返回来的,全部是空值,不知道是哪里出错了。理论上来讲,我不是要根据ID查询其他三项么?那我写的没有错啊,最后也调用了查询方法体了,我点击,也能跳转,不知道为什么就是不对。
然后我改了一下:
@Test
public void test5() {
Student student = new Student();
student.getId();
studentService.getStudent("002");
System.out.println(student);
}
运行过后,依然是这个:Student{id='null', name='null', sex='null', age=0}。明明是有值的,但就是查不出来,说明我方法写错了,但我不知道错在哪里。
参照我以前的任务,我又改了查询方法:
@Test
public void test4() {
Student student = studentService.getStudent("002");
System.out.println(student);
}
查询结果为:Student{id='002', name='小明', sex='男', age=20}
虽然我写对了,但我不知道为什么刚才就不行。但我可以解读:我创建了一个新的student对象,这个对象调用了studentService的getStudent方法,而这个studentService的类类型又是StudentService这个类,所以也就相当于调用了StudentService类里面的getStudent方法。方法如下:
public Student getStudent(String id) {
Student student = studentDao.getStudent(id);
return student;
}
这个方法其实实现了的是studentDao里面的getStudent方法,返回student。
明天的计划:把spring详细搞明白
遇到的问题:暂无
今天的收获:理解了很多细节的配置,知道了方法的运行。还有log4j里面的四个级别,也复习了。
java任务二开始时间:2018.01.25
预计demo时间:2018.02.12
可能有延期风险,原因是:json看不懂,控制器的逻辑看不懂,所以又回看了java语法
禅道链接地址:http://task.ptteng.com/zentao/project-task-501.html
评论