发表于: 2017-08-12 01:49:19
3 1038
一、今天完成的任务
*今天日报记录的所有操作都是在昨天创建的spring+mybatis项目上修改进行的
(一)Spring+mybatis使用连接池
为什么要使用连接池呢?简单来说,获取一个新的数据库连接非常耗费资源,使用连接池可以将使用过的连接放在内存,当下一次需要获取连接时,可以直接从内存中把这个连接拿出来用,不需要创建新的连接,减少资源消耗。
1.添加必要的jar包
此处使用的连接池是DBCP。需要的jar包有三个commons-pool.jar,commons-dbcp.jar,spring-jdbc.jar。昨天的例子已经下载了spring-jdbc.jar,只需要在pom.xml添加其余两个jar包就可以了
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
2.修改ApplicationContext.xml
因为要连接的数据库仍旧是MySQL,所以db.properties属性文件不需要修改。ApplicationContext.xml修改部分已用红色字体标注:
<context:property-placeholder location="classpath:db.properties"/>
<bean id="jdbcdataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 1.连接池启动时创建的连接数量 -->
<property name="initialSize" value="5"/>
<!-- 2.同一时间可以从池分配的最多连接数量,设置为0时表示无限制 -->
<property name="maxActive" value="30"/>
<!-- 3.池里不会被释放的最多空闲连接数量,设置为0时表示无限制 -->
<property name="maxIdle" value="20"/>
<!-- 4.在不新建连接的条件下,池中保持空闲的最少连接数 -->
<property name="minIdle" value="3"/>
<!-- 5.设置自动回收超时连接 -->
<property name="removeAbandoned" value="true"/>
<!-- 6.自动回收超时时间(以秒为单位) -->
<property name="removeAbandonedTimeout" value="200"/>
<!-- 7.设置在自动回收超时连接的时候打印连接的超时错误 -->
<property name="logAbandoned" value="true"/>
<!-- 8.等待超时以毫秒为单位,在抛出异常之前,池等待连接被回收的最长时间(当没有可能连接时)。设置为-1表示无限等待 -->
<property name="maxWait" value="100"/>
</bean>
3.单元测试
单元测试的代码不需要修改,项目右键->Run As->Junit Test。结果如下:
(二)spring+mybatis使用注解
mybatis除了可以通过映射文件*Mapper.xml实现对数据库的操作外,还可以通过注解的方式实现。而且使用注解的方式,注解可以直接写在接口里,非常方便
1.新增一个接口
在包com.jnshu.spring.mybatis.dao下新建一个接口BookDao2.java,此包现在有两个接口了
.png)

接口BookDao2.java代码如下
public interface BookDao2 {
@Select("select * from Book")
public List<Book> retrieveAllBooks();
}
2.用Junit4测试
测试代码如下
@Test
public void testRetrieveAllBooks(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
BookDao2 dao2 = ctx.getBean(BookDao2.class);
List<Book> books = dao2.retrieveAllBooks();
for(Book book:books){
System.out.println(book.getBookName());
}
assertNotNull(books);
}
结果:
.png)

系统报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dao2' is defined
在ApplicationContext.xml中找不到名字为“dao2”的bean,可是我昨天明明添加了Spring的自动扫描映射接口的,难道没起作用?
<!-- 自动扫描映射接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定sql回话工厂,在上面配置过 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 指定基础包,即自动扫描com.jnshu.spring.mybatis.dao这个报下所有接口类 -->
<property name="basePackage" value="com.jnshu.spring.mybatis.dao"/>
</bean>
先尝试在ApplicationContext.xml中 定义“dao2”的bean:
<bean id="dao2" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.jnshu.spring.mybatis.dao.BookDao2"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
进行第二次测试,结果如下,通过了。
.png)

再把自动扫描映射接口的部分删掉,进行第三次测试:
.png)

第三次测试也通过了,看来真的是这个自动扫描映射的功能没用吗?
3.在接口BookDao2.java新增两个方法并测试
新增加的方法,仍旧是查询语句,但都带了参数,分别为根据id找书、根据id,bookname找书。用两个参数查询的方法有个坑,必须要用注解@Param指定参数的位置,否则Junit会报错。
//这个语句只有一个参数id,不需要使用注解@Param
@Select("select * from Book where id=#{id}")
public Book retrieveBookById(int id);
//这个语句有两个参数A、B,需要用注解@Param指定A、B的位置,否则Junit4会报错
@Select("select * from Book where id=#{A} and bookName=#{B}")
public Book retrieveBookByIdAndName(@Param("A")int id,@Param("B")String bookname);
测试类代码如下
@Test
public void testRetrieveBookById(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
BookDao2 dao2 = ctx.getBean(BookDao2.class);
Book book = dao2.retrieveBookById(2);
System.out.println(book.toSting());
}
@Test
public void testRetrieveBookByIdAndName(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
BookDao2 dao2 = ctx.getBean(BookDao2.class);
Book book = dao2.retrieveBookByIdAndName(4, "国际政治");
System.out.println(book.toSting());
}
单元测试结果如下
二、遇到的问题
引入的Spring自动扫描没有自动添加我新增的接口
明天百度看看
三、收获
学会配置连接池以及使用注解实现操作数据库
四、明天的计划
这两天补了一些基础知识,任务进度上慢了一点。明天可以提速..
1.完成JDBCTemplate
2.用Try...catch捕获异常
3.完成单步调试
4.完成步骤21
五、进度
当前进度:步骤21
任务开始时间:2017.08.08
预计提交时间:2017.08.15
延期风险:无
评论