Mybatis入门功法第一式
目录
mybatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
工作原理:
-
加载配置
Mybatis将sql映射加载成为一个个的
MappedStatement
对象(包括传入参数的映射配置,执行的sql语句,结果映射配置),将其存储在内存中 -
SQL解析
当API接口层收到调用请求时,会接收到传入的SQL的ID和传入的参数对象(可以是Map,实体类或者基本数据类型)mybatis会根据sql的ID找到对应的MappedStatement,然后根据传入的参数对象对
MappedStatement
进行解析,解析之后得到最终执行的sql语句和参数 -
SQL执行
将最终得到的sql语句和参数拿到数据库进行执行,得到执行结果
-
结果映射
将操作数据库的结果按照结果映射配置进行转换,可以转换为map,实体类或者基本数据类型,将转换的结果返回
SqlSessionFactoryBuider
此组件根据Mybaits主配置文件构建SqlSessionFactory
SqlSessionFactory
每一个mybatis应用程序都以一个SqlSessionFactory
为核心,此组件负责常见SqlSession
对象
SqlSession
此组件包含所有执行的sql语句操作的方法,用于执行已经映射的sql语句
Mybatis配置文件
SqlMapConfig.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/jektong?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="jektong" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
SqlMapper.xml
映射文件,用于配置sql语句的映射信息
<?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">
<mapper namespace="">
</mapper>
Mybatis基本操作
搭建mybatis环境
为工程添加mybatis依赖包,在src下添加mybatis的主配置文件SqlMapConfig.xml,
指定数据库连接参数和框架参数利用Mybatis提供API,获取SqlSession
对象
获取SqlSession对象
String path = "主配置文件URL";
Reader reader = Resources.getResourceAsReader(path);
构建SqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.buld(reader);
SqlSession ss = ssf.openSession();
利用SqlSession实现CRUD操作
根据数据表编写实体类,编写SqlMapper.xml映射文件,定义SQL操作和映射信息
获取SqlSeesion对象,执行增删改查操作,提交事务,释放SqlSession对象资源
MybatisUtil.java
package com.jektong.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.jektong.entity.Emp;
/**
* @author jektong
* @Date 2020-10-12 11:24:12
*/
public class MybatisUtil {
public static SqlSessionFactory ssf;
// 构建SqlSessionFactory对象
static {
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
ssf = ssfb.build(MybatisUtil.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
}
// 获取sqlsession(默认数据库事务不是自动提交)
public static SqlSession getSession() {
return ssf.openSession();
}
// 获取sqlsession(手动设置事务是否自动提交)
// isAutoCommit=true 自动提交 false自动提交
public static SqlSession getSession(boolean isAutoCommit) {
return ssf.openSession(isAutoCommit);
}
public static void main(String[] args) {
System.out.println(MybatisUtil.getSession());
}
}
Eclipse中用mybatis实现CRUD
sql:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_emp
-- ----------------------------
DROP TABLE IF EXISTS `t_emp`;![在这里插入图片描述](https://img-blog.csdnimg.cn/20201012171207854.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODU3OTU1,size_16,color_FFFFFF,t_70#pic_center)
CREATE TABLE `t_emp` (
`e_id` int(4) NOT NULL AUTO_INCREMENT,
`e_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`e_salary` double(7, 2) NULL DEFAULT NULL,
`e_bonus` double(5, 2) NULL DEFAULT NULL,
`e_hiredate` date NULL DEFAULT NULL,
`e_deptno` int(2) NULL DEFAULT NULL,
PRIMARY KEY (`e_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1016 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
结构:
EmpDao.java
package com.jektong.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.jektong.entity.Emp;
import com.jektong.util.MybatisUtil;
/**
* @author jektong
* @Date 2020-10-12 11:22:45
*/
public class EmpDao {
SqlSession ss = null;
// 查询所有
public List<Emp> findAll() {
ss = MybatisUtil.getSession();
List<Emp> emps = ss.selectList("com.jektong.dao.EmpDao.findAll");
ss.close();
return emps;
}
// 根据id查找
public Emp findById(int id) {
ss = MybatisUtil.getSession();
Emp emp = ss.selectOne("com.jektong.dao.EmpDao.findById", id);
ss.close();
return emp;
}
// 添加
public void save(Emp emp) {
try {
ss = MybatisUtil.getSession();
ss.insert("com.jektong.dao.EmpDao.save", emp);
ss.commit();
} catch (Exception e) {
ss.rollback();
} finally {
ss.close();
}
}
// 修改
public void updateEmp(Emp emp) {
ss = MybatisUtil.getSession(true);
ss.update("com.jektong.dao.EmpDao.updateEmp", emp);
ss.close();
}
// 删除
public void deleteById(int id) {
ss = MybatisUtil.getSession(true);
ss.delete("com.jektong.dao.EmpDao.deleteById", id);
ss.close();
}
}
EmpMapper.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.jektong.dao.EmpDao">
<!--
namespace: 所映射的类
id: 一般与方法名一致
resultType: 返回类型
parameterType: 参数类型
-->
<!-- 查询所有 -->
<select id="findAll" resultType="com.jektong.entity.Emp">
select * from t_emp
</select>
<!-- id查询单个对象 -->
<select id="findById" resultType="com.jektong.entity.Emp"
parameterType="java.lang.Integer">
select * from t_emp where e_id = #{e_id};
</select>
<!-- 添加员工 -->
<insert id="save" parameterType="com.jektong.entity.Emp">
insert into t_emp
values(#{e_id}, #{e_name}, #{e_salary}, #{e_bonus},
#{e_hiredate},#{e_deptno} )
</insert>
<!-- 修改 -->
<update id="updateEmp" parameterType="com.jektong.entity.Emp">
update t_emp set
e_name=#{e_name},
e_salary=#{e_salary},
e_bonus=#{e_bonus},
e_hiredate=#{e_hiredate},
e_deptno = #{e_deptno}
where e_id=#{e_id}
</update>
<!--删除-->
<delete id="deleteById" parameterType="java.lang.Integer">
delete from t_emp where e_id = #{e_id}
</delete>
</mapper>
在mybatis配置文件中关联映射:
<!-- 关联映射文件 -->
<mappers>
<mapper resource="com/jektong/mapper/EmpMapper.xml"/>
</mappers>
</configuration>
测试:
package com.jektong.test;
import java.sql.Date;
import java.util.List;
import org.junit.Test;
import com.jektong.dao.EmpDao;
import com.jektong.entity.Emp;
/**
* @author jektong
* @Date 2020-10-12 14:05:25
*/
public class OneTest {
@Test
public void t1() {
EmpDao empDao = new EmpDao();
List<Emp> emps = empDao.findAll();
for (Emp emp : emps) {
System.out.println(emp.getE_name() + ":" + emp.getE_salary());
}
}
@Test
public void t2() {
EmpDao empDao = new EmpDao();
System.out.println(empDao.findById(1001).getE_name());
}
@Test
public void t3() {
EmpDao empDao = new EmpDao();
Emp emp = new Emp();
emp.setE_name("张三丰");
emp.setE_hiredate(new Date(System.currentTimeMillis()));
empDao.save(emp);
}
@Test
public void t4() {
EmpDao empDao = new EmpDao();
Emp emp = new Emp();
emp.setE_id(1015);
emp.setE_name("张三丰2");
empDao.updateEmp(emp);
}
@Test
public void t5() {
EmpDao empDao = new EmpDao();
empDao.deleteById(1014);
}
}
上一篇: CSS 小结笔记之变形、过渡与动画的示例
下一篇: 网络相关的面试
推荐阅读
-
mybatis入门(1)——第一个mybatis程序
-
(一)Mybatis入门之第一个程序
-
JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说
-
第一章:MyBatis入门
-
第一章:MyBatis-Plus 实战入门
-
mybatis入门(1)——第一个mybatis程序
-
Mybatis入门功法第一式
-
JavaScript 快速入门十八式 第一式:基本语法
-
JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说