//Markdown version
实习的时候第一次接触java Spring,mentor要求写一个基于SSM框架的数据库整理系统,感觉google上一些教程对新手不太友好,搭建过程中也出现很多问题,这里整理了一个搭建笔记,希望能帮到其他Spring新手。
(由于作者也是初学者,对spring没有深层次的理解,暂时只能给出解决问题的方法,可能无法解释出现问题的原因,见谅)。
一个建议:
如果真的是像我一样的新手,可以不要太在意每一步实现的意义,照着做就可以了,后来改程序改多了自然会有感觉。
搭建目标:
搭建一个简单的基于SSM的系统,实现数据库的增删改查操作。
数据库:H2(使用mysql只需改数据库部分配置)
构建工具:gradle(maven只需要根据格式改dependency部分)
开发环境:idea
1 使用idea创建新工程,选择gradle,springMVC。
文件目录结构:
/src/main/java/com.yourpackage/dao(生成mapper文件在这里)
/src/main/java/com.yourpackage/model(生成数据模型在这里)
/src/main/java/com.yourpackage/service(调用的服务接口)
/src/main/java/com.yourpackage/sevice/impl(服务接口的实现)
/src/main/resources/mapper(mapper对应sql的xml文件在这里)
resources中还有application.yml(也可以是.properties文件)、mybatis-config.xml和schema.sql(数据库初始化建库)和data.sql(数据库初始化操作如insert)
springboot的application.java在com.yourpackage中。
2 mybatis-config配置
可以直接使用mybatis插件,在file-settings-plugins中可以找到free mybatis plugin,它真的是免费的。安装完成后可以和其他文件一样右键new生成。
需要填的部分:
classpathentry location:是你的数据库jar包地址,一般在home/.gradle/caches/modules-2/files-2.1里可以找到。
jdbcconnection:
driverclass:
- H2:
org.h2.driver
- mysql:
com.mysql.jdbc.Driver
url:
- H2:
jdbc:h2:file:~/Desktop/yourdatabasename
这里表示我把数据库文件存储在桌面上. - mysql:
jdbc:mysql://localhost:3306/yourdatabasename
userID和password就不用说了。
javaModelGenerator
targetPackage="com.yourpackage.model"
,数据模型地址
sqlMapGenerator targetPackage="mapper"
,sql语句xml地址
javaClientGenerator
targetPackage="com.yourpackage.dao"
,mapper文件地址
table tableName="yourtablename"
,配置你的数据表,后面的选项可以根据需要配置。
配置mybatis-config文件主要为了让我们可以用插件直接生成对应文件,实现一些常用功能,而不需要我们自己来写。对配置文件右键可以找到run选项,即可生成需要的文件,其中包括dao、model和mapper几个文件夹中的文件。我们可以看到基本的insert和select已经在mapper和dao中写好了。
3 application.yml配置文件
搭建一个简单框架需要的部分
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.yourpackage.dao #重要,否则程序会找不到dao文件地址
spring:
h2:
console:
enabled: true #使用H2数据库需要添加,mysql则不需
path: /h2-console #localhost:8080/h2-console,打开H2数据库交互界面地址
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/Desktop/yourdatabasename;MODE=MYSQL;
username: sa
password: sa #sa是H2常用用户和密码
如果mysql数据库只需要改datasource部分。
4 一份该程序中的gradle配置
buildscript {
ext {
springBootVersion ='1.4.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
applyplugin:'java'
applyplugin:'org.springframework.boot'
jar {
baseName ='demo'
version ='0.0.1-SNAPSHOT'
}
sourceCompatibility =1.8
targetCompatibility =1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('com.alibaba:druid:1.0.26')
compile('mysql:mysql-connector-java:5.1.40')
runtime('com.h2database:h2')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
}
gradle基本缺哪个包就加哪个包就好了,https://mvnrepository.com/可以找到需要的包,部分包下面可能会说明要从那个地址引用,记得在repository中加上就好了。
5 如何使用mybatis提供的数据库操作
mybatis-plugin一般会提供insert和selectbyprimarykey等方法,我们可以在service接口类中声明这个方法,在impl中具体实现。
如在insert方法,我们在某个接口Service中可以这样写:
public interface EmployeeService {
void addEmployee(String employeename,String age,String salary);
}
然后在impl中implements实现:
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
@Override
public void addEmployee(String employeename,String age,String salary) {
Employee employee=new Employee();
employee.setEmployeename(employeename);
......
employMapper.insert(employee);
}
然后我们在需要调用时直接注入一个service类,从service调用写好的方法。
这里只要看清楚xml文件中各个sql操作的参数和返回值就可以了。如果是findAll方法得到所有符合条件的结果可以使用List作返回。
使用spring时,只要在需要注入的类前标注@Service,而在使用之前用@Autowired直接注入,就不需要用new来实例化。如果在使用类时要一层一层嵌套地使用,一个类调用另一个类,就需要中间的部分全部使用注入而不能有手动new的对象,否则会报错。
6 将springboot的启动类application和需要执行的操作分来
这里我单独建了一个runnerable类来运行所有需要的任务,需要运行的任务只要在类之前加上@Component
就可以了,如果要决定执行顺序还可以再加上@Order(value = 1)
。
7 其他问题
mybatis-config run出现问题可能是classpathentry的jar包不对,可以试着换一个地址。
主程序出现问题可以使用bootrun来查看报错信息。
出现找不到dao文件可以看看各个配置文件中dao文件夹的地址是否正确,或者yml文件中是否有加dao地址。
可以使用dataAccessException来捕获sql部分异常。
经常会碰发already use情况,不要慌,看一下有没有其他连接数据库的程序没有关闭,或者如果8080占用可以lsof然后kill掉,实在不行重启大法好。
如果出现问题可以联系我,但是同样作为初心者并不一定能解决。