MyBatis从入门到放弃
什么是MyBatis
MyBatis是一个半自动的ORM(Object Relation Mapping对象关系映射)持久层框架,底层其实就是封装了JDBC,简化了对数据库的操作
MyBatis的使用
创建项目
添加Maven依赖
需要添加的依赖(坐标)是:
<!--依赖-->
<dependencies>
<!--maven是有一个本地仓库的,下载好的jar包就存在本地-->
<!-- 现在就是代表已经导入了一个java连接mysql的jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--ctrl+x删除一整行 ctrl+D-->
<!--引入mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--这是做单元测试的jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
创建数据库以及开发包
- 建库建表语句
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
- 实体类
User
package com.changan.entity;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
- dao层
UserDao
package com.changan.dao;
import com.changan.entity.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有的学生信息
* @return
*/
List<User> findUsers();
/**
* 添加用户信息
* @param user
* @return
*/
int addUser(User user);
/**
* 根据id删除用户信息
* @param id
* @return
*/
int deleteUser(Long id);
/**
* 更新用户
* @param user
* @return
*/
int updateUser(User user);
}
配置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">
<!--配置-->
<configuration>
<typeAliases>
<package name="com.changan.entity"></package>
</typeAliases>
<!--多套开发环境-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器 默认使用JDBC进行事务管理-->
<transactionManager type="JDBC"/>
<!--数据源配置-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&useUnicode=true&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--对应的mybatis的xml文件-->
<mapper resource="mapper/UserDao.xml"/>
</mappers>
</configuration>
- 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">
<!--
根据namespace查找对应创建dao接口
根据方法名称查找对应的sql语句
-->
<mapper namespace="com.changan.dao.UserDao">
<!--
每一种sql语句对应每一种标签
resultType 返回值类型
-->
<select id="findUsers" resultType="User">
select * from user
</select>
<!--
id对应方法名称
parameterType 参数类型
-->
<insert id="addUser" parameterType="user">
INSERT INTO `mybatis`.`user`(`id`, `name`, `age`, `email`) VALUES (null, #{name}, #{age}, #{email});
</insert>
<delete id="deleteUser">
delete from `USER` where id=#{id}
</delete>
<update id="updateUser">
UPDATE `mybatis`.`user` SET `name` = #{name}, `age` = #{age}, `email` = #{email} WHERE `id` = 7;
</update>
</mapper>
测试
MyBatisUtil
package com.changan.utils;
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 MyBaitsUtil {
static SqlSession sqlSession = null;
/**
* 获取SqlSession
* @return SqlSession对象
*/
public static SqlSession getSqlSession(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 关闭SqlSession
*/
public static void closeSqlSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
UserTest
package com.changan.test;
import com.changan.dao.UserDao;
import com.changan.entity.User;
import com.changan.utils.MyBaitsUtil;
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.Test;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
@Test
public void testFind() {
SqlSession sqlSession = MyBaitsUtil.getSqlSession();
try {
List<User> users = sqlSession.selectList("com.changan.dao.UserDao.findUsers");
for (User user : users
) {
System.out.println(user.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBaitsUtil.closeSqlSession(sqlSession);
}
}
@Test
public void testSelect() {
/*ctrl+alt+L 代码对齐*/
SqlSession sqlSession = MyBaitsUtil.getSqlSession();
try {
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.findUsers();
//jdk8中提供的箭头函数
users.forEach(user -> {
System.out.println(user.toString());
});
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBaitsUtil.closeSqlSession(sqlSession);
}
}
@Test
public void testInsert() {
SqlSession sqlSession = MyBaitsUtil.getSqlSession();
try {
//mybatis是支持事务的 默认是不开启事务的
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setName("luoya");
user.setAge(18);
user.setEmail("3838438@qq.com");
//仅仅是在内存中增加了一个用户
int i = userDao.addUser(user);
//手动提交事务
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBaitsUtil.closeSqlSession(sqlSession);
}
}
@Test
public void deleteUser() {
SqlSession sqlSession = MyBaitsUtil.getSqlSession();
try {
//mybatis是支持事务的 默认是不开启事务的
UserDao userDao = sqlSession.getMapper(UserDao.class);
//仅仅是在内存中增加了一个用户
int i = userDao.deleteUser(5L);
//手动提交事务
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBaitsUtil.closeSqlSession(sqlSession);
}
}
@Test
public void testupdate() {
SqlSession sqlSession = MyBaitsUtil.getSqlSession();
try {
//mybatis是支持事务的 默认是不开启事务的
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setName("ange");
user.setAge(38);
user.setEmail("1351261434@qq.com");
//仅仅是在内存中增加了一个用户
int i = userDao.updateUser(user);
//手动提交事务
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBaitsUtil.closeSqlSession(sqlSession);
}
}
}
总结
步骤
- 创建项目
- 新建数据库和开发包
- 导入maven坐标
- 配置mybatis-config文件
- 编写实体类
- 编写dao接口
- 编写dao.xml文件
- 编写MyBaitsUtil文件
- 编写测试类