MyBatis 是一款由 Java 编写的持久层框架,它支持定制化 SQL、存储过程以及高级映射,并且封装了 JDBC 操作的很多细节,使开发者只需要关注 SQL 语句本身,不再去管注册驱动,创建连接等过程。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录,它使用了ORM思想实现了结果集的封装。
mybatis官网
ORM(Object Relational Mapping,对象关系映射),将数据库表和实体类以及实体类的属性对应起来,让我们通过操作实体类就实现操作数据库表,使用过程中需要做到实体类中的数据库表的字段名称保持一致。
这里会实现基本的增删改查操作,我这里的环境是 IDEA_2019.2.3
、MySQL_8.0.17
。
-- 创建数据库
CREATE DATABASE IF NOT EXISTS example CHARACTER SET utf8 ;
USE example;
DROP TABLE IF EXISTS `user`;
-- 创建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values
(1,'刘备','2018-02-27 17:47:08','男','北京'),
(2,'孙尚香','2018-03-02 15:09:37','女','上海'),
(3,'貂蝉','2018-03-04 11:34:34','女','深圳'),
(4,'诸葛亮','2018-03-04 12:04:06','男','广州'),
(5,'吕布','2018-03-07 17:37:26','男','厦门'),
(6,'黄月英','2018-03-08 11:44:00','女','福建');
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.crudgroupId>
<artifactId>demoartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.17version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.10version>
dependency>
dependencies>
project>
package com.crud.domain;
import java.util.Date;
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
// 还需要添加 getter 和 setter 方法,为了减少文章篇幅,这里就不写了,IDEA快捷键为 alt+insert
package com.crud.dao;
import com.crud.domain.User;
import java.util.List;
/**
* 持久层接口
*/
public interface UserDao {
//查询所有用户
List<User> findAll();
// 保存添加用户
void saveUser(User user);
// 更新用户
void updateUser(User user);
// 根据 ID 删除用户
void deleteUser(Integer id);
}
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/crud/dao/UserDao.xml">mapper>
mappers>
configuration>
<mapper namespace="com.crud.dao.UserDao">
<select id="findAll" resultType="com.crud.domain.User">
select * from user;
select>
<insert id="saveUser" parameterType="com.crud.domain.User">
insert into user (username,address,sex,birthday) value (#{username},#{address},#{sex},#{birthday});
insert>
<update id="updateUser" parameterType="com.crud.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
update>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id};
delete>
mapper>
package mybatisTest;
import com.crud.dao.UserDao;
import com.crud.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
private InputStream is;
private SqlSession sqlSession;
private UserDao userDao;
@Before//测试方法执行之前执行,初始化方法
public void init() throws IOException {
//1. 读取配置文件:类加载器
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2. 获取 SqlSessionFactory,构建者模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3. 使用工厂生产SqlSession对象,工厂模式
sqlSession = factory.openSession();
//4. 使用SqlSession创建Dao接口的代理对象,代理模式
userDao = sqlSession.getMapper(UserDao.class);
}
@After//测试方法执行之后再执行
public void destroy() throws Exception{
sqlSession.close();
is.close();
}
//测试查询所有用户
@Test
public void testFindAll(){
//5. 使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 6. 释放资源
}
// 添加用户
@Test
public void testSave(){
User user = new User();
user.setUsername("Jacks");
user.setAddress("四川成都");
user.setSex("男");
user.setBirthday(new Date());
//5. 使用代理对象执行保存方法
userDao.saveUser(user);
// 提交事务
sqlSession.commit();
}
// 更新对象
@Test
public void testUpdateUser(){
User user = new User();
user.setId(1);
user.setUsername("Jacks");
user.setAddress("四川成都");
user.setSex("男");
user.setBirthday(new Date());
// 使用代理对象执行更新
userDao.updateUser(user);
}
//根据ID删除用户
@Test
public void testDeleteUser(){
// 使用代理对象执行删除方法
userDao.deleteUser(3);
// 提交变更
sqlSession.commit();
}
}
注意:
UserDao.xml
和 UserDao.java
的名称建议一致。Mapper
。UserDao.java
和 UserMapper.java
都可以表示持久层接口。mapper
标签的namespace
属性的取值必须是 dao 接口的全限定类名。select
标签的id
属性的取值必须是 dao 接口的方法名。值得注意的是,只有满足最后三个条件才可以不用创建 dao 接口的实现类。
时间:2019年11月12日00:10:03