1、绝对路径、相对路径与根路径
这三个路径经常搞不清楚,今天我重新梳理一下这三个路径的区别
D:
——mycompany
├─ web
├─ page
├─ utils.html
│ ├─ utils.html
│ └─ www.html
├─ abc.html
└─ utils.html
现在假设我的mycompany目录在D盘根目录下,同时这也是我的项目的根目录,在这个目录下有一个文件夹web还有两个html文件,在web目录下有两个html文件,y一个目录page,其中一个是utils.html,以web的直接目录下的utils.html为出发点来说明这三个路径的区别。
-
绝对路径:d:/mycompany/web/utils.html这个路径就是utils.html的绝对路径,绝对路径从盘符开始。
-
相对路径:如果我想在utils.html中增加一个指向d:/mycompany/utils.html的超链接,应该这样写
<a href="../utils.html">utils.html</a>
在这个超链接中,"../"表示上一级目录,web下的utils.html文件的上一级目录就是mycompany目录,另外"./"表示当前目录,比如www.html在utils.html文件中就可以这样写:"./www.html"或直接"www.html"。相对路径以当前文件为起点。
-
根路径:根路径以当前项目为起点。"/web/utils.xml"。根路径实际上省去了d:/mycompany。
2、数据库防止乱码
有时候尽管我们在前端页面、请求头以及响应头中设置了UTF-8编码,返回到前台的中文字符依然是乱码,这可能与我们的数据库编码有关:
url=jdbc:mysql://localhost:3306/book?characterEncoding=utf-8
这样设置以后数据库就是utf-8编码传输数据了。
3、@Resource与@Autowired的对比
相同点:
- @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。都可用于对对象进行装配
不同点:
- 提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
- 注入方式:@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。@Resource默认按照ByName自动注入,@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
4、spring单元测试
junit自带的单元测试不能加载spring的配置文件,所以我们需要配合spring的单元测试,我们之前已经添加过spring单元测试的依赖,所以这里直接写代码就行了。
UserDaoTest
package com.qianfeng.dao;
import com.qianfeng.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-mybatis.xml")
public class UserDaoTest {
@Resource
private IUserDao userDao;
@Test
public void TestGetAllUsers() {
List<User> users = userDao.getAllUsers();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void deleteUser() {
}
@Test
public void getUserById() {
User user = userDao.getUserById(1);
System.out.println(user);
}
@Test
public void updateUser() {
}
@Test
public void saveUser() {
}
}
这个类是用来测试Dao层的,@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-mybatis.xml")这两个注解的作用是配置加载类和配置上下文。我们只配置了spring-mybatis.xml这个spring配置文件是因为不需要spring-mvc.xml这个文件,只测试dao层用不到spring-mvc.xml的配置。
-
测试dao层只需要读取spring-mybatis.xml文件
-
测试service层需要把service的组件扫描从spring-mvc.xml挪到spring-mybatis.xml中
-
测试controller层使用浏览器或者postman,不使用组件测试
注意:一定要保持dao的接口名与对应的xml文件名一致,否则会出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)这种异常
5、正向工程与逆向工程
正向工程:pojo->数据库表
逆向工程:数据库表->pojo
网友评论