mybatis入门笔记(一)

文章目录

  • eclipse中新建maven project
    配置pom.xml
  • 框架原理初步了解
  • 一个小栗子步骤:
    全局配置
    数据库准备
    实体类pojo
    实体类映射
    数据库操作dao及实现类
    全局中配置映射文件
    打开会话
    测试执行sql
  • xml配置部分解读
  • 动态代理

1.eclipse中新建maven project

暂无

2.配置pom.xml

	4.0.0
	com
	ADemo
	0.0.1-SNAPSHOT
	war
	
	
		
			junit
			junit
			4.12
		

		
			org.mybatis
			mybatis
			3.5.0
		
		
			mysql
			mysql-connector-java
			8.0.18
		
	

	
	
		
			
				org.apache.maven.plugins
				maven-complie
				3.1
				
					utf-8
					1.8
					1.8
				
			
		
		
			
				src/main/java
				
					**/*.xml
				
				false
			
		
	


3.框架原理初步了解

–暂无


4.步骤
  • 全局配置mybatis-config.xml

在src/main/resource下配置此xml文件




	
	
	
		
		
			
			
			
			
				
				
				
				
				
			
		
	
	

  • 数据库准备
-- ----------------------------
-- Table structure for tb_student
-- ----------------------------
DROP TABLE IF EXISTS `tb_student`;
CREATE TABLE `tb_student`  (
  `sid` tinyint(4) NOT NULL AUTO_INCREMENT,
  `sNo` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sName` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sSex` char(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`sid`) USING BTREE,
  UNIQUE INDEX `sNo`(`sNo`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_student
-- ----------------------------
INSERT INTO `tb_student` VALUES (1, '001', '朱志', '男');
INSERT INTO `tb_student` VALUES (2, '002', '龚亮', '男');
INSERT INTO `tb_student` VALUES (3, '003', '王鹏', '男');
INSERT INTO `tb_student` VALUES (4, '004', '小红', '女');
INSERT INTO `tb_student` VALUES (5, '005', '烛龙', '男');
INSERT INTO `tb_student` VALUES (6, '006', '白宇', '男');
INSERT INTO `tb_student` VALUES (8, '007', '油条', '男');
INSERT INTO `tb_student` VALUES (11, '008', '油条', '男');
INSERT INTO `tb_student` VALUES (12, '009', '豆浆', '女');

SET FOREIGN_KEY_CHECKS = 1;

mybatis入门笔记(一)_第1张图片

  • pojo类–Student.java

我的pojo类属性和数据库字段是一样的 便于mybatis填充对应的信息
如果不一样 可以在dao中使用注解或者在sql中使用别名的方式等等……

package com.entity;

public class Student {
	private int sid;
	private String sNo;
	private String sName;
	private String sSex;
	public Student() {
		super();
	}
	public Student(int sid, String sNo, String sName, String sSex) {
		super();
		this.sid = sid;
		this.sNo = sNo;
		this.sName = sName;
		this.sSex = sSex;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sNo=" + sNo + ", sName=" + sName + ", sSex=" + sSex + "]";
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getsNo() {
		return sNo;
	}
	public void setsNo(String sNo) {
		this.sNo = sNo;
	}
	public String getsName() {
		return sName;
	}
	public void setsName(String sName) {
		this.sName = sName;
	}
	public String getsSex() {
		return sSex;
	}
	public void setsSex(String sSex) {
		this.sSex = sSex;
	}

}

  • dao及实现类

提示对命名空间的一点说明:
在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。
命名空间的作用有两个,一个是利用更长的完全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。

//dao
package com.dao;
import java.util.List;
import com.entity.Student;

public interface StuDao {
	/* 
	 * 查询所有学生信息 
	 */
	List ListAllStu();
	/*
	 *  查询一名学生记录
	 */
	Student getStu(int sid);
	/*
	 * 新增一条学生信息
	 */
	void addStu(Student stu);
	/*
	 * 修改学生信息
	 */
	void updateStu(Student stu);
	/*
	 *删除学生信息 
	 */
	void deleteStu(int id);
}

//daoImpl
package com.dao.impl;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.dao.StuDao;
import com.entity.Student;
import com.util.MybatisUtil;

public class StuDaoImpl implements StuDao {
	// 获取session
	SqlSession session = MybatisUtil.getSqlSession();
	/*
	 * 查询所有学生信息
	 */
	@Override
	public List ListAllStu() {
		return this.session.selectList("StuDaomapper.selectStus", 1);
	}
	/*
	 *  查询一条学生信息 
	 */
	@Override
	public Student getStu(int sid) {
		return this.session.selectOne("StuDaomapper.selectone", sid);
	}
	@Override
	/*
	 * 新增一条学生信息
	 *表单新增时不允许自己设置学生学号
	 *通过查找最大id+1? 算了。。先不写
	 */
	public void addStu(Student stu) {
		this.session.insert("StuDaomapper.insertone",stu);
		this.session.commit();
	}
	@Override
	public void updateStu(Student stu) {
		this.session.update("StuDaomapper.update", stu);
		this.session.commit();
	}
	@Override
	public void deleteStu(int id) {
		this.session.delete("StuDaomapper.delete", id);
		this.session.commit();
	}
}

  • 实体类映射文件student.mbm.xml

