Mybatis简单练习注解sql和配置文件sql+注解形式加载+配置文件加载

项目结构

text 复制代码
d:\test\runjar\data\static\data\mybatis_helloworld\Mybatis\
├── lib\
│   ├── asm-3.3.1.jar
│   ├── c3p0-0.9.1.2.jar
│   ├── cglib-2.2.2.jar
│   ├── commons-logging-1.1.1.jar
│   ├── ehcache-core-2.6.8.jar
│   ├── javassist-3.17.1-GA.jar
│   ├── log4j-1.2.17.jar
│   ├── log4j-api-2.0.2.jar
│   ├── log4j-core-2.0.2.jar
│   ├── mybatis-3.2.8.jar
│   ├── mybatis-ehcache-1.0.3.jar
│   ├── mysql-connector-j-8.0.33.jar
│   ├── mysql-connector-java-5.1.7-bin.jar
│   ├── slf4j-api-1.7.5.jar
│   └── slf4j-log4j12-1.7.5.jar
├── src\
│   ├── com\
│   │   └── atguigu\
│   │       └── mybatis\
│   │           ├── entity\
│   │           │   ├── Monster.java
│   │           │   └── Monster2.java
│   │           ├── mapper\
│   │           │   ├── MonsterAnnotation.java
│   │           │   ├── MonsterMapper.java
│   │           │   ├── MonsterMapper.xml
│   │           │   ├── MonsterMapper2.java
│   │           │   └── MonsterMapper2.xml
│   │           └── test\
│   │               ├── Bridge.java
│   │               ├── Facade.cld
│   │               ├── Facade.java
│   │               └── newfile.cld
│   ├── jdbc.properties
│   ├── log4j.xml
│   └── mybatis-config.xml
└── srclib\
    ├── mybatis-3-mybatis-3.3.0.zip
    └── mysql-connector-java-5.1.37.zip

demo核心功能

  1. MyBatis 框架入门 :展示如何配置和使用 MyBatis 进行数据库操作
  2. 多种映射方式 :
    • 注解式映射:通过 MonsterAnnotation.java 演示
    • XML 配置式映射:通过 MonsterMapper.xmlMonsterMapper2.xml 演示
  3. 数据库操作 :实现了基本的 CRUD (创建、读取、更新、删除) 操作
  4. 高级查询 :展示了多种查询方式
    • 条件查询
    • 模糊查询
    • HashMap 参数查询
    • 动态 SQL 查询
  5. 结果映射 :演示了如何使用 resultMap 解决表字段名与实体类属性名不一致的问题

项目结构

  • 实体类 : Monster.javaMonster2.java 表示数据库表对应的 Java 对象
  • 映射器接口 :定义了数据库操作的方法
  • 配置文件 :
    • mybatis-config.xml :MyBatis 核心配置文件
    • jdbc.properties :数据库连接配置
    • log4j.xml :日志配置
  • 测试类 : Bridge.javaFacade.java 用于测试 MyBatis 功能

演示目的

  • 展示 MyBatis 如何简化数据库操作
  • 对比不同的映射方式 (注解 vs XML)
  • 演示 MyBatis 的高级特性 (动态 SQL、结果映射等)
  • 提供一个可运行的 MyBatis 入门示例

如何运行

  1. 确保已创建数据库表 (mybatis_monster_ 和 mybatis_monster2)
  2. 配置正确的数据库连接信息 (在 jdbc.properties 中)
  3. 运行 Bridge.java 或 Facade.java 中的 main 方法
    这个项目是学习 MyBatis 的良好入门示例,涵盖了框架的核心概念和常用功能。

表结构

sql 复制代码
CREATE TABLE mybatis_monster2 (
  monster_id INT PRIMARY KEY AUTO_INCREMENT,
  user_name VARCHAR(255),
  user_email VARCHAR(255)
);

CREATE TABLE mybatis_monster_ (
  monster_id INT PRIMARY KEY AUTO_INCREMENT,
  age INT,
  birthday DATE,
  email VARCHAR(255),
  gender INT,
  name VARCHAR(255),
  salary DOUBLE
);


INSERT INTO mybatis_monster_ (age, birthday, email, gender, name, salary) VALUES
(25, '1998-01-15', 'monster1@example.com', 1, 'Monster1', 5000.0),
(30, '1993-05-20', 'monster2@example.com', 0, 'Monster2', 6000.0);

实体类

java 复制代码
//就是一个普通的Pojo类
//因为 使用原生态的sql语句查询结果还是要封装成对象
//所以我们要求大家这里的实体类属性名和表名字段保持一致。
// 忽略get set
public class Monster {
	
