今天我们来通过一个项目小实战(spring+mybatis),让大家对maven有更加深刻的认知
一)建立maven工程
①右击new-》other-》maven-》Maven Project,然后next、next,填写项目需要的相关信息,点击finish
②修改项目jdk,项目上右击选择properties,进入一窗口
--点击Java Build Path,修改JRE System Library,选择你安装的jdk。
--点击Resource,修改字符集为uTF-8
--点击Java Compiler,修改编译版本为1.7或者1.8(ps:这个跟项目中的spring版本有关,比如我演示用的这个就不能用1.8,要不然报依赖有关的额错误),1.5有点太远古(不过我们这个例子中影响不大)
③我们知道,有了mybatis就是要操作数据库了哈,嗯,肯定涉及到很多数据库配置文件,根据管理,约束?我们都会再建一个包来放这些文件,右击项目-》new-》Source Folder
一顿操作之后项目的目录结构如下
二)添加依赖,我们打开pom.xml文件添加依赖
<!-- spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<!--单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.8.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<!--mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
三)下载msyql数据库,我下载的是最新的8.X,这个去官网下载,然后一路next就好,注意,如果电脑比较新,去下载个c++2015,保证能安装成功
连接数据库的方式有很多中,比如使用三方工具sqlyog,或者使用mysql自带工具:MySQL Workbench……,进去之后我们看下字符集:show variables like 'character%';
新版的mysql安装都是utf8mb4,(5.7的是utf-8),其中utf8mb4更为强大哈,不仅能兼容utf-8,同时支持4字节的表情字符【普通的字符串或者表情占三个字节,移动端的表情符号占四个字节】,腻害了,mysql也是良心企业啊
建立数据库oa,建库语句:create database oa
在建一个表employee,建表语句:
use oa;
CREATE TABLE `employee` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(45) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'
四)写配置文件
application-organ.xml(注意,这个地方没有使用application.xml,是因为如果这个一个单独的小项目,那么可以直接这样命令,我们是打算搞一个大项目的,所以得有所区分)
jdbc.properties(数据库配置文件)
log4j.properties(日志配置文件)
mybatis-config.xml(mybatis配置文件)
五)写java类
实体类:Employee.java
service接口:EmployeeService.java
service实现类:EmployeeServiceImpl.java
dao接口:EmployeeMapper.java
dao实现:我们使用的是文件实现
测试类:EmployeeServiceTest.java
弄好了之后结构如下
六)单元测试
EmployeeServiceTest.java类中右击run-》junit测试,我们发现数据库有数据了哈,ps:程序运行过程中可能回报一个时区有关的异常(set global time_zone='+8:00';处理一下)
我们执行成功,并看下数据库,数据入库了,ok了
代码如下
EmployeeMapper.java
package com.mzlx.oa.organ.mapper;
import com.mzlx.oa.organ.model.Employee;
public interface EmployeeMapper {
public void addEmployee(Employee employee);
public Employee findEmployeeById(Long id);
}
EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mzlx.oa.organ.mapper.EmployeeMapper">
<insert id="addEmployee" parameterType="com.mzlx.oa.organ.model.Employee">
INSERT INTO employee(name,age) VALUES(#{name},#{age})
</insert>
<select id="findEmployeeById" parameterType="int" resultType="com.mzlx.oa.organ.model.Employee">
SELECT * FROM employee WHERE ID=#{id}
</select>
</mapper>
Employee.java
package com.mzlx.oa.organ.model;
public class Employee {
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
EmployeeService.java
package com.mzlx.oa.organ.service;
import com.mzlx.oa.organ.model.Employee;
public interface EmployeeService {
public void addEmployee(Employee employee);
public Employee findEmployeeById(Long id);
}
EmployeeServiceImpl .java
package com.mzlx.oa.organ.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mzlx.oa.organ.mapper.EmployeeMapper;
import com.mzlx.oa.organ.model.Employee;
import com.mzlx.oa.organ.service.EmployeeService;
@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
public void addEmployee(Employee employee) {
employeeMapper.addEmployee(employee);
}
public Employee findEmployeeById(Long id) {
return employeeMapper.findEmployeeById(id);
}
}
EmployeeServiceTest.java
package com.mzlx.oa.organ.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.mzlx.oa.organ.model.Employee;
@ContextConfiguration(locations = {"classpath:application-organ.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class EmployeeServiceTest {
@Autowired
private EmployeeService employeeService;
@Test
public void testAddEmployee() {
Employee employee = new Employee();
employee.setName("测试");
employee.setAge(20);
employeeService.addEmployee(employee);
}
}
配置文件
application-organ.xml【心细的童鞋可能注意到了,有的地方使用classpath,有的地方使用了classpath*,这是有区别的,其中classpath:只会到你的class路径中查找找文件。classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- jdbc配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置mybatis sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:com/mzlx/oa/organ/mapper/**/*.xml"/>
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!-- 自动扫描mapper接口文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mzlx.oa.organ.mapper" />
</bean>
<!-- 自动扫描注解的bean -->
<context:component-scan base-package="com.mzlx.oa.organ.service.*" />
</beans>
jdbc.properties(注意,mysql8的驱动跟5.7以及之前的不一样哦)
#jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/oa
jdbc.username=root
jdbc.password=123123123
log4j.properties
log4j.rootLogger=DEBUG,Console,Stdout
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
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>
</configuration>
补充一下,前面我们使用的是直接运行测试,实际工作中还是看是否能生成可行性jar包
右击项目-》run-》Run Configurations-》配置一下-》run
如果出现BUILD SUCCESS,则表示编译成功
不过上面的代码肯定是失败的,为啥呢,这是一个项目,再也不是一个普通的java类了,所以相关依赖都需要打包才可以呢
解决方案:在pom.xml文件中添加如下标签代码
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
嗯,之后再run,出现BUILD SUCCESS,编译成功