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 i
* @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);
}
}