使用 MyBatis 框架进行持久层开发
MyBatis 是支持普通 SQL 查询, 存储过程和高级映射的优秀持久层框架.
MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.
MyBatis 可以使用简单的 xml 或注解用于配置和原始映射, 将接口和 Java 的 POJO(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录.
目录
使用 MyBatis 框架进行持久层开发
你需要了解的知识点
1, 什么是 SqlSessionFactory?
2,MyBatis 框架的核心配置文件
3,mapper 映射文件
使用
1,MyBatis 下载
2, 创建实体类
3, 创建属性文件 jdbc.properties
4, 创建 xml 映射配置文件
5, 创建 SQL 映射的 xml 文件
6, 创建 Mapper 接口
7, 编写 mybatis 工具类
8, 编写测试类
你可能会出现的问题
问题一: 找不到 mapper 映射文件
问题二: MySQL 客户端版本过低
问题三: 提示找不到 UserInfo
写在最后
你需要了解的知识点
1, 什么是 SqlSessionFactory?
SqlSessionFactory 是 MyBatis 框架中十分重要的对象, 它是单个数据库映射关系经过编译后的内存镜像, 其主要作用是创建 SqlSession.
SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象来构建, 而 SqlSessionFactoryBuilder 则可以通过 xml 配置文件或一个预先定义好的 Configuration 实例构建出 SqlSessionFactory 的实例
SqlSessionFactory 对象是线程安全的, 它一旦被创建, 在整个应用执行期间都会存在. 如果我们多次的创建同一个数据库的 SqlSessionFactory, 那么此数据库的资源将很容易被耗尽. 为此, 通常每一个数据库都会只对应一个 SqlSessionFactory, 所以在构建 SqlSessionFactory 实例时, 建议使用单列模式.
2,MyBatis 框架的核心配置文件
在 MyBatis 框架的核心配置文件中, 元素是配置文件的根元素, 其他元素都要在元素内配置.
3,mapper 映射文件
在映射文件中, 元素是映射文件的根元素, 其他元素都是它的子元素.
使用
1,MyBatis 下载
在 Java 或 Java web 项目中添加 MyBatis 框架后, 就能对数据表进行 CRUD 操作了.
方法一: 可以从官方网站: https://github.com/mybatis 下载所需要的 MyBatis 版本.
方法二: 使用 maven 的直接加入依赖, 需要 MySQL 的驱动包, mybatis 的驱动包
- <!-- 数据库 start-->
- <!-- 引入 jdbc 与 mysql 依赖 -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.18</version>
- </dependency>
- <!-- mybatis-->
- <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.4.6</version>
- </dependency>
- <!-- 数据库 end-->
注意这里的 MySQL 的驱动包, 根据你自己安装的 MySQL 版本, 使用 MySQL -V 查询, 例如我的是 8 版本, 所以用 8 版本的驱动包
2, 创建实体类
在 src 目录下新建 com.lomtom.mybatis.entity 包, 并在其中创建实体类 UserInfo(对应数据表 user_info).UserInfo 类包含一些属性 (对应数据表 user_info 的部分字段), 以及与之对应的 getXXX() 和 setXXX()方法, 还可添加构造方法 .
当然你如果使用 lombok 可以不写他的 getter,setter 以及 constructor.
- /**
- * @Author: LOMTOM
- * @Date: 2020/4/20
- * @Time: 15:12
- * @Email: lomtom@qq.com
- */
- @Data
- public class UserInfo {
- private Integer id;
- private String userName;
- private String passWord;
- private Date regDate;
- }
3, 创建属性文件 jdbc.properties
在 resources 目录下创建属性文件 jdbc.properties, 保存数据库的连接信息.
<properties > 是一个配置属性的元素, 该元素通常用来将内部的配置外在化, 即通过外部的配置来动态的替换内部定义的属性. 例如, 数据库的连接等属性, 就可以通过典型的 Java 属性文件中的配置来替换,
请根据自己 MySQL 版本, 确认之后再食用
- 1,MySQL for version 8
- jdbc.driverClassName=com.MySQL.cj.jdbc.Driver
- jdbc.url=jdbc:MySQL://localhost:3306/javaweb2?characterEncoding=UTF-8
- jdbc.username=root
- jdbc.password=123456
- 2,MySQL for version 5
- jdbc.driverClassName=com.MySQL.jdbc.Driver
- jdbc.url=jdbc:MySQL://localhost:3306/javaweb2?characterEncoding=UTF-8
- jdbc.username=root
- jdbc.password=123456
4, 创建 xml 映射配置文件
在 resources 目录下创建 MyBatis 的 xml 配置文件 mybatis-config.xml, 用于加载 MySQL 的连接配置.
- <configuration>
- <!-- 加载属性文件 -->
- <properties resource="jdbc.properties"></properties>
- <!-- 给包中的类注册别名, 注册后可以直接使用类名, 而不用使用全限定的类名就是不用包含包名).-->
- <typeAliases>
- <package name="com.lomtom.mybatis"/>
- </typeAliases>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="com/lomtom/mybatis/mapper/UserInfoMapper.xml"/>
- </mappers>
- </configuration>
- <typeAliases > 元素用于为配置文件中的 Java 类型设置一个简短的名字, 即设置别名. 别名的设置与 xml 配置相关, 其使用的意义在于减少全限定类名的冗余.
当 POJO 类过多时可以指定一个包名, MyBatis 会在包名下面搜索需要的 Java Bean. 每一个在包 中的 Java Bean, 在没有注解的情况下, 会使用 Bean 的首字母小写的非限定类名来作为它的别名. 若有注解, 则别名为其注解值
<environments > 元素用于对环境进行配置. MyBatis 的环境配置实际上就是数据源的配置, 我们可以通过 < environments > 元素配置多种数据源, 即配置多种数据库.
5, 创建 SQL 映射的 xml 文件
在 resources 包中创建 SQL 映射的 xml 文件 userInfoMapper.xml.
- <mapper namespace="com.lomtom.mybatis.mapper.UserInfoMapper">
- <!-- 数据表 user_info 的 CRUD 操作 -->
- <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
- insert into user_info(userName, passWord, regDate)
- values(#{userName},#{passWord}, #{regDate})
- </insert>
- <delete id="deleteUserInfo" parameterType="int">
- delete from user_info where id = #{id}
- </delete>
- <update id="updateUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
- update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}
- </update>
- <select id="getUserInfoById" parameterType="int" resultType="com.lomtom.mybatis.entity.UserInfo">
- select * from user_info where id = #{id}
- </select>
- <select id="getALLUserInfo" resultType="com.lomtom.mybatis.entity.UserInfo">
- select * from user_info
- </select>
- </mapper>
在上述 SQL 映射文件中,
- <insert>
- 元素用于映射插入语句,
- <delete>
- 元素用于映射删除语句,
- <update>
- 元素用于映射更新语句,
- <select>
- 元素用于映射查询语句.
在这些元素中, id 属性设置在命名空间中唯一的标识符, 用于引用这条语句.
parameterType 属性指定传入这条语句的参数类的完全限定名或别名.
resultType 属性指定从这条语句中返回的期望类型的类的完全限定名或别名, 若查询结果是集合, 则 resultType 的值应该是集合所包含的元素类型, 而不能是集合本身.
6, 创建 Mapper 接口
在 com.lomtom.mybatis.mapper 包中创建 UserInfoMapper.java 接口, 并且加入
testAddUserInfo()方法
testGetUserInfoById()方法
testGetAllUserInfo()方法
testUpdateUserInfo()方法
testDeleteUserInfo()方法
- /**
- * @Author: LOMTOM
- * @Date: 2020/4/20
- * @Time: 15:24
- * @Email: lomtom@qq.com
- */
- public interface UserInfoMapper {
- /**
- * 插入
- * @param userInfo
- * @return
- */
- int addUserInfo(UserInfo userInfo);
- /**
- * 删除
- * @param id
- * @return
- */
- int deleteUserInfo(Integer id);
- /**
- * 获取
- * @param id
- * @return
- */
- UserInfo getUserInfoById(Integer id);
- /**
- * 获取全部
- * @return
- */
- List<UserInfo> getALLUserInfo();
- /**
- * 更新
- * @param userInfo
- * @return
- */
- void updateUserInfo(UserInfo userInfo);
- }
7, 编写 mybatis 工具类
- /**
- * @Author: LOMTOM
- * @Date: 2020/4/20
- * @Time: 15:49
- * @Email: lomtom@qq.com
- */
- public class MybatisUtils {
- private static SqlSessionFactory sqlSessionFactory = null;
- static {
- try {
- Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static SqlSession getSession() {
- return sqlSessionFactory.openSession();
- }
- }
8, 编写测试类
首先, 需要加入必不可少的依赖
- <!-- 测试 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
新建 Test.java
- /**
- * @Author: LOMTOM
- * @Date: 2020/4/20
- * @Time: 15:44
- * @Email: lomtom@qq.com
- */
- public class MybatisTest {
- @Test
- public void testAddUserInfo(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
- UserInfo userInfo= new UserInfo();
- userInfo.setUserName("qq 小冰");
- userInfo.setPassWord("123");
- userInfo.setRegDate(new Date());
- int i= userInfoMapper.addUserInfo(userInfo);
- System. out. println (i+ "record has inserted !");
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testGetUserInfoById(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
- System.out.println(userInfoMapper.getUserInfoById(1));
- System. out. println ("record has got !");
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testGetAllUserInfo(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
- System.out.println(userInfoMapper.getALLUserInfo());
- System. out. println ("record has got !");
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testUpdateUserInfo(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
- UserInfo userInfo= new UserInfo();
- userInfo.setId(1);
- userInfo.setUserName("qq 大冰");
- userInfo.setPassWord("123456");
- userInfo.setRegDate(new Date());
- try {
- userInfoMapper.updateUserInfo(userInfo);
- System. out. println ("record has updated !");
- }catch (Exception e){
- e.printStackTrace();
- }
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testDeleteUserInfo(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
- int i= userInfoMapper.deleteUserInfo(1);
- System. out. println (i+ "record has deleted !");
- sqlSession.commit();
- sqlSession.close();
- }
- }
你可能会出现的问题
问题一: 找不到 mapper 映射文件
描述:
- ### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
- ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/lomtom/mybatis/mapper/UserInfoMapper.xml
分析: idea 对目录结构里的存放的文件类型有要求, mapper 文件必须放入到 resources 目录里
解决: 在 pom.xml 中加入资源解析,**/*.xml 代表 src/main/java 底下全部目录下的全部 xml 文件
<build>
<!-- 解决读取不到 main 里面的 xml-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
- </includes>
- <filtering>false</filtering>
- </resource>
- </resources>
- </build>
问题二: MySQL 客户端版本过低
描述:
MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
分析: 这是前面一直强调的 MySQL 驱动包的, 一定要根据自己的 MySQL 版本导入相应的 MySQL 驱动包
解决: 我的是 version 8, 而我用的是 5 的驱动包, 更改驱动包后解决
问题三: 提示找不到 UserInfo
描述:
- ### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
- ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper xml. The xml location is 'com/lomtom/mybatis/mapper/UserInfoMapper.xml'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'UserInfo'. Cause: java.lang.ClassNotFoundException: Cannot find class: UserInfo
分析: 这是因为找不到 UserInfo 类导致的, 如果 parameterType 是 UserInfo, 原则上使用小写开头的就不会报错, 如果报错的话需要将其路径写完整, 即包名加类名 com.lomtom.mybatis.entity.UserInfo
- <insert id="addUserInfo" parameterType="UserInfo">
- insert into user_info(userName, passWord, regDate)
- values(#{userName},#{passWord}, #{regDate})
- </insert>
解决: 修改 parameterType 参数
- <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
- insert into user_info(userName, passWord, regDate)
- values(#{userName},#{passWord}, #{regDate})
- </insert>
写在最后
你的支持是作者最大的动力
关注公众号: 博奥思园 , 精彩内容不错失
来源: https://www.cnblogs.com/lomtom/p/12770516.html