	private Integer monster_id;
	private Integer age;
	private String name;
	private String email;
	private Date birthday;
	private double salary;
	private Integer gender;
}

// 忽略get set
public class Monster2 {

	private Integer monster_id;
	private String username;
	private String useremail;
}

注解式映射

java 复制代码
package com.atguigu.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.atguigu.mybatis.entity.Monster;



public interface MonsterAnnotation {
		//添加方法,将我们的sql语句直接写在@Insert注解即可
		@Insert("INSERT INTO mybatis_monster_ (age,birthday,email,gender,name,salary) "
				+ "VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})")
		public void addMonster(Monster monster);
		//根据id删除一个Monster
		@Delete("DELETE FROM mybatis_monster_  "
				+ "WHERE monster_id=#{monster_id}")
		public void	delMonster(Integer monster_id);
		//修改Monster
		@Update("UPDATE mybatis_monster_ SET age=#{age}, birthday=#{birthday}, "
				+ "email = #{email},gender= #{gender}, "
				+ "name=#{name}, salary=#{salary} "
				+ "WHERE monster_id=#{monster_id}")
		public void updateMonster(Monster monster);
		//查询-根据id
		@Select("SELECT * FROM mybatis_monster_ WHERE "
				+ "monster_id = #{monster_id}")
		public Monster getMonsterById(Integer monster_id);
		//查询所有的Monster
		@Select("SELECT * FROM mybatis_monster_ ")
		public List<Monster> findAllMonster();
}

XML 配置式映射

mybatis-config.xml
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>
	<!-- 这里就是引入jdbc.properties文件 -->
	
	<properties resource="jdbc.properties"></properties>
	<typeAliases>
		<!-- 如果一个包下有很多的类,我们可以直接给包取别名,这样
			该包下面的所有类名,就可以直接使用
		 -->
		 <package name="com.atguigu.mybatis.entity"/>
		
		<!-- <typeAlias type="com.itbull.mybatis.entity.Monster" 
		  alias="Monster"/> -->
	</typeAliases>
	
	<environments default="development">

		<!-- 配置我们mybatis的环境 -->
		<environment id="development">
			
			<!-- mybatis使用事务管理器是jdbc直连方式 -->
			<transactionManager type="JDBC" />
			<!-- 配置我们的数据源  -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.user}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 这里会引入(注册)我们的 Mapper.xml文件 -->
		<!-- <mapper resource="com/itbull/mybatis/mapper/MonsterMapper.xml"/> -->
		<!-- 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册
			将下面的所有xml文件和注解接口 都进行注册
		 -->
		<package name="com.atguigu.mybatis.mapper"/>
	
		<!-- 如果我们有直接通过注解来实现的接口,可以这样注册到mybatsi框架中 -->
<!--		 <mapper class="com.atguigu.mybatis.mapper.MonsterAnnotation"/> -->
		
	</mappers>
</configuration>
jdbc.properies
properties 复制代码
jdbc.user=root
jdbc.password=1234
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.driver=com.mysql.cj.jdbc.Driver
mapper.java
java 复制代码
package com.atguigu.mybatis.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.entity.Monster2;



public interface MonsterMapper {

	//添加方法
	void addMonster(Monster monster);
	
	//根据id删除一个Monster
	void	delMonster(Integer monster_id);
	
	//修改Monster
	void updateMonster(Monster monster);
	//查询-根据id
	Monster getMonsterById(Integer monster_id);
	//查询所有的Monster
	List<Monster> findAllMonster();
	
	//通过id 或者名字查询
	List<Monster> findMonsterByNameORId(Monster monster);
	
	//查询名字中含义'牛魔王'妖怪
	List<Monster> findMonsterByName(String name);
	
	//查询 id > 10 并且 salary 大于 40, 要求传入的参数是HashMap
	List<Monster> findMonsterByIdAndSalary_PrameterHashMap(Map<String,Object> map);
	
	//查询 id > 10 并且 salary 大于 40, 要求传入的参数是HashMap
	List<Map<String,Object>> findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String,Object> map);
	
	//根据age查询结果
	List<Monster>  findMonsterByAge(@Param("age") Integer age);
	
	//根据id和名字来查询结果
	List<Monster> findMonsterByIdAndName(Monster monster);
	
	
}

package com.atguigu.mybatis.mapper;

import java.util.List;

import com.atguigu.mybatis.entity.Monster2;



public interface MonsterMapper2 {

	//添加方法
	public void addMonster(Monster2 monster);
	
