mybatis
1、mybatis的作用
再MVC三层模式中mybatis作用于DAO层。
进行与数据库连接。
事务管理:支持数据操作进行手动或自动事务管理,确保数据
提交的一致性和可靠性。
通过SQL语句执行对数据库的CRUD操作,提供数据持久化。
2、封装JDBC
MyBatis相较于JDBC简化了以下开发:
-
数据库连接管理:使用JDBC进行数据库操作时,需要手动获取数据库连接、释放数据库连接等操作,在高并发的情况下还需要面对连接池的问题。而在MyBatis中,数据源(DataSource)等连接管理工作都被封装好了,用户只需要关注执行SQL语句即可。
-
预处理和执行SQL语句:在JDBC中,需要通过Statement对象或PreparedStatement对象来进行预处理和执行SQL语句。MyBatis将执行SQL语句的相关操作都封装成接口方法,用户通过Mapper文件或注解来配置对应的SQL语句,消除了样板式代码,使得代码更加简洁易懂。
-
处理结果集:在JDBC中,需要使用ResultSet对象来处理查询结果集,通过访问ResultSet对象的列名或是序号来获取结果。而在MyBatis中,支持将查询结果自动封装为Java属性对象列表或者Map映射,可以避免重复的属性名称声明以及类型不匹配的异常。
-
事务管理:JDBC需要通过Spring框架或编写大量的代码来进行事务管理。而MyBatis提供了默认的SqlSession事务模式、支持Spring事务以及托管给全局事务管理器三种事务管理方式,并且对事务Rollback、Commit进行了封装,简化了事务处理流程。
MyBatis采用了不同的架构和设计理念,封装了JDBC底层操作,并提供了更方便、高效的CRUD编程接口以及自动参数映射和结果集处理,大大简化了数据库开发。
3、mybatis基于XML配置
创建Maven项目
2、在maven项目中下载mybatis和mysql的依赖
pom.xml
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies>
创建mybatis核心配置文件,在src\main\resources下创建mybatis-config.xml文件
src\main\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> <!-- 数据库连接相关 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <!-- 引入映射文件,如果有多个文件,则在此处添加 --> <mapper resource="UserMapper.xml"/> </mappers></configuration>
注意在这些代码中修改自己的mysql配置
<transactionManager type="JDBC"/> <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/exampleDB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8"/> <property name="username" value="root"/> <property name="password" value="123456"/>
创建UserMapper.xml文件
src\main\resources\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"><!-- 定义命名空间 --><mapper namespace="UserMapper"> <!-- 定义查询所有用户的 SQL 语句--> <select id="findAllUsers" resultType="src.main.com.example.DAO.User"> SELECT * FROM tb_user; </select> <!-- 定义根据用户 ID 查询用户的 SQL 语句--> <select id="findUserById" parameterType="int" resultType="src.main.com.example.DAO.User"> SELECT * FROM tb_user WHERE id = #{id}; </select> <!-- 定义新增用户的 SQL 语句--> <insert id="addUser" parameterType="src.main.com.example.DAO.User"> INSERT INTO tb_user(username, password) VALUES (#{username}, #{password}); </insert> <!-- 定义根据用户 ID 删除用户的 SQL 语句--> <delete id="deleteUserById" parameterType="int"> DELETE FROM tb_user WHERE id = #{id}; </delete> <!-- 定义根据用户 ID 更新用户密码的 SQL 语句--> <update id="updatePasswordById" parameterType="map"> UPDATE tb_user SET password = #{newPassword} WHERE id = #{userId}; </update></mapper>
创建数据库的实体类,实体类要根据我们创建的mysql数据库相对应
实体类中的每一个属性,都有一个mysql属性与之相对应
src\main\java\com\example\pojo\User.java
package src.main.com.example.pojo;public class User { private Integer id; private String username; private int password; private String gender; private String addr; public User() { } public User(int id, String username, int password, String gender, String addr) { this.id = id; this.username = username; this.password = password; this.gender = gender; this.addr = addr; } 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 int getPassword() { return password; } public void setPassword(int password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password=" + password + ", gender='" + gender + '\'' + ", addr='" + addr + '\'' + '}'; }}
创建测试类
src\main\java\com\example\text\Text.java
package src.main.com.example.text;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 Text{ public static void main(String[] args) throws IOException { // 加载核心配置文件路径 String resource = "mybatis-config.xml"; //通过SqlesSsionFactor实例化SqlSessionFactor //然后通过SqlSessionFactor的openSqlSession()方法获取SqlSession对象 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //使用SqlSession来执行SQL语句 List<User> user = sqlSession.selectList("UserMapper.findAllUsers"); System.out.println(user); sqlSession.close(); }}
4、Mapper代理开发
mapper代理开发,让我们在调用sql语句时会更加方便
我们在原来的配置上进行如下修改
创建一个与映射文件(UserMapper.xml)同名的接口文件,
接口文件中定义方法,方法名与映射文件中的id一致,返回
类型也要和resultType一致
注意返回是一个对象还是多个对象,多个对象要用list集合接收
下面我们创建与映射文件同名的接口,并且定义方法src/main/com/example/mapper/UserMapper
ackage src.main.com.example.mapper;public interface UserMapper { list<User> findAllUsers(); User findUserById(); User addUser(); User deleteUserById(); User updatePasswordById();}
第二步要将我们的映射文件(UserMapper.xml)与接口文件(UserMapper)放在同一个包中
1、方法一:直接将映射文件拖入mapper包下2、方法二:为了统一管理,我们直接在reserces下创建一个com/example/mapper,再将映射文件拖入该文件下,可以达到同样的效果
修改映射文件的namespace,以前这个值是可以谁便取得,但现在要将它改为接口文件的路径
在UserMapper.xml中修改namespace
<?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="src/main/com/example/mapper"> <!-- 定义查询所有用户的 SQL 语句--> <select id="findAllUsers" resultType="src.main.com.example.DAO.User"> SELECT * FROM tb_user; </select> <!-- 定义根据用户 ID 查询用户的 SQL 语句--> <select id="findUserById" parameterType="int" resultType="src.main.com.example.DAO.User"> SELECT * FROM tb_user WHERE id = #{id}; </select> <!-- 定义新增用户的 SQL 语句--> <insert id="addUser" parameterType="src.main.com.example.DAO.User"> INSERT INTO tb_user(username, password) VALUES (#{username}, #{password}); </insert> <!-- 定义根据用户 ID 删除用户的 SQL 语句--> <delete id="deleteUserById" parameterType="int"> DELETE FROM tb_user WHERE id = #{id}; </delete> <!-- 定义根据用户 ID 更新用户密码的 SQL 语句--> <update id="updatePasswordById" parameterType="map"> UPDATE tb_user SET password = #{newPassword} WHERE id = #{userId}; </update></mapper>
由于映射文路径置改了,我们的配置文件要引入映射文件,
也要修改为相同路径
修改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"> <environment id="development"> <transactionManager type="JDBC"/> <!-- 配置数据源,注意这里要配置自己的数据库驱动和连接参数 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <!-- 引入映射文件,如果有多个文件,则在此处添加 --> <mapper resource="src/main/com/example/mapper/UserMapper.xml"/> </mappers></configuration>
测试时我们不在使用sqlSessioj的方法,而是使用sqlSession.getMapper()
获取UserMapper接口代理对象,在调用接口中的方法
src/main/java/com/example/text/Text.java
import java.io.IOException;import java.io.InputStream;import java.util.List;public class Text{ public static void main(String[] args) throws IOException { // 加载核心配置文件路径 String resource = "mybatis-config.xml"; //通过SqlesSsionFactor实例化SqlSessionFactor //然后通过SqlSessionFactor的openSqlSession()方法获取SqlSession对象 InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //使用SqlSession.getMapper()来获取UserMapper接口对象 UserMapper mapper=sqlSession.getMapper(UserMapper.class); //调用接口方法 List<User> user= mapper.findAllUsers(); System.out.println(user); sqlSession.close(); }}