发表于: 2018-03-13 20:02:43

3 557


今日完成:

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中而不用返回对象?



返回列表 返回列表
评论

    分享到