项目结构
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核心功能
- MyBatis 框架入门 :展示如何配置和使用 MyBatis 进行数据库操作
- 多种映射方式 :
- 注解式映射:通过
MonsterAnnotation.java
演示 - XML 配置式映射:通过
MonsterMapper.xml
和 MonsterMapper2.xml
演示
- 数据库操作 :实现了基本的 CRUD (创建、读取、更新、删除) 操作
- 高级查询 :展示了多种查询方式
- 条件查询
- 模糊查询
- HashMap 参数查询
- 动态 SQL 查询
- 结果映射 :演示了如何使用 resultMap 解决表字段名与实体类属性名不一致的问题
项目结构
- 实体类 :
Monster.java
和 Monster2.java
表示数据库表对应的 Java 对象 - 映射器接口 :定义了数据库操作的方法
- 配置文件 :
mybatis-config.xml
:MyBatis 核心配置文件jdbc.properties
:数据库连接配置log4j.xml
:日志配置
- 测试类 :
Bridge.java
和 Facade.java
用于测试 MyBatis 功能
演示目的
- 展示 MyBatis 如何简化数据库操作
- 对比不同的映射方式 (注解 vs XML)
- 演示 MyBatis 的高级特性 (动态 SQL、结果映射等)
- 提供一个可运行的 MyBatis 入门示例
如何运行
- 确保已创建数据库表 (mybatis_monster_ 和 mybatis_monster2)
- 配置正确的数据库连接信息 (在 jdbc.properties 中)
- 运行 Bridge.java 或 Facade.java 中的 main 方法
这个项目是学习 MyBatis 的良好入门示例,涵盖了框架的核心概念和常用功能。
表结构
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);
实体类
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;
}
public class Monster2 {private Integer monster_id;private String username;private String useremail;
}
注解式映射
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 {@Insert("INSERT INTO mybatis_monster_ (age,birthday,email,gender,name,salary) "+ "VALUES(#{age},#{birthday},#{email},#{gender},#{name},#{salary})")public void addMonster(Monster monster);@Delete("DELETE FROM mybatis_monster_ "+ "WHERE monster_id=#{monster_id}")public void delMonster(Integer monster_id);@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);@Select("SELECT * FROM mybatis_monster_ WHERE "+ "monster_id = #{monster_id}")public Monster getMonsterById(Integer monster_id);@Select("SELECT * FROM mybatis_monster_ ")public List<Monster> findAllMonster();
}
XML 配置式映射
mybatis-config.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><properties resource="jdbc.properties"></properties><typeAliases><package name="com.atguigu.mybatis.entity"/></typeAliases><environments default="development"><environment id="development"><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><package name="com.atguigu.mybatis.mapper"/>
</mappers>
</configuration>
jdbc.properies
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
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);void delMonster(Integer monster_id);void updateMonster(Monster monster);Monster getMonsterById(Integer monster_id);List<Monster> findAllMonster();List<Monster> findMonsterByNameORId(Monster monster);List<Monster> findMonsterByName(String name);List<Monster> findMonsterByIdAndSalary_PrameterHashMap(Map<String,Object> map);List<Map<String,Object>> findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String,Object> map);List<Monster> findMonsterByAge(@Param("age") Integer age);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);public List<Monster2> findAllMonster();}
mapper.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.atguigu.mybatis.mapper.MonsterMapper"><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><delete id="delMonster" parameterType="Integer">DELETE FROM mybatis_monster_ WHERE monster_id=#{monster_id}</delete><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><select id="getMonsterById" parameterType="Integer" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE monster_id = #{monster_id}</select><select id="findAllMonster" resultType="Monster">SELECT * FROM mybatis_monster_ </select><select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE monster_id=#{monster_id} OR name=#{name}</select><select id="findMonsterByName" parameterType="String" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE name LIKE '%${value}%'</select><select id="findMonsterByIdAndSalary_PrameterHashMap" parameterType="map" resultType="Monster">SELECT * FROM mybatis_monster_ WHERE monster_id > #{monster_id} AND salary > #{salary}</select><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><select id="findMonsterByAge" resultType="Monster" parameterType="Integer">SELECT * FROM mybatis_monster_ WHERE 1=1<if test="age > 0">AND age > #{age}</if></select><select id="findMonsterByIdAndName" parameterType="Monster" resultType="Monster">SELECT * FROM mybatis_monster_ <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"><insert id="addMonster" parameterType="monster2">INSERT INTO mybatis_monster2 (user_name,user_email) VALUES(#{username}, #{useremail})</insert><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 version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><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><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="debug" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>
测试
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) {String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();MonsterAnnotation monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);List<Monster> monsters = monsterAnnotation.findAllMonster();System.out.println("查询到的 Monster 数量: " + monsters.size());for (Monster monster : monsters) {System.out.println(monster);}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) {String resource = "mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();MonsterMapper2 monsterAnnotation = sqlSession.getMapper(MonsterMapper2.class);List<Monster2> monsters = monsterAnnotation.findAllMonster();System.out.println("查询到的 Monster 数量: " + monsters.size());for (Monster2 monster : monsters) {System.out.println(monster);}sqlSession.close();} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}