IDEA-JavaWeb
序
本文将总结IDEA开发JavaWeb项目的一些常见小问题,以便以后开发时解决。
一、项目的创建
1、Maven骨架
- 选择Maven骨架创建web项目
- OverrideMaven项目的配置文件和本地仓库
- 使用骨架创建的web项目,需要手动添加main下面的java以及resources文件夹。
- 删除pom.xml中多余的配置文件,添加需要的配置文件,然后点击maven的加载按钮进行依赖的下载。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>TestProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
2、MVC / 三层架构的项目结构
- 三层架构下项目的目录为以下形式:
其中java.youth.mapper与webapp.youth.mapper的路径名以及项目名称要完全一致。
2.mybatis-config.xml配置文件的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--起别名-->
<typeAliases>
<package name="youth.pojo"/>
</typeAliases>
<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:///db1?useSSL=false&useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="youth.mapper"/>
</mappers>
</configuration>
二、环境的搭建
1、配置Tomcat环境
2、更改URL值
三、出现的问题
1、mapper之间无法对应
解决办法一:检查java和resources下的两个mapper文件夹是否在同一个目录下。
解决办法二:检查mybatis-config.xml文件下是否进行mapper文件的扫描配置。
2、java.pojo的类和数据库表的属性值无法对应
数据库中常用下划线进行命名,而Java常用驼峰命名。 比如:brand_name 和 brandName无法对应的问题。
解决办法一:resources.youth.mapper.BrandMapper.xml文件中用resultMap进行数据的封装,在SQL语句中,添加resultMap属性。
<!--resultMap起别名,将java的驼峰命名与mysql的命名进行转化以便数据封装,id为主键,column为普通属性-->
<resultMap id="UserResultMap" type="User">
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
<select id="SelectAll" resultMap="UserResultMap">
select * from tb_brand
</select>
解决办法二:同样在BrandMapper.xml文件中用resultMap进行数据的封装,在BrandMapper.java文件中用注解的方式添加。
package youth.mapper;
import org.apache.ibatis.annotations.*;
import youth.pojo.Brand;
import java.util.List;
public interface BrandMapper {
@Select("select * from tb_brand;")
@ResultMap("brandResultMap")
List<Brand> selectAll();
@Insert("insert into tb_brand values(#{id}, #{brandName}, #{companyName}, #{ordered}, #{description}, #{status});")
void add(Brand brand);
@Select("select * from tb_brand where id = #{id};")
@ResultMap("brandResultMap")
Brand selectById(int id);
@Update("update tb_brand set brand_name = #{brandName}, company_name = #{companyName}, description = #{description}, status = #{status}, ordered = #{ordered} where id = #{id};")
void update(Brand brand);
@Delete("delete from tb_brand where id = #{id};")
void delete(int id);
}
3、调用mapper执行SQL语句后没有出现相应的结果
1.DDL(DataDefinitionLanguage):数据定义语言,用来定义数据库对象:库、表、列等;
2.DML(DataManipulationLanguage):数据操作语言,用来定义数据库记录(数据);
3.DQL(DataQueryLanguage):数据查询语言,用来查询记录(数据);
4.DCL(DataControlLanguage):数据控制语言,用来定义访问权限和安全级别。
在Service调用mapper的方法执行SQL语句时,DQL不需要提交事务,而DML需要提交事务。
public Brand selectById(int id){
//调用BrandMapper.selectAll()
// 2.获取SqlSession
SqlSession sqlSession = factory.openSession();
// 3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
// 4.调用方法
Brand brand = mapper.selectById(id);
sqlSession.close();
return brand;
}
public void add(Brand brand){
// 2.获取SqlSession
SqlSession sqlSession = factory.openSession();
// 3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
// 4.调用方法
mapper.add(brand);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
4、SqlSessionFactory的独立存储
SqlSessionFactory的获取只需一次,但多个service方法都需要获取SqlSession,因此使用静态代码块,独立编写.java文件存储到util文件夹下以便调用。
package youth.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//静态代码块会随着类的加载而自动执行,且只执行一次
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
5、Maven Run找不到Servlet
6、@WebServlet(“/xxxServlet”)
注意格式,前面添加 / 。浏览器跳转需要加 /ProjectName,服务器跳转不需要。