提示:要有自学能力,会学习
文章目录
- 前言
- 前期准备
- 项目内容
- 数据库创建
- 应用程序配置
- po 包代码
- mapper 包代码
- service 包代码
- 测试类代码
- 添加事物处理功能
前言
提示:这里可以添加本文要记录的大概内容:
前期准备
第一步:新建项目Maven项目
在下一步中勾选第一个选项,创建一个简单的项目,最后填写相关信息后完成
第二步:完善 pom.xml 文件
项目建成后在 pom.xml 文件中导入相关代码,比如:
缺什么加什么
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 此依赖会关联引用Spring中的所有基础jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.15</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- mybatis-spring 依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
第三步:配置 main/resources 文件夹
log4j.properties
配置文件,可以显示 log 输出
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
log4j.rootLogger=debug,stdout
提示:以下是本篇文章正文内容,下面案例可供参考
项目内容
数据库创建
CREATE TABLE worker
(
id int PRIMARY KEY auto_increment,
name VARCHAR(20),
sex CHAR(1),
age int,
workShop VARCHAR(10) # 车间
);
应用程序配置
在src/main/java 文件夹下新建包 com.sm,然后再新建config、mapper、po、service包
把下面的 ApplicationConfig 类代码复制到 config 包下
package com.sm.config;
import java.io.IOException;
import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration //声明该类是核心配置类
// 包名被改变时,这里对应的也要改(mapper包名)
@MapperScan("com.sm.mapper")
@EnableTransactionManagement
public class ApplicationConfig {
@Bean
public DataSource dataSource(){
DriverManagerDataSource cd = new DriverManagerDataSource();
cd.setDriverClassName("com.mysql.cj.jdbc.Driver");
cd.setUrl("jdbc:mysql://localhost:3306/sm?characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
cd.setUsername("root");
cd.setPassword("123456");
return cd;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource ds) throws IOException {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds);//配置数据源
// 包名被改变时,这里对应的也要改(po包名)
bean.setTypeAliasesPackage("com.sm.po");//设置实体类别名
return bean;
}
//配置事务管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager dtm = new DataSourceTransactionManager();
dtm.setDataSource(dataSource);
return dtm;
}
}
po 包代码
public class Worker {
private Integer id;
private String name;
private String sex;
private Integer age;
private String workShop;
// 自动生成 Getter、Setter、toString()、有参无参方法
}
mapper 包代码
@Mapper
public interface WorkerMapper {
// id是自增的
@Insert("insert into worker (name,sex,age,workShop) values (#{name},#{sex},#{age},#{workShop})")
int insertWorker(Worker worker);
// SQL语句比较简单所以写在注解里
@Delete("delete from worker where id = #{id}")
int deleteWorker(int id);
@Update("update worker set name = #{name}, sex = #{sex}, age = #{age}, workShop = #{workShop} where id = #{id}")
int updateWorker(Worker worker);
// 做项目查询所有时,一个个写出来
@Select("select * from worker")
List<Worker> queryWorkers();
}
service 包代码
在service 包下新建接口及其对应的实现类+Impl
接口代码中的方法:
public interface WorkerService {
// 增删改是字符串
String insert(Worker worker);
String delete(int id);
String update(Worker worker);
List<Worker> queryWorkers();
}
实现类代码:
@Service
public class WorkerServiceImpl implements WorkerService{
// 增加依赖注入的注解
@Autowired
// 依赖关系,service依赖mapper
public WorkerMapper mapper;
@Override
public String insert(Worker worker) {
// 添加未实现的方法
return mapper.insertWorker(worker)>0?"增加成功":"增加失败";
}
@Override
public String delete(int id) {
// TODO 自动生成的方法存根
return mapper.deleteWorker(id)>0?"删除成功":"删除失败";
}
@Override
public String update(Worker worker) {
// TODO 自动生成的方法存根
return mapper.updateWorker(worker)>0?"修改成功":"修改失败";
}
@Override
public List<Worker> queryWorkers() {
// TODO 自动生成的方法存根
return mapper.queryWorkers();
}
}
测试类代码
package com.sm;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AppTestSM
{
ApplicationContext context = null;
@Before
public void before() throws Exception {
// 当包名改变时,这里对应的包名也要改
context = new AnnotationConfigApplicationContext("com.sm");
}
@Test
public void test() {
}
}
添加测试:
@Test
public void test() {
WorkerService service = context.getBean(WorkerService.class);
Worker worker = new Worker(null, "张三", "男", 21, "检查车间");
System.out.println(service.insert(worker));
}
测试成功,整合OK
修改测试:
@Test
public void test() {
WorkerService service = context.getBean(WorkerService.class);
Worker worker = new Worker(1,"李四","女", 31, "装配车间");
System.out.println(service.update(worker));
}
删除测试:
@Test
public void test() {
WorkerService service = context.getBean(WorkerService.class);
System.out.println(service.delete(1));
}
回到数据库发现一号数据被删除
查询测试:
@Test
public void test() {
WorkerService service = context.getBean(WorkerService.class);
List<Worker> list = service.queryWorkers();
//foreach循环
for (Worker worker2 : list) {
System.out.println(worker2);
}
}
数据与数据库对应
添加事物处理功能
在 service 里面调用很多 mapper 时需要加上事务,保证操作的一致性,只要一个环节出问题就会滚
在 ServiceImpl 实现类中修改删除功能
// 事物处理
@Override
public String delete(int id) {
// TODO 自动生成的方法存根
String result = mapper.deleteWorker(id)>0?"删除成功":"删除失败";
// 模拟异常
int i = 10/0;
return result;
}
代码先运行mapper。delete方法,判断删除成功或失败,再出异常,没有事务管理的话判断会自动提交,即使下一行出异常也提交了
回到测试代码测试删除:删除数据库中一条存在的数据
事务处理只需要在方法上加一个注解:@Transactional
// 事物处理
@Override
// 只要异常发生就会滚
@Transactional(rollbackFor = Exception.class)
public String delete(int id) {
// TODO 自动生成的方法存根
String result = mapper.deleteWorker(id)>0?"删除成功":"删除失败";
// 模拟异常
int i = 10/0;
return result;
}
再回到测试类中测试删除:删除数据库中一条存在的数据