今天主要学习的是本次暑期实习的主要安排、Java web开发的一些基本概念以及MyBatis的基础用法。
文章目录
1.MyBatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
MyBatis是一个持久层框架,是对JDBC的封装,借助MyBatis可更好地完成Java对数据库的操作,以降低开发难度。
MyBatis是属于对象关系映射,通过MyBatis实现Java到关系型数据库的映射,使开发者可以面向对象的思想去管理数据库。
2.使用MyBatis的基本步骤
(1)引入MyBatis及数据库(这里使用mysql)相应的依赖
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mybatis驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
(2)编写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">
<!-- dtd 就是xml文件的约束文件 -->
<configuration>
<!-- 配置Myabatis的运行环境 -->
<environments default="dev">
<!-- 可以配置多个数据库环境 -->
<environment id="dev">
<!-- 配置JDBC的事务管理-->
<transactionManager type="JDBC"/>
<!-- 配置数据源 数据库连接池的形式 -->
<dataSource type="POOLED">
<!-- 配置数据库相关属性 -->
<!-- 连接驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/whut02?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
(3)根据所要处理的数据库表创建相应的实体类。
一般一张表对应一个实体类,字段对应类的属性
。
这里给出相应的数据库脚本以及实体类代码。
- t_user表(数据库名为whut02)
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50728
Source Host : localhost:3306
Source Schema : whut02
Target Server Type : MySQL
Target Server Version : 50728
File Encoding : 65001
Date: 11/08/2020 20:37:23
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`password` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'zhangsan', '123456', 20);
INSERT INTO `t_user` VALUES (2, 'lisi', '123456', 20);
SET FOREIGN_KEY_CHECKS = 1;
- User.java
package com.zhongruan.bean;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
public User() {
}
public User(Integer id, String username, String password, Integer age) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
(4)建立相应实体类的数据访问对象(data access object,dao)接口
这里需要写上一些方法(抽象方法)来完成相应的数据访问(访问数据)。
IUserDao.java
package com.zhongruan.dao;
import com.zhongruan.bean.User;
public interface IUserDao {
/**
* 保存
*
* @param user
*/
void save(User user);
/**
* 通过用户名查询用户
* @param username
* @return
*/
User findByUsername(String username);
/**
* 通过用户名删除用户
* @param username
*/
void deleteByUsername(String username);
}
(5)建立相应实体类的数据库映射文件(.xml文件)
这里就是写sql语句的地方,注意namespace
的值一定是上面相应实体类的数据访问对象的完整路径。相应的数据访问对象的方法对应着sql语句。
UserDao.xml
<?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">
<!--
注意注意注意
1. mapper标签的namespace 一定要写接口的全路径
2. id属性 一定要和接口的方法一致
3. parameterType属性 一定要和接口方法的参数一致
4. #{} 表示占位符 #{username} 等价于 user.username
-->
<mapper namespace="com.zhongruan.dao.IUserDao">
<insert id="save" parameterType="com.zhongruan.bean.User">
insert into whut02.t_user (username, password, age)
values (#{username}, #{password}, #{age})
</insert>
<select id="findByUsername" resultType="com.zhongruan.bean.User">
select *
from whut02.t_user
where username = #{username}
</select>
<delete id="deleteByUsername" parameterType="com.zhongruan.bean.User">
delete
from whut02.t_user
where username = #{username}
</delete>
</mapper>
(6)在MyBatis的配置文件里面注册相应实体类的数据库映射文件
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/zhongruan/dao/UserDao.xml"/>
</mappers>
3.借助MyBatis完成数据访问
新建一个测试类(纯粹为测试用),来借助MyBatis完成数据访问。
package com.zhongruan.test;
import com.zhongruan.bean.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) throws IOException {
// 加载MyBatis的配置文件
InputStream inputStream = Test01.class.getClassLoader().getResourceAsStream("config.xml");
// 得到核心类 sqlSession
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 指定执行的方法
String statement = "com.zhongruan.dao.IUserDao2.save";
//User user = new User(1, "zhangsan", "123456", 20);
//User user2 = new User(2, "lisi", "123456", 20);
User user3 = new User(3, "a", "123456", 20);
sqlSession.insert(statement, user3);
sqlSession.commit();
sqlSession.close();
inputStream.close();
}
}
上面的代码执行成功后,便插入一条数据。
借助MyBatis完成数据访问的具体步骤:
- 加载MyBatis的配置文件
- 通过SqlSessionFactoryBuilder和SqlSessionFactory得到sqlSession对象(MyBatis核心对象)
- 指定所要执行的方法(相应实体类的数据访问对象接口的方法)
- 调用sqlSession对象的数据库操作方法(insert、delete、select等等)与所要执行的方法相对应
- 调用sqlSession对象的==commit()==方法,提交执行相应的操作。
- 关闭相应的sqlSession对象
4.使用注解开发
使用注解最大的好处便是可以不用编写相应实体类的数据库映射文件,直接在相应实体类的数据访问对象接口的方法中添加注解以达到访问数据库的目的。
(1)新建相应实体类的数据访问对象接口
一般用到的注解为@Insert、@Select、@Delete、@Select和@Update等等
,直接写在相应的方法上面,并在后面写上相应的sql语句即可。
IUserDao2.java
package com.zhongruan.dao;
import com.zhongruan.bean.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
public interface IUserDao2 {
@Insert("insert into whut02.t_user (username, password, age) values (#{username}, #{password}, #{age})")
void save(User user);
@Select("select * from whut02.t_user where username = #{username}")
User findByUsername(String username);
@Delete("delete from whut02.t_user where username = #{username}")
void deleteByUsername(String username);
}
(2)在MyBatis的配置文件里面注册相应实体类的数据访问对象接口
<mappers>
<mapper class="com.zhongruan.dao.IUserDao2"/>
</mappers>
这样采用注解也可完成相同的操作。
5.总结
- mybatis是一个持久层框架,是对JDBC的封装,使用mybatis操作更方便,且具有面向对象的思想
- 使用mybatis前提
- 导入相应的依赖
- 编写mybatis对应的配置文件
- 根据所要处理的数据库表创建相应的
实体类
- 建立相应实体类的
数据访问对象(data access object,dao)接口
- 建立相应实体类的
数据库映射文件(.xml文件)
- 在此映射文件内写相应的sql语句
- 在MyBatis的配置文件里面注册相应实体类的数据库映射文件
- 使用mybatis
- 加载MyBatis的配置文件
- 得到核心类 SqlSession
- 指定执行的方法或者
得到相应的代理对象
- sqlSession执行相应的方法
- 释放资源
- 推荐使用注解开发
- 不用编写相应的数据库映射文件,直接在对应的DAO接口里面写注解和sql语句