1. 简介
1.1 为什么使用Mybatis
java服务器需要与数据库操作,java传统的数据库操作通过JDBC实现。JDBC提供了java与数据库连接及操作的接口,但与数据库交互时需要==编写JDBC文件==,同时SQL语句也会出现在java中,导致==java与SQL的耦合==,为了解决这两个问题,引入了Mybatis解决java JDBC实现数据库操作带来的问题。
1.2 什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- <font color="red">持久层框架</font>;
- 支持自定义SQL、存储过程和高级映射;
- 免除JDBC代码,设置参数及获取结果集的工作;
- <font color="red">XML</font>或<font color="red">注解</font>进行配置;
1.3 持久层
易失性存储:指存储在内存中,数据随着系统掉电会丢失,为非持久化数据。
持久化:对应于“易失性存储”,将易失性存储的数据转变为持久状态。
为什么持久化:有些数据需要长久保存,不能断电即失。
持久化的方式:数据库;IO文件;...
持久层:处理持久化过程的代码块,实现持久化数据与内存数据的相互转化。
1.4 Mybatis的特点
Mybatis的作用:==帮助程序操作数据库。==
Mybatis的特点:
- sql与代码的分离,提高可维护性;
- 提供映射标签,支持对象与数据库的orm字段关系映射;
- 提供对象关系映射标签,支持对象关系组建维护;
- 提供xml标签,支持编写动态sql。
1.5 如何学习Mybatis
maven仓库中查找Mybatis依赖包: https://mvnrepository.com/
Mybatis文档:https://mybatis.org/mybatis-3/zh/index.html
2. Mybatis环境搭建与第一个Mybaits程序(基于Maven)
2.1 环境搭建
基于Maven项目中使用Mybatis,只需要在.pom文件中引入Mybatis对应的包即可。
<dependencies>
<!--java的Mysql包,用于连接Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--junit依赖,用于测试,可以使用@Tset注解实现模块的测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.2 第一个Mybatis程序
一个Mybatis程序构建完成后的示例结构如下图。
其具体构建步骤如下:
准备数据库;
-
新建一个maven项目,并在项目的main目录下的resource文件夹中新建mybatis-config.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> <!--default通过id选择对应的environment,即可支持不止一种环境,如dev/pub/test环境等--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- manager默认选择JDBC --> <dataSource type="POOLED"> <!-- 数据源,即需要连接的数据库--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 数据库驱动 --> <!-- url,服务器地址+数据库名称+配置参数(useSSL(安全验证登录), useUnicode(UTF统一编码), characterCoding=UTF-8(UTF-8编码,用于识别中文字符),有时还需要设置时区) --> <property name="url" value="jdbc:mysql://【你的服务器地址】/【你的数据库名】?useSSL=false&useUnicode=true&characterCoding=UTF-8"/> <property name="username" value="[yourusername]"/> <!-- 数据库用户名 --> <property name="password" value="[yourpasswrod]"/> <!-- 数据库密码 --> </dataSource> </environment> </environments> <!-- 项目中配置的Mapper对应的xml文件 --> <mappers> <mapper resource="com/hy/dao/UserMapper.xml" /> </mappers> </configuration>
-
构建Mybatis工具类:在utils文件夹中新建MybatisUtil.java工具类,用于读取xml构建sqlSession实例,作为程序与数据库的连接。
//文件名:MybatisUtils.java public class MybatisUtils { //新建静态sqlSessionFactory对象,该对象只需要在项目初始化时生成一次; private static SqlSessionFactory sqlSessionFactory; static { try { //定义xml文件地址,默认地址在resources文件夹中; String resource = "mybatis-config.xml"; InputStream inputStream = null; //对过inputSteam流解析xml中的数据库及项目信息; inputStream = Resources.getResourceAsStream(resource); //sqlSessionFactory对象由sqlSessionFactoryBuilder对象的build方法实例化; sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //定义一个getSqlSession方法来构建一个sqlSession实例,通过sqlSessionFactory的openSession()方法实现。 //sqlSession完全包含了面向数据库执行SQL命令所需的所有方法! //参数true指打开了sqlSession的自动提交,即更改数据库后无需手动commit。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(true); } }
-
编写数据库
数据定义一般放入pojo文件夹,一般一个数据表与一个类对应,类的属性为表中的字段,同时构建出get/set方法,tostring方法,有参/无参构造方法。
//文件名:User.java package com.hy.pojo; public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
-
编写数据库交互接口
数据库交互的接口一般放在dao文件夹,定义数据库的基本操作(CRUD),一般命名为XxxMapper,定义为接口文件。
//文件名:UserMapper.java public interface UserMapper { //获取全部用户; List<User> getUserList(); //根据id查询用户; User getUserById(int id); //根据name查询用户; List<User> getUserListByName(String name); //insert一个用户; void addUser(User user); //按id更新一个用户; void updateUserById(User user); //按id删除一个用户; Integer deleteUserById(int id); //利用map适配查询内容; int addUserPartly(Map<String,Object> map); //模糊查询; List<User> getUserLike(String value); }
-
编写XxxMapper.xml文件
上一步中的接口的实现在此xml文件中定义,当然也可以直接用java编写实现类。而Mybatis的作用即在此步骤中,通过xml配置文件替换了java的实现类,免去了实现类中连接数据库等基础操作的代码,简化代码并实现了java和SQL的解耦。
<!--文件名: UserMapper.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"> <!--namespace指向对应的接口文件,需要使用全路径的地址--> <mapper namespace="com.hy.dao.UserMapper"> <select id="getUserList" resultType="com.hy.pojo.User"> select * from db_hy.user </select> <!--id为对应接口文件定义的方法--> <!--parameterType为传入参数的类型,基本类型和String类型可省略,其他对象必须写包的全路径名称--> <!--resultType为返回参数的类型,基本类型和String类型可省略,其他对象必须写包的全路径名称--> <!--如果传入或返回参数不止一个,可以使用map对象传参,也有其他方法--> <select id="getUserLike" parameterType="java.lang.String" resultType="com.hy.pojo.User"> select * from db_hy.user where name like "%"#{value}"%" </select> <select id="getUserById" parameterType="int" resultType="com.hy.pojo.User"> select * from db_hy.user where id = #{id} </select> <select id="getUserListByName" parameterType="String" resultType="com.hy.pojo.User"> select * from db_hy.user where name = #{name} </select> <insert id="addUser" parameterType="com.hy.pojo.User"> insert into db_hy.user (id,name,pwd) values (#{id}, #{name}, #{pwd}) </insert> <!--通过map对象,可以自定义传入的内容, --> <insert id="addUserPartly" parameterType="map"> insert into db_hy.user (id,name,pwd) values (#{userid}, #{userName}, #{passWORD}) </insert> <update id="updateUserById" parameterType="com.hy.pojo.User"> update db_hy.user set name=#{name}, pwd=#{pwd} where id=#{id} </update> <delete id="deleteUserById" parameterType="int"> delete from db_hy.user where id=#{id} </delete> </mapper>
-
将Mapper.xml引入项目
要使上一步中的Mapper.xml文件在项目中起作用,需要将xml文件引入项目。具体实现分为2步。
首先,需要将该文件引入mybatis的核心配置文件中,即引入mybatis-config.xml文件中。
其次,需要在maven中将xml文件所在地址定义为maven搜索配置文件扫描的地址,否则maven在编译程序时不会读取该文件。
<dependencies>
<!-- xxx -->
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
-
编写测试类进行测试
在test文件夹中新建对应接口文件相同位置的建立对应的测试类,测试测试方法验证。
//文件名: UserMapperTest.java public class UserMapperTest { @Test public void test(){ //新建sqlSession连接。 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //通过sqlSession的getMapper方法获取UserMapper对象; //该对象就是对应UserMapper接口的实例化对象。 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //UserMapper对象可以直接使用接口定义的方法,方法的实现来自Mapper.xml配置文件。 List<User> userList = userMapper.getUserList(); for (User user : userList) { System.out.println(user); } } finally { //测试完毕要记得关闭连接,释放内存。 sqlSession.close(); System.out.println("====================="); } } }