发表于: 2017-08-12 01:49:19

3 1036



一、今天完成的任务

*今天日报记录的所有操作都是在昨天创建的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,此包现在有两个接口了
接口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);
       }
结果:
系统报错:
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>
进行第二次测试,结果如下,通过了。
再把自动扫描映射接口的部分删掉,进行第三次测试:

第三次测试也通过了,看来真的是这个自动扫描映射的功能没用吗?


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

延期风险:无





返回列表 返回列表
评论

    分享到