MyBatis学习系列-入门
一、简介
1.什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 官方文档:https://mybatis.org/mybatis-3/zh/
github地址:https://github.com/mybatis/mybatis-3
2.为什么要使用MyBatis
- 与 JDBC 相比,减少了 50% 以上的代码量。
- MyBatis 是最简单的持久化框架,小巧并且简单易学。
- MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
- 提供 XML 标签,支持编写动态 SQL 语句。
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
- 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。
3.JDBC
JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
1.使用jdbc连接mysql
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//1.定义数据库相关信息(驱动、连接信息)
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?userSSL=false";
String username = "root";
String password = "root";
//2.加载驱动
Class.forName(driver);
//3.获取数据库连接对象
conn = DriverManager.getConnection(url,username,password);
//4.定义查询
String sql = "SELECT id,name,age FROM user WHERE name LIKE '张三%';";
//5.创建一个PreparedStatement对象操作数据库
pstmt = conn.prepareStatement(sql);
//6.执行sql,得到结果集
rs = pstmt.executeQuery();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
2.JDBC缺点
- 频繁连接数据库,造成资源浪费;
- 硬编码导致SQL语句与业务代码高度耦合不利于后期维护迭代;
- 对PreparedStatement对象参数设置方便,需要设置占位符硬编码;
- 返回结果对象ResultSet 需要通过大量硬编码赋值与业务返回对象;
4.搭建第一个Mybatis项目
1.创建一个普通的maven项目
2.添加pom.xml依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
3. 驱动与数据库版本关系
4.创建 user数据表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '张三', '18');
INSERT INTO `user` VALUES ('2', '李四', '20');
5.创建与表对应的实体类对象
package com.weber17.entity;
public class User {
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
6.创建User实体mapper接口类
package com.weber17.mapper;
import com.weber17.entity.User;
public interface UserMapper {
/**
* 根据id查询用户
* @param id
* @return
*/
User selectUser(Integer id);
/**
* 新增用户
* @param user
* @return
*/
Integer insertUser(User user);
/**
* 更新用户
* @param user
* @return
*/
Integer updateUser(User user);
/**
* 根据删除用户
* @param id
* @return
*/
Integer deleteUser(Integer id);
}
6.在项目resources里面新建com/weber17/mapper目录创建User实体的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">
<mapper namespace="com.weber17.mapper.UserMapper">
<!--根据id查询Emp实体-->
<select id="selectUser" resultType="com.weber17.entity.User">
select * from Emp where id = #{id}
</select>
<insert id="insertUser">
INSERT INTO
`mybatis`.`emp` ( `username`)
VALUES (#{username});
</insert>
<update id="updateUser">
UPDATE EMP
SET username=#{username}
WHERE id=#{id}
</update>
<delete id="deleteUser">
DELETE FROM emp
WHERE id=#{id}
</delete>
</mapper>
7.编写mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.weber17.mapper.UserMapper"></mapper>
</mappers>
</configuration>
8.编写测试类
package com.weber17.test;
import com.weber17.entity.User;
import com.weber17.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
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;
public class MybatisTest {
public static void main(String [] args){
//加载mybatis-config.xml获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//基于mapper.xml中的StatementId的方式去执行SQL
SqlSession session = sqlSessionFactory.openSession();
User userXml = session.selectOne("com.weber17.mapper.UserMapper.selectUser", 1);
System.out.println("基于xml文件的方式执行SQL:");
System.out.println(userXml);
//基于接口绑定的方式
/**
* 步骤:
* 1. 新建数据访问层的接口:POJOMapper(例如本文中的UserMapper)
* 2. 添加mapper中对应的操作方法
* 2.1 方法名要和mapper中对应的操作的节点的id要一致
* 2.2 返回类型要和mapper中对应的操作的节点的resultType要一致
* 2.3 mapper中对应的操作的节点的参数必须要在方法的参数中声明
* 3. Mapper.xml 中的namespace要和接口的完整限定类名要一样
* 4.修改mybatis全局配置文件中的mappers,采用接口绑定的方式: <mapper class="com.weber17.mapper.UserMapper"></mapper>
* 5. xml需要和接口放在同一级目录,就是在resources新建和接口一样的文件目录
*/
UserMapper userMapperInterface = session.getMapper(UserMapper.class);
User userInterface = userMapperInterface.selectUser(1);
System.out.println("基于接口的方式执行SQL:");
System.out.println(userInterface);
//基于注解的方式
UserMapper userMapperAnnotation = session.getMapper(UserMapper.class);
User userAnnotation = userMapperAnnotation.selectUser(2);
System.out.println("基于注解的方式执行SQL:");
System.out.println(userAnnotation);
}
private static SqlSessionFactory getSqlSessionFactory() {
// 从 XML 中构建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
return new SqlSessionFactoryBuilder().build(inputStream);
}
}