一.Mybatis特性
- 定制化SQL:MyBatis允许开发人员编写、优化和管理自定义的SQL语句,可以满足复杂查询和存储过程等高级操作的需求。
- 避免JDBC代码:MyBatis抽象了JDBC底层的繁琐操作,开发人员无需手动设置参数和获取结果集,通过配置文件或注解即可完成数据库操作。
- 灵活的映射配置:MyBatis通过简单的XML配置文件或者注解来实现对象与数据库记录之间的映射关系,将接口和Java的POJO对象映射到数据库表中的记录。
- 高度可定制:MyBatis提供了丰富的配置选项和插件机制,可以按照项目需求进行灵活的定制和扩展。开发人员可以根据具体情况选择合适的配置方式。
二.常见持久层技术的比较
JDBC:
- 优点:JDBC是Java连接数据库的标准接口,具有广泛的适应性和灵活性。可以直接编写SQL语句,对数据库操作更为直观。
- 缺点:需要在代码中编写和管理SQL语句,导致代码与SQL耦合度高,难以维护和修改。开发效率较低,代码冗长。
Hibernate和JPA:
- 优点:操作简便,开发效率高。通过对象关系映射(ORM)实现数据库操作,屏蔽了底层SQL细节,减少了手动编写SQL的工作量。
- 缺点:对于复杂的SQL查询,可能需要绕过框架,使用特定的查询语言。自动生成的SQL语句可能不容易进行特殊优化。在处理大量字段的POJO进行部分映射时会比较困难。反射操作较多可能导致数据库性能下降。
MyBatis:
- 优点:轻量级且性能出色,具有很高的执行效率。SQL和Java代码相分离,功能边界清晰,Java代码专注于业务逻辑,SQL语句专注于数据操作。可以灵活地编写和优化SQL语句。
- 缺点:相对于Hibernate,开发效率稍逊一些,需要手动编写和管理SQL语句。
三.搭建Mybaits环境
使用工具Maven idea Mysql
1.配置
在maven的pom.xml中需要配置三个模块,mysql-connect-java、mabatis、junit
配置如下:
<!-- mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</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>RELEASE</version> <scope>test</scope> </dependency>
2.构建连接数据库的xml
编辑
在resources中(如果没有resource则创建一个)创建名称为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><!-- 配置 --> <!-- 配置连接数据库的环境--> <environments default="development"> <!-- 设置环境id--> <environment id="development"> <!-- 事务管理模式--> <transactionManager type="JDBC"/> <!-- 数据源类型--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 配置url时候记得jdbc:mysql://localhost:3306后面加上的是选择的具体数据库--> <!-- 我这里选择我创建的mysqltest数据库--> <property name="url" value="jdbc:mysql://localhost:3306/mysqltest"/> <!-- 输入连接你的数据库的名称和密码--> <property name="username" value="mysql"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 配置映射文件--> <mappers> <!-- 这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置--> <mapper resource=""/> </mappers> </configuration>
四.使用Mybatis
1.创建实体类
在完成了搭建环境后,在Java下的com下创建目录pojo,创建一个需要与数据库映射对应的类,比如创建一个用户类
编辑
创建好后设置好构造函数、getter、toString,如下
package com.alphamilk.mybatis.pojo; public class User { // 设置名字 private String name; // 设置年龄 private int age; // 设置邮箱地址 private String email; // 设置身份id private int id; public User(String name, int age, String email, int id) { this.name = name; this.age = age; this.email = email; this.id = id; } public String getName() { return name; } public int getAge() { return age; } public String getEmail() { return email; } public int getId() { return id; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + ", id=" + id + '}'; } }
2.在数据库中创建同样创建一样的表
Sql语言如下:
create table table_user ( name varchar(10) null, age int null, email varchar(20) null, id int null );
编辑
3.创建业务接口类
首先在com下创建一个mapper包,里面再创建一个接口 创建映射接口(User对应的就是UserMapper)
编辑
4.创建接口实现映射
创建接口后,为了实现接口的功能,又需要实现java与sql的分离,则需要用xml配置实现,在resource包下创建一个mappers包,写一个对应的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.alphamilk.mybatis.mapper.UserMapper"> <!-- 配置实体类映射接口--> <!-- 通过标签的设置就可以实现对应的操作,insert标签对应插入操作--> <!-- 注意id需要与其作用的方法名称对应,该方法在接口中名称为public int insertUser();--> <!-- 内部写对应的sql语句--> <insert id="insertUser"> insert into table_user value ('何生',20,'915@qq.com',001) </insert> </mapper>
5.实现接口映射后,就需要将映射的xml导入到mybatis-config.xml中
<mappers> <!-- 这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置--> <mapper resource="mappers/UserMapper.xml"/> </mappers>
5.最后创建测试类,测试Mybatis是否能够正常运行
创建MybatisTest类
编辑
内容如下:
package com.alphamilk.mybatis; import com.alphamilk.mybatis.mapper.UserMapper; 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 org.junit.Test; import java.io.IOException; import java.io.InputStream; public class MybatisTest { @Test public void Test() throws IOException { // 创建核心输入流 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 获取SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 获取Session会话对象,会话对象用以提供 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建动态代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 通过代理对象调用方法insertUser int result = mapper.insertUser(); // 执行完后需要记得提交事务,才会保留内容到数据库 sqlSession.commit(); // 执行完后关闭会话对象 System.out.println(result); sqlSession.close(); } }
注意用的Resource是包org.aphache.ibatis.io
编辑
执行后可以在数据库中查看表
编辑
可以看到正常插入进去了
五.通过Mybatis实现增删改
增删查改,除了查,其他操作跟上述一样。
这里展示其源码
由于Test测试类中有太复杂的操作,所以在com目录下创建了一个util工具类,类中实现一个方法就是给我们返回SqlSession操作数据库对象。
代码如下
package com.alphamilk.mybatis.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.InputStream; public class MybatisUtil { public static SqlSession getSession(){ SqlSession sqlSession =null; try { // 配置核心配置输入流 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 获取SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 获取sqlSession对象 sqlSession = sqlSessionFactory.openSession(); return sqlSession; }catch (Exception e){ e.printStackTrace(); } return sqlSession; } }
由于需要实现删该的方法,所以在接口中需要实现方法增加
package com.alphamilk.mybatis.mapper; public interface UserMapper { // 实现用户插入 public int insertUser(); // 实现用户信息修改 public int UpdateUser(); // 实现用户信息消除 public int DeleteUser(); }
对应的映射也需要增加
<?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.alphamilk.mybatis.mapper.UserMapper"> <!-- 配置实体类映射接口--> <!-- 方法insertUser() --> <insert id="insertUser"> insert into table_user value ('何生',20,'915@qq.com',001) </insert> <!-- 方法UpdateUser()--> <update id="UpdateUser"> update table_user set name ='黄小龙'where id=1 </update> <!-- 方法DeleteUser()--> <delete id="DeleteUser"> delete from table_user where name='黄小龙' </delete> </mapper>
最后测试类实现
package com.alphamilk.mybatis; import com.alphamilk.mybatis.mapper.UserMapper; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class MybatisTest { @Test public void Test(){ SqlSession sqlSession = null; sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 执行insert方法 // mapper.insertUser(); // 执行修改方法 mapper.UpdateUser(); // 执行删除方法 // mapper.DeleteUser(); } }
实现数据修改效果
编辑
实现数据删除效果
编辑
六.实现数据库的查询操作
由于数据库查询的操作需要返回的是数据的结果
在设置xml时候,需要而外设置参数resultType 或者 resultMap
- resultType:设置结果类型,即查询的数据要转换的java类型
- resultMap,处理一对一或者一对多的映射关系
<!-- getUserById()--> <!-- resultType:设置结果类型,即查询的数据要转换的java类型 resultMap,处理一对一或者一对多的映射关系 这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象 --> <select id="getgetUserById" resultType="com.alphamilk.mybatis.pojo.User" > select name from table_user where id =2 </select>
测试类内容
package com.alphamilk.mybatis; import com.alphamilk.mybatis.mapper.UserMapper; import com.alphamilk.mybatis.pojo.User; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class MybatisTest { @Test public void Test(){ SqlSession sqlSession = null; sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 执行insert方法 // mapper.insertUser(); // 执行修改方法 // mapper.UpdateUser(); // 执行删除方法 // mapper.DeleteUser(); // 执行通过id查询 User user = mapper.getUserById(); System.out.println(user); sqlSession.commit(); sqlSession.close(); } }
编辑
如果有多个结果则返回时候需要用集合接收
当前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.alphamilk.mybatis.mapper.UserMapper"> <!-- 配置实体类映射接口--> <!-- 方法insertUser() --> <insert id="insertUser"> insert into table_user value ('何生',20,'915@qq.com',001) </insert> <!-- 方法UpdateUser()--> <update id="UpdateUser"> update table_user set name ='黄小龙'where id=1 </update> <!-- 方法DeleteUser()--> <delete id="DeleteUser"> delete from table_user where name='黄小龙' </delete> <!-- getUserById()--> <!-- resultType:设置结果类型,即查询的数据要转换的java类型 resultMap,处理一对一或者一对多的映射关系 这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象 --> <select id="getUserById" resultType="com.alphamilk.mybatis.pojo.User" > select * from table_user where id =2 </select> <!-- 对应接口内方法public User getUserAll();--> <select id="getUserAll"> select * from table_user </select> </mapper>
测试类内容
package com.alphamilk.mybatis; import com.alphamilk.mybatis.mapper.UserMapper; import com.alphamilk.mybatis.pojo.User; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.Iterator; import java.util.List; public class MybatisTest { @Test public void Test(){ SqlSession sqlSession = null; sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 执行insert方法 // mapper.insertUser(); // 执行修改方法 // mapper.UpdateUser(); // 执行删除方法 // mapper.DeleteUser(); // 执行通过id查询 // User user = mapper.getUserById(); // System.out.println(user); // 查询所有用户的信息 List<User> list = mapper.getUserAll(); Iterator<User> iterator = list.listIterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } sqlSession.commit(); sqlSession.close(); } }
编辑
编辑
深度了解Mybatis的核心配置