发表于: 2018-03-13 22:31:51

1 577


今日完成

1,学习了下spring,

使用Spring框架的好处是什么?

  • 轻量:Spring 是轻量的
  • 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  • 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  • 容器:Spring 包含并管理应用中对象的生命周期和配置。
  • MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
  • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。


IoC : 这是最重要的,也是最基础的, Spring的基础。负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期。


2,依赖注入的方式:

属性注入

构造方法注入

工厂方法注入(很少使用,不推荐)


1),属性注入

  通过 setter 方法注入Bean 的属性值或依赖的对象。属性注入使用 <property>

元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value>

子节点指定属性值 。属性注入是实际应用中最常用的注入方式。HelloWorld类中的setName()方法,对应上边代码中的name属性,

例如:把setName()方法名改为setName2(),property中的name属性值为name时则会报错,需要将name属性改为name2。

2),构造方法

  构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。   构造器注入在 <constructor-arg>

元素里声明属性, <constructor-arg>

中没有 name 属性。使用value属性值或value子节点为属性赋值。可以同时使用索引 index 和type属性对应为哪个属性赋值。index的值表示构造函数中参数的位置。type表示成员属性的类型,例如type="double"

或者type="Java.lang.String"

<bean id="car" class="com.test.spring.beans.Car">

<constructor-arg value="Audi" index="0"></constructor-arg>

<constructor-arg value="ShangHai" index="1"></constructor-arg>

 <constructor-arg value="300000" type="double"></constructor-arg>

</bean>

在给bean注入属性时,若包含其他bean,可以通过 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用。

  也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean,当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性,内部 Bean 不能使用在任何其他地方。

注:

<property name="a" ref="b" />

<ref bean ="b"/>

例如:

<bean id="person" class="service.Person">

    <!-- 控制器调用setAxe方法,将容器中的axe bean作为传入的参数 -->

    <!--此处的name是决定Person类中的那个参数,ref是指bean配置文件中的bean名称-->

    <property name="axe" ref="axe"></property>

</bean>

这里的name和ref虽然是同名的但是name是指Person类中的参数,Person类中有一个Axe类型名叫axe的对象,而ref是当前xml文件中叫做axe的这个bean,把它当作参数传进Person中


说明:在配置文件中配置bean,其实就是在Spring容器中注入类,这个类在Spring容器中有唯一一个表示id,我们可以通过Spring容器去管理这个类


3,bean标签的学习

id:必须存在的属性,新定义的bean变量名称

name:目标bean的名称。若value属性没有设置,这个属性就必须设置。

class,填写类的完整的全路径名称(限定名);

Type:定义引入脚本变量的类;

property:name属性定义的bean的属性名称,用来定义新的bean,

scope:源bean的作用域。若没有设置,搜索范围是从页作用于到应用程序作用域;

toScope:目标bean的作用域。若没有设置,默认值是页作用域。

(可以通过<property>元素的ref特性来指定对其他bean的应用。)


4,给昨天的jdbcTmplate配置了数据库连接池

先增加了两个包

<dependency>
   <groupId>com.mchange</groupId>
   <artifactId>c3p0</artifactId>
   <version>0.9.5.2</version>
</dependency>
<!--springc3p0的依赖-->
<dependency>
   <groupId>com.mchange</groupId>
   <artifactId>mchange-commons-java</artifactId>
   <version>0.2.12</version>
</dependency>

配置数据源

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="driverClass" value="com.mysql.jdbc.Driver"/>
   <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb" />
   <property name="user" value="root" />
   <property name="password" value="612049" />
   <property name="initialPoolSize" value="1" />
   <property name="minPoolSize" value="1" />
   <property name="maxPoolSize" value="10" />
   <!-- 连接池在回收数据库连接时是否自动提交事务。如果为false,则会回滚未提交的事务,
   如果为true,则会自动提交事务。default : false -->
   <property name="autoCommitOnClose" value="false" />
</bean>


5,参照教程写了一个简单的mybatis程序

先建了表,插入了两条数据

项目结构

导包

添加Mybatis的配置文件conf.xml

<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
               <property name="username" value="root"/>
               <property name="password" value="612049"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <!-- 注册userMapper.xml文件,
       userMapper.xml位于mybatis.mapping这个包下,所以resource写成mybatis/mapping/userMapper.xml-->
       <mapper resource="mybatis/mapping/userMapper.xml"/>
   </mappers>
</configuration>

定义表所对应的实体类

public class User {
private int id;
   private String name;
   private int age;

   //实体类的属性和表的字段名称一一对应(users表所对应的实体类)
   public int getId() {
return id;
   }
public void setId(int id) {
this.id = id;
   }
public String getName() {
return name;
   }
public void setName(String name) {
this.name = name;
   }
public int getAge() {
return age;
   }
public void setAge(int age) {
this.age = age;
   }
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
   }
}

定义操作users表的sql映射文件userMapper.xml

<mapper namespace="mybatis.mapping.userMapper">
   <!-- select标签中编写查询的SQL语句, 设置select标签的id属性为getUserid属性值必须是唯一的,不能够重复
   使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
   resultType="mybatis.model.User"就表示将查询结果封装成一个User类的对象返回User类就是users表所对应的实体类-->
   <!-- 根据id查询得到一个user对象-->
   <select id="getUser" parameterType="int" resultType="mybatis.model.User">
       select * from users where id=#{id}
</select>
</mapper>

编写测试代码:执行定义的select语句

public class Test1 {
public static void main(String[] args) {
String resource = "conf.xml";
       InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
       SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
       SqlSession session =sessionFactory.openSession();
       String statement = "mybatis.mapping.userMapper.getUser";
       User user = session.selectOne(statement, 1);
       System.out.println(user);
   }
}

运行结果如下:

明日计划

继续学习mybatis


遇到的问题

1,之前运行的时候报错:### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource mybatis/models/User.xml

原因:

IDEA是不会编译src的Java目录的xml文件,所以在Mybatis的配置文件中找不到xml文件。

解决:

在pom文件中加入

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.xml</include>
           </includes>
       </resource>
   </resources>
</build>

2,关于mybatis还不太懂,明天继续学习


收获

学习了bean标签,配置连接池,运行mybatis小程序。


返回列表 返回列表
评论

    分享到