使用 MyBatis 框架进行持久层开发
MyBatis 是支持普通 SQL 查询, 存储过程和高级映射的优秀持久层框架.
MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.
MyBatis 可以使用简单的 xml 或注解用于配置和原始映射, 将接口和 Java 的 POJO(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录.
目录
使用 MyBatis 框架进行持久层开发
你需要了解的知识点
1, 什么是 SqlSessionFactory?
2, 为什么要使用注解版
使用
1,MyBatis 下载
2, 创建实体类
3, 创建属性文件 jdbc.properties
4, 创建 xml 映射配置文件
5, 创建 Mapper 接口
6, 编写 mybatis 工具类
7, 编写测试类
你可能会出现的问题
问题一: MySQL 客户端版本过低
写在最后
你需要了解的知识点
1, 什么是 SqlSessionFactory?
SqlSessionFactory 是 MyBatis 框架中十分重要的对象, 它是单个数据库映射关系经过编译后的内存镜像, 其主要作用是创建 SqlSession.
SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象来构建, 而 SqlSessionFactoryBuilder 则可以通过 xml 配置文件或一个预先定义好的 Configuration 实例构建出 SqlSessionFactory 的实例
SqlSessionFactory 对象是线程安全的, 它一旦被创建, 在整个应用执行期间都会存在. 如果我们多次的创建同一个数据库的 SqlSessionFactory, 那么此数据库的资源将很容易被耗尽. 为此, 通常每一个数据库都会只对应一个 SqlSessionFactory, 所以在构建 SqlSessionFactory 实例时, 建议使用单列模式.
2, 为什么要使用注解版
相信同学们已经了解到, mybatis 有 xml 版与注解版两种形式, 那我们实际开发中使用 xml 版还是注解版呢, 我只能告诉你, 两种版本各有各的优点, 可以根据自己的需求再不同的环境使用不同的方式.
1, 注解版: 简单方便
2,xml 版: 可维护性高
使用
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.entity"/>
- </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 class="com.lomtom.mybatis.mapper.UserInfoMapperAnnotation"></mapper>
- </mappers>
- </configuration>
- <typeAliases > 元素用于为配置文件中的 Java 类型设置一个简短的名字, 即设置别名. 别名的设置与 xml 配置相关, 其使用的意义在于减少全限定类名的冗余.
当 POJO 类过多时可以指定一个包名, MyBatis 会在包名下面搜索需要的 Java Bean. 每一个在包 中的 Java Bean, 在没有注解的情况下, 会使用 Bean 的首字母小写的非限定类名来作为它的别名. 若有注解, 则别名为其注解值
<environments > 元素用于对环境进行配置. MyBatis 的环境配置实际上就是数据源的配置, 我们可以通过 < environments > 元素配置多种数据源, 即配置多种数据库.
5, 创建 Mapper 接口
在 com.lomtom.mybatis.mapper 包中创建 UserInfoMapperAnnotation.java 接口, 并且加入
testAddUserInfo()方法
testGetUserInfoById()方法
testGetAllUserInfo()方法
testUpdateUserInfo()方法
testDeleteUserInfo()方法
- /**
- * @Author: LOMTOM
- * @Date: 2020/4/26
- * @Time: 16:16
- * @Email: lomtom@qq.com
- */
- public interface UserInfoMapperAnnotation {
- /**
- * 插入
- * @param userInfo
- * @return
- */
- @Insert("insert into user_info(userName, passWord, regDate)\n" +
- "values(#{userName},#{passWord}, #{regDate})")
- int addUserInfo(UserInfo userInfo);
- /**
- * 删除
- * @param id
- * @return
- */
- @Delete("delete from user_info where id = #{id}")
- int deleteUserInfo(Integer id);
- /**
- * 获取
- * @param id
- * @return
- */
- @Select("select * from user_info where id = #{id}")
- UserInfo getUserInfoById(Integer id);
- /**
- * 获取全部
- * @return
- */
- @Select("select * from user_info")
- List<UserInfo> getALLUserInfo();
- /**
- * 更新
- * @param userInfo
- * @return
- */
- @Update("update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}")
- void updateUserInfo(UserInfo userInfo);
- }
6, 编写 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();
- }
- }
7, 编写测试类
首先, 需要加入必不可少的依赖
- <!-- 测试 -->
- <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 testAddUserInfoAnnotation(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. 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 testGetUserInfoByIdAnnotation(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
- System.out.println(userInfoMapper.getUserInfoById(1));
- System. out. println ("record has got !");
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testGetAllUserInfoAnnotation(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
- System.out.println(userInfoMapper.getALLUserInfo());
- System. out. println ("record has got !");
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void testUpdateUserInfoAnnotation(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. 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 testDeleteUserInfoAnnotation(){
- SqlSession sqlSession= MybatisUtils.getSession();
- UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
- int i= userInfoMapper.deleteUserInfo(1);
- System. out. println (i+ "record has deleted !");
- sqlSession.commit();
- sqlSession.close();
- }
你可能会出现的问题
问题一: MySQL 客户端版本过低
描述:
MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
分析: 这是前面一直强调的 MySQL 驱动包的, 一定要根据自己的 MySQL 版本导入相应的 MySQL 驱动包
解决: 我的是 version 8, 而我用的是 5 的驱动包, 更改驱动包后解决
写在最后
关注公众号: 博奥思园 , 精彩内容不错失
你的支持是作者最大的动力
来源: https://www.cnblogs.com/lomtom/p/12804029.html