发表于: 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>
<!--spring对c3p0的依赖-->
<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属性为getUser,id属性值必须是唯一的,不能够重复
使用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小程序。
评论