MyBatis框架基础知识(01)

举报
海拥 发表于 2021/08/05 00:55:12 2021/08/05
【摘要】 1. MyBatis框架的作用 主要作用:简化持久层开发。 持久层:解决项目中的数据持久化处理的相关组件。 使用MyBatis框架实现数据库编程时,只需要指定各个功能对应的抽象方法及需要执行的SQL语句即可。 2. 创建MyBatis项目 MyBatis项目可以是本机直接运行的,不一定需要与SpringMVC框架结合起来一起使用,所以,在创建项目时,...

1. MyBatis框架的作用

主要作用:简化持久层开发。

持久层:解决项目中的数据持久化处理的相关组件。

使用MyBatis框架实现数据库编程时,只需要指定各个功能对应的抽象方法及需要执行的SQL语句即可。

2. 创建MyBatis项目

MyBatis项目可以是本机直接运行的,不一定需要与SpringMVC框架结合起来一起使用,所以,在创建项目时,只需要创建为jar项目即可。

当项目创建出来之后,需要添加mybatis依赖:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后,还需要添加MyBatis整合Spring框架的mybatis-spring依赖:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.4</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

由于需要整合Spring框架,所以,还需要添加Spring框架的spring-context依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其底层实现是基于JDBC的,所以,还需要添加spring-jdbc依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.5.RELEASE</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

本次将使用MySQL数据库,所以,还需要添加mysql-connector-java依赖:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在连接数据库时,应该使用数据库连接池,所以,还应该添加commons-dbcp依赖:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在开发完某个功能后,应该及时检查开发的功能是否可以正常运行,所以,还添加junit单元测试依赖:

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3. 案例准备工作

先登录MySQL控制台,创建名为tedu_ums的数据库:

CREATE DATABASE tedu_ums;

  
 
  • 1

并使用这个数据库:

USE tedu_ums;

  
 
  • 1

在这个数据库中,创建一张用户数据表t_user,表中应该包含以下字段:id、用户名(username)、密码(password)、年龄(age)、手机号码(phone)、电子邮箱(email):

