介绍
本项目通过对 Spring 与 MyBatis 框架的整合,实现对数据库表格的增删改查,后续会继续分享SSM(Spring+SpringMVC+Mybatis)项目环境的搭建。
需要完成的功能
- 在数据库中创建足球队球员信息表来保存球员信息
- 能增删改查球员的信息(姓名,年龄,角色,球衣号码)
涉及技术
Java基础知识
框架:Spring, MyBatis, Spring与 MyBatis整合
数据库:MySQL
开发工具:IDEA, Maven
框架及工具介绍
1.Spring
Spring是一个开源框架,它由Rod Johnson创建。出现在2002左右,解决企业开发的难度。减轻对项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系。spring核心技术ioc,aop 能实现模块之间,类之间的解耦合。
2.MyBatis
MyBatis 是一个sql映射框架,提供了数据库的操作能力。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和普通的Java对象映射成数据库中的记录。
3.Maven
Maven 是Apache软件基金会组织维护的一款自动化构建工具,专注服务于Java 平台的项目构建和 依赖管理。Maven 是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用。
准备工作
1.maven工具的安装
地址: maven.apache.org/ 从中下载 .zip文件。 我自己使用的 apache-maven-3.3.9-bin.zip
安装:
1.确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录
2.解压缩 apache-maven-3.3.9-bin.zip ,把解压后的文件放到一个目录中。 (我放到D盘根目录了)
目录的路径不要有中文, 不要有空格。
3.把maven安装目录中下的bin的路径添加到path中
4.测试maven的安装。 在命令行执行 mvn -v
5.修改本地仓库位置
本地仓库的默认路径是你登录操作系统的账号的目录中/.m2/repository
修改本地仓库的位置:修改maven工具的配置文件(maven的安装路径\conf\setting.xml)
步骤:
1)创建一个目录,作为仓库使用。 目录不要有中文和空格。
例如: D:\openrepository
2)修改setting.xml文件(在maven安装目录下conf文件夹),指定D:\openrepository这个目录
3)将本地仓库的资源拷贝到 D:/openrepository
6.配置阿里云镜像
2.在IDEA中集成Maven
idea中有一个自带的maven,通过一下设置让idea使用自己安装的maven。
1)选择File- Settings ,在指定位置选择maven安装目录及settings文件目录
设置jdk信息,且在设置项位置填写:-DarchetypeCatalog=internal:
2) 如图所示,为新建或导入的项目配置
maven信息:
设置与1)一致即可
至此就完成了maven环境的配置。
3.在数据库中创建表
本例以足球队球员信息表为操作对象,表名为football_team,如图所示:
Spring集成MyBatis环境搭建
1.新建maven项目
1)创建空Project,如图所示确保jdk信息无误
2)创建新Module
如图所示,选择从模板创建
接着设置基本信息及坐标gav
点击Finish,完成项目创建。
2.修改pom文件
在pom文件中加入用到的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>com.bupt</groupId>
<artifactId>my-spring-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring核心ioc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--做spring事务用到的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--mybatis和spring集成的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!--阿里公司的数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
</dependencies>
<build>
<!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<!--指定jdk的版本-->
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>13</source>
<target>13</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
注:依赖如果出现爆红的情况,可能是因为没有自动刷新,Reload一下就好了:
3.设置资源文件夹
设置资源文件夹,以便在此创建配置文件
4.创建实体类
在domain包下创建实体类
具体代码如下,使用alt+insert快捷键创建get,set,toString方法
package com.bupt.domain;
public class Player {
//属性名和数据库表的列名一致
private String name;
private Integer age;
private String role;
private Integer num;
public Player() {
}
public Player(String name, Integer age, String role, Integer num) {
this.name = name;
this.age = age;
this.role = role;
this.num = num;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setRole(String role) {
this.role = role;
}
public void setNum(Integer num) {
this.num = num;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getRole() {
return role;
}
public Integer getNum() {
return num;
}
@Override
public String toString() {
return "Player{" +
"name='" + name + ''' +
", age=" + age +
", role='" + role + ''' +
", num=" + num +
'}';
}
}
5.创建dao接口和mapper文件
PlayerDao接口内容如下:
package com.bupt.dao;
import com.bupt.domain.Player;
import java.util.List;
public interface PlayerDao {
int insertPlayer(Player player);
List<Player> selectPlayers();
int updatePlayer(Player player);
int deletePlayer(int num);
}
mapper文件内容如下:
<?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.bupt.dao.PlayerDao">
<select id="selectPlayers" resultType="com.bupt.domain.Player">
select name,age,role,num from football_team order by num desc
</select>
<insert id="insertPlayer">
insert into football_team values(#{name},#{age},#{role},#{num})
</insert>
<update id="updatePlayer">
update football_team set name = #{name},age = #{age},role = #{role} where num = #{num}
</update>
<delete id="deletePlayer">
delete from football_team where num=#{num}
</delete>
</mapper>
6.创建mybatis主配置文件
如图所示创建主配置文件:
MyBatis主配置文件
mybatis.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>
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--设置别名-->
<typeAliases>
<!--name:实体类所在的包名-->
<package name="com.bupt.domain"/>
</typeAliases>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!--
name:是包名, 这个包中的所有mapper.xml一次都能加载
-->
<package name="com.bupt.dao"/>
</mappers>
</configuration>
7.创建Service接口和实现类
如图所示创建Service接口和实现类:
PlayerService接口内容如下:
package com.bupt.service;
import com.bupt.domain.Player;
import java.util.List;
public interface PlayerService {
int addPlayer(Player player);
List<Player> queryPlayers();
int upPlayer(Player player);
int delPlayer(int num);
}
实现类内容如下:
package com.bupt.service.impl;
import com.bupt.dao.PlayerDao;
import com.bupt.domain.Player;
import com.bupt.service.PlayerService;
import java.util.List;
public class PlayerServiceImpl implements PlayerService {
private PlayerDao playerDao;
public PlayerServiceImpl() {
}
public PlayerServiceImpl(PlayerDao playerDao) {
this.playerDao = playerDao;
}
public PlayerDao getPlayerDao() {
return playerDao;
}
public void setPlayerDao(PlayerDao playerDao) {
this.playerDao = playerDao;
}
@Override
public int addPlayer(Player player) {
int res = playerDao.insertPlayer(player);
return res;
}
@Override
public List<Player> queryPlayers() {
List<Player> players = playerDao.selectPlayers();
return players;
}
@Override
public int upPlayer(Player player) {
int res = playerDao.updatePlayer(player);
return res;
}
@Override
public int delPlayer(int num) {
int res = playerDao.deletePlayer(num);
return res;
}
}
8.创建spring的配置文件
如图所示创建spring的配置文件:
创建好spring的配置文件后,可能会出现以下提示:
解决办法:
配置文件主要包括的对象:
1)数据源DataSource
使用阿里的Druid连接池,可在github.com/alibaba/dru…查看说明文档
2)SqlSessionFactory
3)Dao对象
4)声明自定义的service实现类对象
具体内容如下:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
spring知道jdbc.properties文件的位置
-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--声明数据源DataSource, 作用是连接数据库的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!--set注入给DruidDataSource提供连接数据库信息 -->
<!-- 使用属性配置文件中的数据,语法 ${key} -->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passwd}" />
<property name="maxActive" value="${jdbc.max}" />
</bean>
<!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的
SqlSessionFactory sqlSessionFactory = new ..
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--set注入,把数据库连接池付给了dataSource属性-->
<property name="dataSource" ref="myDataSource" />
<!--mybatis主配置文件的位置
configLocation属性是Resource类型,读取配置文件
它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置
-->
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>
<!--创建dao对象,使用SqlSession的getMapper(StudentDao.class)
MapperScannerConfigurer:在内部调用getMapper()生成每个dao接口的代理对象。
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定SqlSessionFactory对象的id-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!--指定包名, 包名是dao接口所在的包名。
MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行
一次getMapper()方法,得到每个接口的dao对象。
创建好的dao对象放入到spring的容器中的。 dao对象的默认名称是 接口名首字母小写
-->
<property name="basePackage" value="com.bupt.dao"/>
</bean>
<!--声明service-->
<bean id="playerService" class="com.bupt.service.impl.PlayerServiceImpl">
<property name="playerDao" ref="playerDao" />
</bean>
</beans>
至此就完成了所需对象的创建工作,可以调用对象实现对数据库的操作了。
通过测试代码实现对数据库进行增删改查
1.创建测试类,获取Service对象,通过service调用dao完成数据库的访问
2.具体代码如下,分别运行四个测试方法即可完成对数据库的增删改查
package com.bupt;
import com.bupt.domain.Player;
import com.bupt.service.PlayerService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
//测试插入数据功能
@Test
public void testServiceInsert(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//获取spring容器中的dao对象
PlayerService service = (PlayerService) ctx.getBean("playerService");
Player player = new Player("里奥.梅西",21,"前锋",10);
int nums = service.addPlayer(player);
//spring和mybatis整合在一起使用,事务是自动提交的。 无需执行SqlSession.commit();
System.out.println("nums="+nums);
}
//测试查询功能
@Test
public void testServiceSelect(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//获取spring容器中的dao对象
PlayerService service = (PlayerService) ctx.getBean("playerService");
List<Player> players = service.queryPlayers();
for (Player player:players){
System.out.println(player);
}
}
//测试更新数据功能
@Test
public void testServiceUpdate(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//获取spring容器中的dao对象
PlayerService service = (PlayerService) ctx.getBean("playerService");
Player player = new Player("约翰.特里",30,"中卫",26);
int nums = service.upPlayer(player);
System.out.println("nums="+nums);
}
//测试删除数据功能
@Test
public void testServiceDelete(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//获取spring容器中的dao对象
PlayerService service = (PlayerService) ctx.getBean("playerService");
int num = 10;
int nums = service.delPlayer(num);
System.out.println("nums="+nums);
}
}