赞
踩
MyBatis 中文手册:
(1)https://mybatis.org/mybatis-3/zh/index.html
(2)https://mybatis.net.cn/
Maven 仓库:
https://mvnrepository.com/
仓库作用:需要什么 jar 包,搜索得到对应的 maven dependency
传统的 Java 程序操作 DB 分析-工作示意图
(1)MyBatis 是一个持久层框架
(2)前身是 ibatis, 在 ibatis3.x 时,更名为 MyBatis
(3)MyBatis 在 java 和 sql 之间提供更灵活的映射方案
(4)mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦
(5)mybatis 通过 SQL 操作 DB, 建库建表的工作需要程序员完成
要求: 开发一个 MyBatis 项目,通过 MyBatis 的方式可以完成对 monster 表的 crud 操作
- CREATE DATABASE `mybatis`;
- use `mybatis`;
- CREATE TABLE `monster` (
- `id` INT NOT NULL AUTO_INCREMENT,
- `age` INT NOT NULL,
- `birthday` DATE DEFAULT NULL,
- `email` VARCHAR(255) NOT NULL ,
- `gender` TINYINT NOT NULL,
- `name` VARCHAR(255) NOT NULL,
- `salary` DOUBLE NOT NULL,
- PRIMARY KEY (`id`)
- ) CHARSET=utf8
(2)创建 maven 项目, 方便项目需要 jar 包管理
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <!--
- 1. 将mybatis作为父项目管理多个子模块/子项目
- 2. 父项目的完整的坐标 groupId[组织名]+artifactId[项目名]
- 3. 后面该父项目会管理多个子模块/子项目 , 将来父项目中的引入的依赖可以直接给子项目用
- , 这样开发简单,提高复用性,也便于管理
- 4. <packaging>pom</packaging> 表示父项目以多个子模块/子项目管理工程
-
- -->
- <groupId>org.example</groupId>
- <artifactId>mybatis</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>pom</packaging>
- <!--
- modules指定管理的哪些子模块
- -->
- <modules>
- <module>mybatis_quickstart</module>
- </modules>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-
- <!--加入依赖-->
- <dependencies>
- <!--mysql依赖-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.49</version>
- </dependency>
- <!--mybatis依赖-->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.7</version>
- </dependency>
- <!--junit依赖-->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <!--如果这里有一个scope-test 表示该jar的作用范围在test目录 -->
- <!--<scope>test</scope>-->
- </dependency>
- </dependencies>
-
- <!--在build中配置resources,来防止我们资源导出失败的问题
- 1. 不同的idea/maven 可能提示的错误不一样
- 2. 不变应万变,少什么文件,就增加相应配置即可
- 3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录
- 的资源文件 xml 和 properties在build项目时,导出到对应的target目录下
- -->
- <build>
- <resources>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.xml</include>
- <include>**/*.properties</include>
- </includes>
- </resource>
- </resources>
- </build>
-
- </project>

(3)创建子项目mybatis_quickstart
(4)子模块自动生成的pom文件如下
(5)父项目自动对pom增加的内容如下
(6)在java目录下创建 com.entity.Monster.java
- package com.entity;
-
- import java.util.Date;
-
- /**
- * Monster 和 monster表有对应关系
- */
- //1. 一个普通的Pojo类
- //2. 使用原生态的sql语句查询结果还是要封装成对象
- //3. 这里的实体类属性名和表名字段保持一致。
- public class Monster {
- //属性-和表字段有对应关系
- private Integer id;
- private Integer age;
- private String name;
- private String email;
- private Date birthday;
- private double salary;
- private Integer gender;
-
- public Monster() {
- }
-
- public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {
- this.id = id;
- this.age = age;
- this.name = name;
- this.email = email;
- this.birthday = birthday;
- this.salary = salary;
- this.gender = gender;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public Date getBirthday() {
- return birthday;
- }
-
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
-
- public double getSalary() {
- return salary;
- }
-
- public void setSalary(double salary) {
- this.salary = salary;
- }
-
- public Integer getGender() {
- return gender;
- }
-
- public void setGender(Integer gender) {
- this.gender = gender;
- }
-
- @Override
- public String toString() {
- return "Monster{" +
- "id=" + id +
- ", age=" + age +
- ", name='" + name + '\'' +
- ", email='" + email + '\'' +
- ", birthday=" + birthday +
- ", salary=" + salary +
- ", gender=" + gender +
- '}';
- }
- }

(7)在com包下创建一个mapper包,再在mapper包下创建一个接口 MonsterMapper
- package com.mapper;
-
- import com.entity.Monster;
-
- import java.util.List;
-
- /**
- * 1. 这是一个接口
- * 2. 该接口用于声明操作monster表的方法
- * 3. 这些方法可以通过注解或者xml文件来实现
- */
- public interface MonsterMapper {
-
- //添加monster
- public void addMonster(Monster monster);
-
- //根据id删除一个Monster
- public void delMonster(Integer id);
-
- //修改Monster
- public void updateMonster(Monster monster);
-
- //查询-根据id
- public Monster getMonsterById(Integer id);
-
- //查询所有的Monster
- public List<Monster> findAllMonster();
- }

(8)在mapper包创建xml文件 MonsterMapper.xml
(9)配置 MonsterMapper.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">
-
- <!--
- 1. 这是一个mapper xml 文件
- 2. 该文件可以去实现对应的接口的方法
- 3. namespace 指定该xml文件和哪个接口对应!!!
- -->
- <mapper namespace="com.mapper.MonsterMapper">
- <!--配置addMonster
- 1. id="addMonster" 就是接口的方法名
- 2. parameterType="com.entity.Monster" 放入的形参的类型
- 3. 注意"com.entity.Monster" 可以简写为 "Monster"
- 4. 写入sql语句
- 5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段
- 6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
- 7. 这里 #{age} age 对应monster对象的属性名,其它一样
- -->
- <insert id="addMonster" parameterType="com.entity.Monster" useGeneratedKeys="true" keyProperty="id">
- INSERT INTO `monster`
- (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
- VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
- </insert>
-
- <!--配置/实现delMonster方法
- 1. 这里 java.lang.Integer 这是Java类型, 可以简写成 Integer
- 2. 这里写入delete
- -->
- <delete id="delMonster" parameterType="Integer">
- DELETE FROM `monster` WHERE id = #{id}
- </delete>
-
- <!--配置实现 updateMonster-->
- <update id="updateMonster" parameterType="com.entity.Monster">
- UPDATE `monster`
- SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},
- `gender` = #{gender} , `name`= #{name}, `salary` = #{salary}
- WHERE id = #{id}
- </update>
-
- <!--配置/实现getMonsterById-->
- <select id="getMonsterById" resultType="com.entity.Monster">
- SELECT * FROM `monster` WHERE id = #{id}
- </select>
-
- <!--配置/实现findAllMonster-->
- <select id="findAllMonster" resultType="com.entity.Monster">
- SELECT * FROM `monster`
- </select>
- </mapper>

(10)创建并配置 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>
-
- <!--配置MyBatis自带的日志输出-查看原生的sql-->
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
-
- <!--配置别名-->
- <typeAliases>
- <typeAlias type="com.entity.Monster" alias="Monster"/>
- </typeAliases>
-
- <environments default="development">
- <environment id="development">
- <!--配置事务管理器-->
- <transactionManager type="JDBC"/>
- <!--配置数据源-->
- <dataSource type="POOLED">
- <!--配置驱动-->
- <property name="driver" value="com.mysql.jdbc.Driver"/>
- <!--配置连接mysql-url
- 1. jdbc:mysql 协议
- 2. 127.0.0.1:3306 : 指定连接mysql的ip+port
- 3. mybatis: 连接的DB
- 4. useSSL=true 表示使用安全连接
- 5. & 表示 & 防止解析错误
- 6. useUnicode=true : 使用unicode 作用是防止编码错误
- 7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
- 8. 老韩温馨提示:不要背,直接使用即可
- -->
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
- <property name="username" value="root"/>
- <property name="password" value="123456"/>
- </dataSource>
- </environment>
- </environments>
- <!--
- 1. 这里我们配置需要关联的Mapper.xml
- 2. 这里我们可以通过菜单 Path from source root
- -->
- <mappers>
- <mapper resource="com/mapper/MonsterMapper.xml"/>
- </mappers>
- </configuration>

(11)创建 resources/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>
-
- <!--配置MyBatis自带的日志输出-查看原生的sql-->
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
-
- <!--配置别名-->
- <typeAliases>
- <!--配置好别名之后,MonsterMapper.xml 文件中的 "com.entity.Monster" 就可以简写成 "Monster"-->
- <typeAlias type="com.entity.Monster" alias="Monster"/>
- </typeAliases>
-
- <environments default="development">
- <environment id="development">
- <!--配置事务管理器-->
- <transactionManager type="JDBC"/>
- <!--配置数据源-->
- <dataSource type="POOLED">
- <!--配置驱动-->
- <property name="driver" value="com.mysql.jdbc.Driver"/>
- <!--配置连接mysql-url
- 1. jdbc:mysql 协议
- 2. 127.0.0.1:3306 : 指定连接mysql的ip+port
- 3. mybatis: 连接的DB
- 4. useSSL=true 表示使用安全连接
- 5. & 表示 & 防止解析错误
- 6. useUnicode=true : 使用unicode 作用是防止编码错误
- 7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
- -->
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"/>
- <property name="username" value="root"/>
- <property name="password" value="123456"/>
- </dataSource>
- </environment>
- </environments>
- <!--
- 1. 这里我们配置需要关联的Mapper.xml
- 2. 这里我们可以通过菜单 Path from source root
- -->
- <mappers>
- <mapper resource="com/mapper/MonsterMapper.xml"/>
- </mappers>
- </configuration>

(12)创建工具类 util.MyBatisUtils.java
- package com.util;
-
- 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;
-
- /**
- * MyBatisUtils 工具类,可以得到SqlSession
- */
- public class MyBatisUtils {
-
- //属性
- private static SqlSessionFactory sqlSessionFactory;
-
- //编写静态代码块-初始化sqlSessionFactory
- static {
- try {
- //指定资源文件, 配置文件mybatis-config.xml
- String resource = "mybatis-config.xml";
- //获取到配置文件mybatis-config.xml 对应的inputStream
- //说明:加载文件时,默认到resources目录=>运行后的工作目录target-classes
- InputStream resourceAsStream = Resources.getResourceAsStream(resource);
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
- System.out.println("sqlSessionFactory="
- + sqlSessionFactory.getClass());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- //编写方法,返回SqlSession对象-会话
- public static SqlSession getSqlSession() {
- return sqlSessionFactory.openSession();
- }
- }

(13)创建 src\test\java\com\mapper\MonsterMapperTest.java
- package com.mapper;
-
- import com.entity.Monster;
- import com.util.MyBatisUtils;
- import org.apache.ibatis.session.SqlSession;
- import org.junit.Before;
- import org.junit.Test;
-
- import java.util.Date;
- import java.util.List;
-
- public class MonsterMapperTest {
- //属性
- private SqlSession sqlSession;
- private MonsterMapper monsterMapper;
-
- /**
- * 1. 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法
- * 2. 这里在测试的时候,可能小伙伴们会遇到一些麻烦,老师说了解决方案
- */
- //编写方法完成初始化
- @Before
- public void init() {
- //获取到sqlSession
- sqlSession = MyBatisUtils.getSqlSession();
- //获取到到MonsterMapper对象 class com.sun.proxy.$Proxy7 代理对象
- //, 底层是使用了动态代理机制
- monsterMapper = sqlSession.getMapper(MonsterMapper.class);
- System.out.println("monsterMapper=" + monsterMapper.getClass());
-
- }
-
- @Test
- public void addMonster() {
-
- for (int i = 0; i < 2; i++) {
- Monster monster = new Monster();
- monster.setAge(10 + i);
- monster.setBirthday(new Date());
- monster.setEmail("kate@qq.com");
- monster.setGender(1);
- monster.setName("大象精-" + i);
- monster.setSalary(1000 + i * 10);
- monsterMapper.addMonster(monster);
-
- System.out.println("添加对象--" + monster);
- System.out.println("添加到表中后, 自增长的id=" + monster.getId());
- }
-
- //如果是增删改, 需要提交事务
- if(sqlSession != null) {
- sqlSession.commit();
- sqlSession.close();
- }
-
- System.out.println("保存成功...");
-
- }
-
- @Test
- public void delMonster() {
-
- monsterMapper.delMonster(2);
-
- if(sqlSession != null) {
- sqlSession.commit();
- sqlSession.close();
- }
-
- System.out.println("删除成功...");
-
- }
-
- @Test
- public void updateMonster() {
-
- Monster monster = new Monster();
- monster.setAge(50);
- monster.setBirthday(new Date());
- monster.setEmail("king3@qq.com");
- monster.setGender(0);
- monster.setName("老鼠精-01");
- monster.setSalary(2000);
- monster.setId(3);
-
- monsterMapper.updateMonster(monster);
-
- if(sqlSession != null) {
- sqlSession.commit();
- sqlSession.close();
- }
-
- System.out.println("修改成功...");
-
- }
-
- @Test
- public void getMonsterById() {
-
- Monster monster = monsterMapper.getMonsterById(3);
- System.out.println("monster=" + monster);
-
- if(sqlSession != null) {
- sqlSession.close();
- }
- System.out.println("查询成功~");
- }
-
-
- @Test
- public void findAllMonster() {
-
- List<Monster> monsters = monsterMapper.findAllMonster();
- for (Monster monster : monsters) {
- System.out.println("monster-" + monster);
- }
- if(sqlSession != null) {
- sqlSession.close();
- }
- System.out.println("查询成功~");
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。