	//查询所有的Monster
	public List<Monster2> findAllMonster();
	

}
mapper.xml
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:表示一个映射器
	1. namespace="com.atguigu.mybatis.mapper.MonsterMapper"
		说明本mapper.xml文件是用来 映射管理 MonsterMapper接口
		,主要是去实现MonsterMapper接口声明方法
	2. select: 实现一个查询操作  insert:表示一个添加操作
	3. id="addMonster" 表示 MonsterMapper接口 的方法名
	4. resultType="xx" 返回的结果类型,如果没有就不需要写
	5. parameterType="com.atguigu.mybatis.entity.Monster" 表示该方法输入的参数类型
	6. (age,birthday,email,gender,name,salary) 表的字段名
	7. #{age},#{birthday},#{email},#{gender},#{name},#{salary} 是实体类Monster的属性名
  -->
<mapper namespace="com.atguigu.mybatis.mapper.MonsterMapper">
	<!-- 配置我们的添加方法,获取到刚刚加入的monster对象的id 
		1. useGeneratedKeys="true" 表示要返回刚刚添加的对象的主键值
		2. keyProperty="monster_id" 表示返回的刚刚添加的对象的主键值,set到monster_id 属性
	-->
	<insert id="addMonster" parameterType="Monster"
		useGeneratedKeys="true" keyProperty="monster_id"
	>
		INSERT INTO mybatis_monster_ (age,birthday,email,gender,name,salary) 
		VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})
	</insert>
	<!-- 实现delMonster方法 
		注意 parameterType="Integer" 如果是Java本身的数据类型直接写类名即可
	-->
	<delete id="delMonster" parameterType="Integer">
		DELETE FROM mybatis_monster_  
		WHERE monster_id=#{monster_id}
	</delete>
	
	<!-- 实现updateMonster方法 -->
	<update id="updateMonster" parameterType="Monster">
		UPDATE mybatis_monster_ SET age=#{age}, birthday=#{birthday}, email = #{email},
		gender= #{gender}, name=#{name}, salary=#{salary} WHERE monster_id=#{monster_id}
	</update>
	
	<!-- 实现getMonsterById方法 -->
	<select id="getMonsterById" parameterType="Integer" 
		resultType="Monster">
		SELECT * FROM mybatis_monster_ 
		WHERE monster_id = #{monster_id}
	</select>
	
	<!-- 实现findAllMonster -->
	<select id="findAllMonster" 
		resultType="Monster">
		SELECT * FROM mybatis_monster_ 
	</select>
	
	<!-- 实现findMonsterByNameORId -->
	<select id="findMonsterByNameORId" parameterType="Monster" 
		resultType="Monster">
		SELECT  * FROM mybatis_monster_ 
		WHERE monster_id=#{monster_id} OR name=#{name}
	</select>
	
	<!-- 看看模糊查询的使用 取值 需要 ${value} 取值-->
	<select id="findMonsterByName" 
		parameterType="String" resultType="Monster">
		SELECT  * FROM mybatis_monster_ 
		WHERE name LIKE '%${value}%'
	</select>
	
	<!-- 实现findMonsterByIdAndSalary_PrameterHashMap -->
	<select id="findMonsterByIdAndSalary_PrameterHashMap" 
		parameterType="map" resultType="Monster">
		SELECT * FROM mybatis_monster_ 
		WHERE monster_id > #{monster_id} AND salary > #{salary}
	</select>
	
	<!-- 实现findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap
		传入的参数和返回的参数都是HashMap
	 -->
	 <select id="findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap" parameterType="map"
	 	resultType="map"
	 >
	 	SELECT monster_id,name FROM mybatis_monster_ 
		WHERE monster_id > #{monster_id} AND salary > #{salary}
	 </select>
	
	<!-- 实现findMonsterByAge -->
	<select id="findMonsterByAge" resultType="Monster" 
		parameterType="Integer">
		SELECT * FROM mybatis_monster_  WHERE 1=1
		<if test="age > 0">
			AND age > #{age}
		</if>
	</select>
	
	<!-- 实现 findMonsterByIdAndName 【where 和 if】 -->
	<select id="findMonsterByIdAndName" parameterType="Monster" resultType="Monster">
		SELECT * FROM mybatis_monster_ 
		<!-- 使用where标签开始拼接 
			where 标签的好处是1. 会自动的加入where子句.
			mybatis会自动的去掉多余的AND
		-->
		<where>
			<if test="monster_id > 0">
				AND monster_id > #{monster_id}
			</if>
			<if test="name != null and name != ''">
				AND name = #{name}
			</if>
		</where>
	</select>
	
