### 1. MYBATIS 简介
MYBATIS 是持久层框架, 大大的简化了持久层开发.
当使用 MYBATIS 框架时, 开发人员不必再编写繁琐的 JDBC 代码, 只需要定义好每个功能对应的抽象方法与需要执行的 SQL 语句即可!
- ### 2. 基本使用
- #### 2.1. 添加依赖
需要在 `pom.xml` 中添加 MyBatis 的依赖:
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.4.6</version>
- </dependency>
然后添加 MyBatis 整合 Spring 的依赖:
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.3.2</version>
- </dependency>
其底层实现是基于 JDBC 的, 所以, 还需要添加 `spring-jdbc` 的依赖, 需要注意的是: 此次使用的版本必须与 `spring-webmvc` 的保持一致:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>4.3.9.RELEASE</version>
- </dependency>
根据使用的数据库, 添加数据库连接驱动的依赖:
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.13</version>
- </dependency>
添加数据源的依赖:
- <dependency>
- <groupId>commons-dbcp</groupId>
- <artifactId>commons-dbcp</artifactId>
- <version>1.4</version>
- </dependency>
- #### 2.2. 数据库连接
在 `src/main/resources` 下创建 `db.properties` 文件, 用于配置数据库连接的相关信息:
- # 数据库驱动
- driver=com.MySQL.cj.jdbc.Driver
- # 数据库连接
- url=jdbc:MySQL://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
- # 数据库用户名
- username=root
- # 数据库密码
- password=
- # 数据库连接池初始连接数
- initialSize=3
- # 数据库连接池最连接线程数
- maxActive=5
在项目中准备名为 `spring-dao.xml` 的 Spring 配置文件, 并加载以上数据库的配置文件:
- <!-- 加载数据库的配置文件 -->
- <util:properties id="dbConfig"
- location="classpath:db.properties" />
然后, 将以上读取到的配置值应用于数据源 `BasicDataSource` 中:
- <!-- 配置数据源 -->
- <bean class="org.apache.commons.dbcp.BasicDataSource">
- <property name="url"
- value="#{dbConfig.url}" />
- <property name="driverClassName"
- value="#{dbConfig.driver}" />
- <property name="username"
- value="#{dbConfig.username}" />
- <property name="password"
- value="#{dbConfig.password}" />
- <property name="initialSize"
- value="#{dbConfig.initialSize}" />
- <property name="maxActive"
- value="#{dbConfig.maxActive}" />
- </bean>
以上配置时, 各文件之间的关系如下图所示:
完成后, 可以通过单元测试, 以测试是否可以正确的获取到数据库的连接:
- public class ConnectionTestCase {
- @Test
- public void getConnection() throws SQLException {
- AbstractApplicationContext ac
- = new ClassPathXmlApplicationContext(
- "spring-dao.xml");
- DataSource dataSource =
- ac.getBean("dataSource", DataSource.class);
- System.out.println(dataSource.getConnection());
- ac.close();
- }
- }
- #### 2.3. 创建实体类
每张数据表都应该有 1 个对应的实体类, 所以, 创建 `cn.tedu.mybatis.entity.User` 类, 属性的数量与类型请参考数据表的设计:
- public class User implements Serializable {
- private static final long serialVersionUID = 7323921614984096421L;
- private Integer id;
- private String username;
- private String password;
- private Integer age;
- private String phone;
- private String email;
- // SET/GET,toString()
- }
- #### 2.4. 创建接口, 声明抽象方法
创建 `cn.tedu.mybatis.mapper.UserMapper` 接口, 并在接口中声明 "插入用户数据" 的抽象方法:
- public interface UserMapper {
- Integer addnew(User user);
- }
关于抽象方法, 在 MyBatis 中, 执行的操作如果是增, 删, 改, 返回值均使用 `Integer`, 表示受影响的行数; 方法的名称可以自定义, 只要不违反 Java 的命名规则即可, 另外, 不允许在接口中使用重载机制; 参数也可以自定义, 如果执行的是增加操作, 参数应该是与数据表对应的实体类的类型.
#### 2.5. 配置接口所在的包
在 MyBatis 中, 通过 `MapperScannerConfigurer` 类扫描持久层接口的, 所以, 应该在 `spring-dao.xml` 文件中进行配置:
- <!-- MapperScannerConfigurer -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <!-- 配置接口文件所在的包 -->
- <property name="basePackage"
- value="cn.tedu.mybatis.mapper" />
- </bean>
从 FTP 下载 `somemapper.zip` 压缩包, 得到 `SomeMapper.xml` 文件.
在 `src/main/resources` 下创建名为 `mappers` 文件夹, 然后将 `SomeMapper.xml` 重命名为 `UserMapper.xml`, 并粘贴到 `mappers` 文件夹下:
> 其实, 这些 xml 文件的名称并不重要, 可以自由命名, 通常, 推荐使用与接口文件相同的名称, 便于管理.
然后, 编写 `UserMapper.xml` 文件中的内容, 首先, 根节点必须是 `<mapper>`, 且根节点的 `namespace` 表示对应的接口文件, 然后, 添加子节点, 以对应接口中的抽象方法:
#### 2.7. 配置 xml 文件的位置与数据源
MyBatis 通过 `SqlSessionFactoryBean` 获取数据源, 并且扫描配置了 SQL 语句的 xml 文件, 最终由 MyBatis 框架来执行 SQL 语句, 所以, 需要在 `spring-dao.xml` 中配置 `SqlSessionFactoryBean`:
- <!-- SqlSessionFactoryBean -->
- <bean class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 数据源, 值为以上配置 BasicDataSource 节点的 bean-id -->
- <property name="dataSource"
- ref="dataSource" />
- <!-- XML 文件在哪里 -->
- <property name="mapperLocations"
- value="classpath:mappers/*.xml" />
- </bean>
- #### 2.8. 单元测试
- public class UserMapperTestCase {
- AbstractApplicationContext ac;
- UserMapper mapper;
- @Before
- public void doBefore() {
- ac = new ClassPathXmlApplicationContext("spring-dao.xml");
- mapper = ac.getBean("userMapper", UserMapper.class);
- }
- @After
- public void doAfter() {
- ac.close();
- }
- @Test
- public void addnew() {
- User user = new User();
- user.setUsername("刘 GB");
- user.setPassword("666");
- Integer rows = mapper.addnew(user);
- System.out.println("rows=" + rows);
- }
- }
- ### 3. 查询数据
- #### 3.1. 根据 id 查询某个用户的信息
首先, 在 `UserMapper.java` 接口中添加该功能对应的抽象方法:
User findById(Integer id);
> 查询方法的返回可以根据所需要的类型来决定.
然后, 在 `UserMapper.xml` 映射文件中添加新的节点配置抽象方法对应的 SQL 语句:
- <select id="findById"
- resultType="cn.tedu.mybatis.entity.User">
- SELECT
- id, username,
- password, age,
- phone, email
- FROM
- t_user
- WHERE
- id=#{id}
- <select>
> 执行查询时,`<select>` 节点中必须配置 `resultType` 属性 (或者是 `resultMap` 属性).
以上方法执行时, 如果查询到匹配的数据, 则返回有效的 User 对象, 如果没有匹配的数据, 则返回 null.
来源: https://www.cnblogs.com/topzhao/p/10310695.html