发表于: 2018-03-13 20:02:43
3 556
今日完成:
1.Spring配置
1)了解注入,依赖注入(IOC)
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。 具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成, 因此,称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
而配置文件aplicationContext.xml(包括所有.xml文件或者其它后缀的配置文件)的作用,就是以配置文件的形式把类放入到spring容器中。
配置文件aplicationContext.xml:
看的时候不知道里面是什么东西,但是用到了就会明白这是什么,如果是一堆代码只看也看不明白。
//xml
<?xml version="1.0" encoding="UTF-8"?>
//整个一段是由<beans>标签包裹住,就相当于是整个spring的bean的大包,需要用到什么东西就在里面写,然后就被调用的时候(依赖注入),就可以纳入到Spring容器里:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
而<bean>就是写在<beans>里的一个个小的类似目录/检索/导向/数据参数的文件,每有一个需要加入的类或者其它文件就写入一个<bean>标签(写在</beans>标签前面),<bean>标签里面也是根据需要写其它的属性或者标签,例如<property>标签来定义值。Spring会在执行无参数的构造器后、创建默认的bean实例后,调用里面对应的setter方法为程序注入属性值,而<property>定义的属性值将不再由该bean来主动创建、管理,而改为被动接收Spring的注入,而识别每个<bean>都是通过它的id属性,id属性是唯一的:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 加载类并进行配置 -->
<bean class="com.bean.User" id="user" p="9" ></bean>
</beans>
上面的class就是需要导入的文件名,比如我有一个User类(User.java)需要导入,就在class里写com.bean.user。com.bean是包名,user是在其内的一个类。当然要有User这个类,而spring框架就是有很多已经写好的类可以使用<bean>标签去传参导入。
现在这个user类需要我们自己写,然后通过xml配置,再使用的时候就可以直接调用到里面的配置和值
关于get和set方法:为什么要里面要写get、set方法?get和set方法是获取和使用参数,程序就是通过这两个方法去得到(当前)参数使用参数,return返回参数。就是得到、修改以后再把这个参数当作自己的,返回给使用到本方法的其它方法。这就是实体类的基础。
实体类:把某个对象或者某个表用实体类写出来封装好,它里面的参数(属性)对应数据库表和配置里的参数(属性)。这样java程序可以很方便的通过它来操作存放与传输对象数据。和抽象类不同,尽量把实体类和抽象类分开来。
实际上aplicationContext.xml就是配置<beans>。只是需求不同里面配置的<bean>就不同,但是一般来说应该有几个固定的配置Spring。
java是面向对象的语言,所以它是用现在常见的MVC设计模式体现出来,所以我们的dao-jdbc也是用这个思想来做。
MVC设计模式:模型(model)-视图(view)-控制器(controller)
建造模型 Model:实体类,抽象类等等,就是具体的各种方法,写好以后放在那里供控制器(controller)操作,它们也是来回调用。
视图显示 View:前台显示,模型(model)把数据从数据库提取到前端,操作完毕再更新到数据库。
控制器操作 Controller:不对参数操作,就是指挥(model)去做各种事情。就好像电商快递,我们是前台操作购买,控制器去命令谁去去仓库提货,谁给我们打包商品,谁给我们运输。
具体怎么做呢……
使用JDBCTemplate的时候分离Interface和Imple
根据此,分离的话就先建两个包,Interface和imple,接口和实现类,还有一个实体类单独放。
com.bean是实体类,interf是接口。(理解错误)
先写接口,然后写它的实现类,还有对象的实体类。
接口:在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。但是接口不是类,不能使用new 运算符实例化一个接口。如 x=new comparable(......);//这个是错误来的。但是可以声明接口变量Comparable x; //这是允许的。http://www.runoob.com/java/java-interfaces.html
晕了。
那在接口中需要写什么东西?
接口中只需要写下面类要实现的方法:public List<User> findAllUser(); <>是泛型,算是一个约束,只要求list里面的是User类型。
UserDao.java (interface)
这里是findAllUser()方法。还可以写入增删改的方法(create/update/delect),然后在实体类里面去写方法的实现。
P: public void CreateUser(参数,参数);
然后写实体类:
User.java
下面写每个属性的get和set方法,如:
对了,可以在实体类里面添加toString()方法,方便查看。
测试类调用的时候直接就在前台输出了。
然后是实现类,对应接口Dao:
UserDaoImp.java implements是继承的接口,开始的时候就写成important了…脑子瓦特了…
整个目录:(修改后)(com.dpply.demo是另外的不用管)(java大小写明显分开,不能有任何错,无论是java还是xml配置文件)
com.apply.dao : UserDao.java (接口)
com.apply.imp : UserDaoImp.java (实现类)
com.apply.user : User.java (实体类)
Test : test.java (测试类,写完前面以后用来测试)
每写完一个类在配置文件中添加它的Bean配置:
applicationContext.xml
数据库表(对应user实体类):
最后是测试():
Test.java
运行,报错。
报错捡几条比较多的:
Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource';
Bean property 'userpassword' is not writable or has an invalid setter method
Property 'driverClassName' threw exception;
rror creating bean with name 'user' defined in class path resource [applicationContext.xml]: Cannot resolve reference to bean 'userDAO' while setting bean property 'dao';
由于纯输入习惯…以上很多错误都是写的时候不仔细导致的,看着都能写错。例如字母写反漏写,大小写,半全角等等,一旦某个角落出错找不到原因浪费很多时间。所以还是尽量使用系统提示自动补全。
Bean property 'jdbcTemplate' is not writable or has an invalid setter method;
Bean property 'dao' is not writable or has an invalid setter method;
public UserDao getDao() { return dao; }
public void setDao(UserDao dao) { this.dao = dao; }
一直报“Bean property 'dao' is not writable or has an invalid setter method;”错误,原来是set方法没有写好。同样的 get/set方法 可以用String声明也可以用UserDao声明,就像:
public void setJdbcTemplate ( JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }
里面setJdbcTemplate ( JdbcTemplate jdbcTemplate) 一样,this是代表当前参数就是括号里的参数。
找bug是很头疼的事。费了好多时间去找。
重新整理了一遍,把错误一个个找到修改后运行成功:
明天计划:
1、重新写一遍然后写入update/create/delect方法运行测试;
2、使用Mybatis写jdbc连接;
问题与收获:
了解了接口与继承的方法,实现方法。get和set的使用。
xml配置信息。还有如何用jdbc操作数据库,一步一步理解方法。
熟悉了mvc思想,Spring框架的大概。
最大的问题就是找bug,不知道从何下手。
还有一些比较基础的问题,需要多看资料。
xml里面的bean是如何指向的?property是对应的哪里?是不是它的class是哪里它就对应哪里的变量?
一些方法比如“public void processRow(ResultSet rs)、RowCallbackHandler()”,为什么要这样写?查询不到processRow的具体实现。
比如 jdbcTemplate.query(sql,new RowCallbackHandler() {}); query出来以后是存放在哪里的? 是不是在方法中直接数据就存入了list中而不用返回对象?
评论