</mapper>
<?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.atguigu.mybatis.mapper.MonsterMapper2">
	<!-- 实现 addMonster -->
	<insert id="addMonster" parameterType="monster2">
		INSERT INTO mybatis_monster2 (user_name,user_email) VALUES(#{username}, #{useremail})
	</insert>
	<!-- 实现 findAllMonster【使用别名 屏蔽属性名和字段名不一致 1.可以用,但是复用性不ok 2. 】 -->
	<!-- <select id="findAllMonster" resultType="Monster2">
		SELECT monster_id,user_name AS username, user_email AS useremail FROM mybatis_monster2
	</select> -->
	<!-- 实现 findAllMonster【resultmap 屏蔽属性名和字段名不一致 1.复用性好,高大上  】 -->
	<!-- 
		1. resultMap 表示我们定义一个结果映射
		2. type="Monster2" 返回的真正的数据类型还是 Monster2对象
		3. id="findAllMonsterMap", 给 resultMap  取名
		4. column="user_name"  表中的字段
		5. property="username" 表示对象的属性
	 -->
	<resultMap type="Monster2" id="findAllMonsterMap">
		<result column="user_name" property="username"/>
		<result column="user_email" property="useremail"/>
	</resultMap>
	<select id="findAllMonster" resultMap="findAllMonsterMap" >
		SELECT * FROM mybatis_monster2
	</select>
</mapper>

日志

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!--使用 ConsoleAppender 来输出日志,到eclipse的控制台-->
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<!--输出的编码是utf-8-->
		<param name="Encoding" value="UTF-8" />
		<!--输入日志的布局格式 -->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
		</layout>
	</appender>
	<!--日志记录 java.sql 包下的类产生的debug级别的错误信息-->
	<logger name="java.sql">
		<level value="debug" />
	</logger>
	<!--日志记录 org.apache.ibatis 包下的类产生的debug级别的错误信息-->
	<logger name="org.apache.ibatis">
		<level value="debug" />
	</logger>
	<!--从根开始就使用这样的配置,直接饮用 STDOUT-->
	<root>
		<level value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

测试

java 复制代码
package com.atguigu.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.mapper.MonsterAnnotation;

public class Bridge {

	public static void main(String[] args) {
		// 1. 加载 MyBatis 配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			
			// 2. 创建 SqlSessionFactory
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			// 3. 获取 SqlSession
			SqlSession sqlSession = sqlSessionFactory.openSession();
			
			// 4. 获取 Mapper 接口
			MonsterAnnotation monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);
			
			// 5. 调用方法查询所有 Monster
			List<Monster> monsters = monsterAnnotation.findAllMonster();
			
			// 6. 输出结果
			System.out.println("查询到的 Monster 数量: " + monsters.size());
			for (Monster monster : monsters) {
				System.out.println(monster);
			}
			
			// 7. 关闭资源
			sqlSession.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
package com.atguigu.mybatis.test;

import com.atguigu.mybatis.entity.Monster;
import com.atguigu.mybatis.entity.Monster2;
import com.atguigu.mybatis.mapper.MonsterMapper2;
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;
import java.util.List;

public class Facade {

	public static void main(String[] args) {
		// 1. 加载 MyBatis 配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);

			// 2. 创建 SqlSessionFactory
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

			// 3. 获取 SqlSession
			SqlSession sqlSession = sqlSessionFactory.openSession();

			// 4. 获取 Mapper 接口
			MonsterMapper2 monsterAnnotation = sqlSession.getMapper(MonsterMapper2.class);

			// 5. 调用方法查询所有 Monster
			List<Monster2> monsters = monsterAnnotation.findAllMonster();

			// 6. 输出结果
			System.out.println("查询到的 Monster 数量: " + monsters.size());
			for (Monster2 monster : monsters) {
				System.out.println(monster);
			}

			// 7. 关闭资源
			sqlSession.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
相关推荐
昵称为空C6 小时前
SpringBoot 实现DataSource接口实现多租户数据源切换方案
后端·mybatis
isyangli_blog8 小时前
(2-10-1)MyBatis的基础与基本使用
java·开发语言·mybatis
期待のcode13 小时前
Maven
java·spring·maven·mybatis
独泪了无痕20 小时前
一文搞懂MyBatis中的TypeHandler
数据库·后端·mybatis
Easocen1 天前
Mybatis学习笔记(十)
mybatis
千睢1 天前
Mybatis实现页面增删改查
mybatis
Warren982 天前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo
羊锦磊2 天前
[ Mybatis 多表关联查询 ] resultMap
java·开发语言·数据库·mysql·mybatis
Warren982 天前
Java Record 类 — 简化不可变对象的写法
java·开发语言·jvm·分布式·算法·mybatis·dubbo