命名这个,一般是pojomapper.xml吧 看个人规范
也可以参考:mybatis官方文档




	
	
	
	
		insert into tb_student (sNo,sName,sSex)
		values(#{sNo},#{sName},#{sSex})
	
	
		update tb_student set sNo=#{sNo},sName=#{sName},sSex=#{sSex} where sid=#{sid}
	
	
		delete from tb_student where sid=#{sid}
	

  • 全局配置中配置实体类映射

在mybati-config.xml中,节点里,新增:


			
			
		
  • 从xml中构建会话工厂打开会话MybatisUtil.java

写得不太规范 可参考mybatis官方文档
也可以不从xml中构建

“每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。”

package com.util;

import java.io.IOException;
import java.io.InputStream;

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.omg.CORBA.PUBLIC_MEMBER;

public class MybatisUtil {
	private static SqlSession session;
	private static SqlSessionFactory sqlSessionFactory;
	static {
		try {
			// 指定全局配置文件
			String resource = "mybatis-config.xml";
			// 加载 读取配置文件
			InputStream inputStream = Resources.getResourceAsStream(resource);
			// 构建sqlSessionFactoryBuilder对象
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/* 提供获取session的接口
	 * 查看官方文档:sqlSession不能被共享,所以不能放在静态区
	 */
	public static SqlSession getSqlSession() {	
		// 打开sqlSession会话 获取session对象 
		session = sqlSessionFactory.openSession();
		return session;
	}
	// 关闭SqlSession连接
	public static void closeSqlSession() {
		if (session != null) {
			session.close();
		}
	}
}

  • 测试类MybatisTest.java

写的时候 是写一个方法测一个方法的

package com.dao.impl;

import static org.junit.jupiter.api.Assertions.*;
import java.util.ArrayList;
import java.util.List;

import org.junit.AfterClass;
import org.junit.jupiter.api.Test;

import com.entity.Student;
import com.util.MybatisUtil;

class StuDaoImplTest {
	@Test
	//查询多条数据
	void testListAllStu() {
		List sList = new StuDaoImpl().ListAllStu();
		for (Student student : sList) {
			System.out.println(student);
		}
	}
	@Test
	//查询一条数据
	void testgetStu() {
		Student stu = new StuDaoImpl().getStu(3);
		System.out.println(stu);
	}
	@Test
	//新增一条数据测试
	 void testAddStu() {
		Student stu = new Student();
		stu.setsName("豆浆");
		stu.setsNo("009");
		stu.setsSex("女");
		System.out.println(stu);
		new StuDaoImpl().addStu(stu);
	}
	@Test
	//更新测试
	void testupdateStu() {
		Student stu = new Student();
		stu.setSid(5);
		stu.setsName("烤肉");
		stu.setsNo("005");
		stu.setsSex("女");
		new StuDaoImpl().updateStu(stu);
		
	}
	@Test
	//删除一条数据
	void testdeleteStu() {
		new StuDaoImpl().deleteStu(11);
	}
	@AfterClass
	//关闭session会话
	void close() {
		MybatisUtil.closeSqlSession();
	}
}

5.xml配置部分解读
  • 属性(properties):
    上面mybatis-config.xml已经介绍
    属性可以在不止一个位置配置,那么mybatis的加载顺序:

在 properties 元素体内指定的属性首先被读取。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

  • 设置 settings
    完整实例如下:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

  • 类型别名(typeAliases)
    用于减少冗余的类限定名。有时候一个类限定名前缀可能特别长

  

当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

  • 事物管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:


  

提示:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

之前使用jdbc时,事物是默认自动提交的。要手动提交, 就

conn.setAutoCommit(false); //关闭自动提交

mybatis封装了的jdbc的默认开启事物管理的,也就是说要手动提交


  • 6.动态代理

先看一下官方文档给出的解释:

映射器实例
映射器是一些由你创建的、绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。 也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。 并不需要显式地关闭映射器实例,尽管在整个请求作用域保持映射器实例也不会有什么问题,但是你很快会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。 为了避免这种复杂性,最好把映射器放在方法作用域内。下面的示例就展示了这个实践:

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // 你的应用逻辑代码
}

上述curd
传统的结构:
现在mybatis的接口动态代理机制,可以让我们无需写实现类。只需要写dao(mapper.java)即可。
但是 要限定类映射文件中的namesapce为dao接口的全类限定名

//上面的测试类 MybatisTest.java
@Test
	//新增一条数据测试
	 void testAddStu() {
		Student stu = new Student();
		stu.setsName("肥牛");
		stu.setsNo("010");
		stu.setsSex("女");
		System.out.println(stu);
		//new StuDaoImpl().addStu(stu);
		//动态代理
		SqlSession session = MybatisUtil.getSqlSession();
		StuDao stuDao = session.getMapper(StuDao.class);
		stuDao.addStu(stu);
		session.commit();
	}

你可能感兴趣的:(框架学习)