CREATE TABLE t_user (
	id int AUTO_INCREMENT, username varchar(20) NOT NULL UNIQUE, password varchar(20) NOT NULL, age int, phone varchar(20), email varchar(50), PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. 测试项目是否可以正常运行

src/test/java下,创建cn.tedu.spring包,并在这个包中创建ProjectTests测试类,在测试类添加空白的测试方法,以测试JUnit环境是否正常:

package cn.tedu.spring;

import org.junit.Test;

public class ProjectTests { @Test
	public void contextLoads() {
		System.out.println("ProjectTests.contextLoads()");
	}

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

凡是在src/test下的文件,都不会参与项目最终打包、部署,所以,一般在编写单元测试时,对代码规范要求并不那么严格,但是,仍应该尽量遵循开发规范。

关于测试方法,必须:

  • 必须添加@Test注解;
  • 必须使用public权限(从JUnit 5开始不严格要求测试方法的访问权限);
  • 必须使用void表示返回值类型;
  • 必须保持参数列表为空。

5. 连接数据库

src/main/resources下创建jdbc.properties文件,并在其中配置连接数据库的相关信息:

mysql.url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.username=root
mysql.password=root
mysql.initialSize=2
mysql.maxTotal=10

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

接下来,需要在程序中读取以上配置信息,则在src/main/java下创建cn.tedu.spring包,并在这个包中创建SpringConfig类,在该类中读取以上配置,并基于这些配置信息创建javax.sql.DataSource的对象,将该对象交给Spring框架进行管理:

@PropertySource("jdbc.properties")
@Configuration
public class SpringConfig { @Value("${mysql.url}")
	private String url;
	@Value("${mysql.driver}")
	private String driver;
	@Value("${mysql.username}")
	private String username;
	@Value("${mysql.password}")
	private String password;
	@Value("${mysql.initialSize}")
	private Integer initialSize;
	@Value("${mysql.maxTotal}")
	private Integer maxTotal; @Bean
	public DataSource dataSource() {
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setUrl(url);
		dataSource.setDriverClassName(driver);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		dataSource.setInitialSize(initialSize);
		dataSource.setMaxTotal(maxTotal);
		return dataSource;
	}

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

完成后,在ProjectTests测试类中添加新的测试方法,在测试方法中,读取Spring的配置文件,并从Spring容器中获取DataSource对象,并调用该对象的getConnection()方法以获取Connection对象,如果能够成功获取对象,则表示配置信息无误,后续MyBatis框架也可以正常连接数据库:

@Test
public void getConnection() throws SQLException { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); DataSource dataSource = ac.getBean("dataSource", DataSource.class); Connection conn = dataSource.getConnection(); System.out.println(conn); ac.close();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6. 接口与抽象方法

暂定需要实现的功能是:向t_user表中插入用户数据。

在使用MyBatis时,各功能的抽象方法必须写在接口文件中,推荐使用Mapper作为接口名称的后半部分,关于抽象方法的声明:

  • 返回值类型:当需要执行的SQL语句是INSERTDELETEUPDATE类型之一时,将返回值设计为Integer,在执行时,会返回“受影响的行数”,当然,也可以声明为void,表示“不关心受影响的行数”,推荐使用Integer
  • 方法名称:自定义;
  • 参数列表:根据需要执行的SQL语句中的问号?来决定,当方法参数较多时,也可以将多个参数进行封装,然后,使用封装的类型作为抽象方法的参数。

插入用户数据时,需要执行的SQL语句大致是:

insert into t_user (username, password, age, phone, email) values (?,?,?,?,?)

  
 
  • 1

所以,应该在src/main/java下的cn.tedu.spring包中创建User类,用于封装各属性:

public class User { private Integer id; private String username; private String password; private Integer age; private String phone; private String email; // Getters & Setters // toString()
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然后,在cn.tedu.spring包下创建UserMapper接口,并在接口中添加抽象方法:

public interface UserMapper { Integer aaa(User user);
}

  
 
  • 1
  • 2
  • 3

在后续执行时,还需要使得MyBatis知道接口文件在哪里,则需要在配置类(初始化Spring环境时被加载的类,有@Configuration注解的类)之前添加@MapperScan注解,以配置接口文件所在的包,所以,在SpringConfig类的声明之前补充添加@MapperScan注解并配置接口所在的包:

@PropertySource("jdbc.properties")
@Configuration
@MapperScan("cn.tedu.spring")
public class SpringConfig { // ...
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

7. 配置SQL语句

在抽象方法的声明之前,根据要执行的SQL语句的种类,使用@Insert@Delete@Update@Select注解中的某1个来配置SQL语句,由于本次需要执行的是INSERT类型的SQL语句,则需要使用@Insert注解,并在注解参数的字符串中编写SQL语句。

在编写SQL语句时,对于存在?占位的位置,应该写为#{}格式的占位符,占位符的括号中写上属性的名称!

例如:

public interface UserMapper { @Insert("INSERT INTO t_user (username, password, age, phone, email) VALUES (#{username}, #{password}, #{age}, #{phone}, #{email})")
	Integer aaa(User user);

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

最后,在执行之前,还得使得MyBatis明确执行时使用哪个数据源可以连接数据库,需要在Spring环境中配置一个SqlSessionFactoryBean的对象,则在SpringConfig类中添加:

@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

全部完成后,在ProjectTests中添加测试方法:

@Test
public void aaa() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); UserMapper userMapper = ac.getBean("userMapper", UserMapper.class); User user = new User(); user.setUsername("mybatis"); user.setPassword("1234"); user.setAge(25); user.setPhone("13800138001"); user.setEmail("root@qq.com"); Integer rows = userMapper.aaa(user); System.out.println("rows=" + rows); ac.close();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

可以自行尝试编写其它的数据访问功能,但是,仅限于:

  • 执行的是增、删、改类型的操作;
  • 设计的抽象方法最多只能有1个参数。

文章来源: haiyong.blog.csdn.net,作者:海拥✘,版权归原作者所有,如需转载,请联系作者。

原文链接:haiyong.blog.csdn.net/article/details/106419027

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。