MyBatis——入门及第一个小程序

    科技2025-10-06  6

    MyBatis 简介

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,是一个基于Java的持久化框架。

    持久化: 可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏,在断电或者其他情况下,重新开启系统仍然可以读取到这些数据。

    优点:

    简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。提供映射标签,支持对象与数据库的orm字段关系映射提供对象关系映射标签,支持对象关系组建维护提供xml标签,支持编写动态sql。

    缺点:

    编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。二级缓存机制不佳

    Mybatis官方文档: https://mybatis.org/mybatis-3/zh/getting-started.html

    Github地址:https://github.com/mybatis/mybatis-3

    MYbatis快速入门

    一、IDEA新建maven工程mybatis_1,pom文件中添加相关依赖包:

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>

    DEA 默认是不支持 MyBatis 开发的,需要自己下载第三方插件来支持,自己学习的话free mybatis plugin即可。

    注意:需要重启IDEA

    二、数据准备工作

    创建一个数据库test_w,编码方式设置为 UTF-8,然后再创建一个名为user的表,插入几行数据:

    drop database if exists test_w; create database test_w default CHARACTER set utf8; use test_w; create table user ( id int auto_increment primary key, username varchar(20) not null, password varchar(20) not null ); insert into user values(1,'wanwei','1234'); insert into user values(2,'wanwei2','1234'); insert into user values(3,'wanwei3','1234'); insert into user values(4,'wanwei4','1234'); commit;

    三、创建user实体类

    package com.ftj.dao; public class User { private int id; private String username; private String password; public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public User() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + "'" + ", password='" + password + "'" + "}"; } }

    四、配置文件 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> <!-- 别名 --> <typeAliases> <package name="com.ftj.dao"/> </typeAliases> <!-- 数据库环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test_w?serverTimezone=UTC&amp;characterEncoding=utf-8&amp;useSSL=false"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="User.xml"/> </mappers> </configuration>

    六、配置文件 User.xml

    编写一个mybatis的工具类(可以查看中文文档来创建:目的就是读取配置文件,用SqlSessionFactory(工厂模式)来创建SessionFactory,这里可以用静态代码块来加载配置文件 )

    package com.ftj.utils; 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; public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis第一步:获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } //有了SqlSessionFactory,我们就可以获取SqlSession的实例了 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }

    七、配置文件 User.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.ftj.dao"> <select id="getUserList" resultType="User"> select * from user </select> <select id="findUserById" resultType="User"> select * from user where id = #{id} </select> <delete id="deleteUser"> delete from user where id =#{id} </delete> <update id="updateUser"> update user set username=#{username},password=#{password} where id =#{id} </update> <insert id="insertUSer" > insert into user(id,username,password) values(#{id},#{username},#{password}) <selectKey resultType="int" keyProperty="id" order="AFTER"> select last_insert_id(); </selectKey> </insert> </mapper>

    八、编写测试类

    package com.ftj.dao; import com.ftj.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.io.IOException; import java.util.List; public class UserDaoTest { @Test public void selectAllTest() throws IOException { //获取SqlSession对象 // SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式1:getMapper 执行SQL //UserDao userDao = sqlSession.getMapper(UserDao.class);//反射 //List<User> userList = userDao.getUserList(); //方式2: // 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory // String resource = "mybatis-config.xml"; // InputStream inputStream = Resources.getResourceAsStream(resource); // SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 然后根据 sqlSessionFactory 得到 session SqlSession session = MybatisUtils.getSqlSession(); // 最后通过 session 的 selectList() 方法调用 sql 语句 listStudent List<User> userList = session.selectList("getUserList"); //delete for (User user : userList) { System.out.println(user); } //关闭SqlSession session.close(); } @Test public void insertTest() { SqlSession session = MybatisUtils.getSqlSession(); User user = new User(); // user.setId(5); user.setUsername("zhangsan"); user.setPassword("Huawei1234"); session.insert("insertUSer", user); session.commit(); session.close(); } @Test public void deleteTest() { SqlSession session = MybatisUtils.getSqlSession(); session.delete("deleteUser",5); session.commit(); session.close(); } @Test public void findUserById(){ SqlSession session = MybatisUtils.getSqlSession(); List<User> userlist = session.selectList("findUserById", 6); for(User user : userlist){ System.out.println(user); } session.close(); } }

    遇到的问题

    1、可能会遇到的问题就是:maven造成的 .xml文件导出问题(在target目录中没法找到这份文件,从而导致缺少映射的关系,报错,解决办法:就是在pom.xml中增加下面的代码:)

    <!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>

    2、 java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized

    mybatis-config.xml中数据库连接url没有指定时区

    <property name="url" value="jdbc:mysql://localhost:3306/test_w?serverTimezone=UTC&amp;characterEncoding=utf-8&amp;useSSL=false"/>
    Processed: 0.017, SQL: 8