基于注解的MyBatis使用方法

2022-10-07 13:16:53

前言

MyBatis

MyBatis 是一款优秀的持久层框架,可以很方便的在java中实现对数据库的操作。
MyBatis 可以将sql语句映射为java接口函数,直接对实体进行操作。
MyBatis 的映射类(Mapper)在映射sql语句时有两种方式,一种是xml映射,功能强大;另一种是java注解,书写简便。

本文将通过示例来简单展示基于注解的MyBatis使用方法。

原理简介

MyBatis首先获得一个SqlSessionFactory对象,再由其产生若干个SqlSession对象。每个SqlSession对象所产生的Mapper对象都可以用来执行函数。
注意SqlSessionFactory对象应当只在程序运行过程中产生一次,可以考虑使用单例模式。SqlSession每次使用完成后需要关闭来释放数据库资源,可以使用try-with-resource.
在这里插入图片描述

项目下载地址

基于注解的MyBatis使用实例

项目示例

0. 建立项目

建立一个maven项目,在eclipse的包浏览器中呈现如下结构:(文末有项目示例的下载链接)
在这里插入图片描述

1. 建立数据库

在test数据库中建立了people表,主键id为int型且自动增加,还有一个类型为varchar(255)的name字段。
随意插入几条数据。
在这里插入图片描述

1. 安装MyBatis:

在/pom.xml中添加如下依赖,刷新项目。

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.0</version></dependency>

2.配置MyBatis:

在/src/main/resources下新建conf.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:开发模式
	    work:工作模式
	    default="development",id="development",两个的属性值必须一致
     --><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://192.168.137.212:3306/chunfeng_test?useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><!-- 在配置文件中 关联包下的 接口类--><mappers><mapperclass="com.fall.mybatistest.mapper.MainMapper"/></mappers></configuration>

3. 建立实体类

在domain包下新建一个实体类People.java

package com.fall.mybatistest.domain;publicclassPeople{privateint id;private String name;}

用eclipse自动填充getter(),setter(),hashcode(),equals(),toString()方法。

4. 建立映射类

在mapper包下新建映射接口类MainMapper(即conf.xml中指向的映射类)。

package com.fall.mybatistest.mapper;publicinterfaceMainMapper{}

当需要映射语句时,在这里新建函数并配置注解,比如建立一个根据id查找的函数:
MyBatis会自动将查找结果转化成实体类。

publicinterfaceMainMapper{@Select("SELECT * FROM people WHERE id=#{id}")public PeopleselectById(int id);}

注意注解的sql语句使用#{<name>}来接收参数。
当参数不止一个时,要在函数参数前加@Param("<name>")来标识参数名。

5. 建立utils类

在utils包下建立MyBatisUtils类,这个类只会创建一次factory。

package com.fall.mybatistest.utils;publicclassMyBatisUtils{static SqlSessionFactory factory;publicstatic SqlSessiongetSession(){if(factory==null){
    		String resource="conf.xml";
            InputStream is= MyBatisUtils.class.getClassLoader().getResourceAsStream(resource);
            factory=newSqlSessionFactoryBuilder().build(is);}return factory.openSession();}}

6. 测试

建立测试类Test.java

package com.fall.mybatistest;publicclassTest{publicstaticvoidmain(String[] args)throws IOException{try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);
			
			People people= mapper.selectById(2);
			System.out.println(people);}}}

结果如下:
People [id=2, name=cutes];

7. 其它测试

进行增/删/改/查/查全部 五个测试:
首先修改MainMapper:

publicinterfaceMainMapper{@Select("SELECT * FROM people")public ArrayList<People>selectAll();@Select("SELECT * FROM people WHERE id=#{id}")public PeopleselectById(int id);@Update("UPDATE people SET name=#{name} WHERE id=#{id}")publicbooleanupdateNameById(@Param("id")int id,@Param("name") String name);@Insert("INSERT INTO people(name) VALUES (#{name})")publicbooleaninsertByName(String name);@Delete("DELETE FROM people WHERE id=#{id}")publicbooleandeleteById(int id);}

修改Test.java如下:

publicclassTest{publicstaticvoidmain(String[] args)throws IOException{	
		System.out.println("--- insert ---");testInsert();
		System.out.println("--- select ---");testSelect();
		System.out.println("--- select all ---");testSelectAll();
		System.out.println("--- update ---");testUpdate();
		System.out.println("--- delete ---");testDelete();
		
		System.out.println("done");}staticvoidtestInsert(){try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);boolean success= mapper.insertByName("qq");
			System.out.println(success);
			
			session.commit();}}staticvoidtestSelect(){try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);
			
			People people= mapper.selectById(2);
			System.out.println(people);
			
			session.commit();}}staticvoidtestSelectAll(){try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);
			
			List<People> list= mapper.selectAll();
			System.out.println(list);
			
			session.commit();}}staticvoidtestUpdate(){try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);boolean success= mapper.updateNameById(2,"cutes");
			System.out.println(success);
			
			session.commit();}}staticvoidtestDelete(){try(SqlSession session= MyBatisUtils.getSession()){
			MainMapper mapper= session.getMapper(MainMapper.class);boolean success= mapper.deleteById(3);
			System.out.println(success);
			
			session.commit();}}}

结果如下:
在这里插入图片描述
最后的delete出现false是因为之前已经将那条记录删除,所以删除失败。

注意:update,select,delete操作在执行完成后需要进行session.commit()才能使得操作生效。


总结

本文简要介绍了MyBatis基于注解的使用方式,MyBatis还有其它的使用方式将在后续更新。

参考资料

  1. Mybatis框架基于注解的方式,实现对数据增删改查
  2. Mybatis Java API
  • 作者:Little_Fall
  • 原文链接:https://littlefall.blog.csdn.net/article/details/88381897
    更新时间:2022-10-07 13:16:53