摘自文档: MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
读完这段话,感觉有些不太好理解,但从中我们可以明白Mybatis是一款持久层框架(对数据进行增删改查的框架),是对JDBC代码的封装,那么原生JDBC代码有什么不足呢?通过一个JDBC例子来说明一下
create table tb_user(
id int(11) primary key auto_increment comment ‘id‘,
name varchar(20) comment ‘名字‘
) comment ‘用户表‘
import lombok.Data;
@Data
public class User {
/**
* id
*/
private int id;
/**
* 名字
*/
private String name;
}
import com.test.jdbc.entity.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
/**
* 数据库连接地址
*/
public static String URL = "jdbc:mysql://localhost:3306/user";
/**
* 用户名
*/
public static String USER = "root";
/**
* 密码
*/
public static String PASSWORD = "Test@2019";
/**
* 注册驱动
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取所有用户
* @return
*/
public List<User> getAll() {
List<User> userList = new ArrayList<>();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
// 1. 获取连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 2. 创建语句
st = conn.createStatement();
// 3. 执行语句
rs = st.executeQuery("select * from tb_user");
// 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
User user = new User();
user.setId(id);
user.setName(name);
userList.add(user);
}
return userList;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (st != null) {
st.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (rs != null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return userList;
}
/**
* 根据ID删除用户
* @param id
* @return
*/
public int deleteById(int id) {
Connection conn = null;
PreparedStatement pst = null;
try {
// 1. 获取连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 2. 创建语句
pst = conn.prepareStatement("delete from tb_user where id=?");
pst.setInt(1, id);// 索引从1开始,如果有多个参数需要设置, 这儿很容易出错,一不小心索引可能就乱了,不太灵活??
// 3. 执行语句
return pst.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (pst != null) {
pst.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return 0;
}
}
通过以上JDBC代码我们发现,jdbc存在以下不足:
接下来我们再回头看看Mybatis的简介
注意
基于Maven构建
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--Mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!---lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<?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/user"/>
<property name="username" value="root"/>
<property name="password" value="Test@2019"/>
</dataSource>
</environment>
</environments>
<!--指定Mapper文件位置-->
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
<?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.mybatis.mapper">
<!--获取所有用户-->
<select id="getAll" resultType="com.mybatis.entity.User">
select * from tb_user
</select>
<!--根据ID删除用户-->
<delete id="deleteById" parameterMap="int">
delete from tb_user where id=#{id}
</delete>
</mapper>
原文:https://www.cnblogs.com/rookie-test/p/12563250.html