【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD
使用MyBatis框架进行持久层开发
- MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
- MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索。
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
目录
你需要了解的知识点
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的驱动包,更改驱动包后解决
写在最后
关注公众号:博奥思园 ,精彩内容不错失
你的支持是作者最大的动力

【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD的更多相关文章
- 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...
- 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD
使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...
- int不可为null引发的 MyBatis做持久层框架,返回值类型要为Integer问题
MyBatis做持久层框架,返回值类型要为Integer MyBatis 做持久层时,之前没注意,有时候为了偷懒使用了int类型做为返回的类型,这样是不可取的,MyBatis做持久层框架,返回值类型要 ...
- 闭关修炼180天--手写持久层框架(mybatis简易版)
闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...
- JAVA 利用反射自定义数据层框架
之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...
- 十二、持久层框架(MyBatis)
一.PageHelper分页插件的使用 PageHelper是一款MyBatis的分页插件,只需要简单的配置,然后直接调用方法就可以. 1.配置PageHelper插件 在mybatis-config ...
- 持久层框架:MyBatis 3.2(1)
MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久 ...
- Java 持久层框架之 MyBatis
MyBatis 简介 MyBatis 是一个基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动.创建 Connection.配 ...
- 持久层框架之MyBatis
1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
随机推荐
- centos7中安装mysql
centos7中安装mysql网上已经很多资源了,我就不在赘述了.我这里只是记录下我安装的时候出现的一些问题. 原文:https://www.cnblogs.com/bigbrotherer/p/72 ...
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- 详谈XSS防御方法
1.HttpOnly 严格的说,httponly并非为了对抗XSS,它解决的是XSS后的Cookie劫持攻击.Cookie设置了httponly之后,JavaScript读不到该cookie的值. ...
- STL之sstream的用法
STL之sstream的用法 说在前面: 库定义了三种类:istringstream.ostringstream和stringstream,分别用来进行流的输入.输出和输入输出操作.另外,每个类都有一 ...
- A 皮呵德
时间限制 : 5000 MS 空间限制 : 262144 KB 问题描述 Eyiz正在与邪恶的Dgdon战斗. 为了打败Dgdon,Eyiz决定召唤PhantasmDragon来帮助他. 但是,召 ...
- Gin框架系列03:换个姿势理解中间件
什么是中间件 中间件,英译middleware,顾名思义,放在中间的物件,那么放在谁中间呢?本来,客户端可以直接请求到服务端接口. 现在,中间件横插一脚,它能在请求到达接口之前拦截请求,做一些特殊处理 ...
- 新建基于STM32F103ZET6的工程-寄存器版本
1.新建空白工程 新建一个文件夹,用来存放新建的工程文件.在这个新建的文件夹下创建MDK-PRO和OUTPUT两个子文件夹.MDK-PRO文件夹用来存放工程文件:OUTPUT用来存放工程编译器后输出的 ...
- CF633(div.2)C. Powered Addition
题目描述 http://codeforces.com/contest/1339/problem/C 给定一个长度为 \(n\) 的无序数组,你可以在第 \(x\) 秒进行一次下面的操作. 从数组选取任 ...
- Vulnhub homeless靶机渗透
信息搜集 nmap -sP 192.168.146.6 nmap -A -Pn 192.168.146.151 直接访问web服务. 大概浏览一下没发现什么,直接扫描下目录把dirb+bp. BP具体 ...
- 关于TD信息树自己的体验和建议
自己选择的是17级学长13组的TD消息树,通过对这个软件的使用,感觉整体上还是很好的,他的主要功能就相当于把微信的朋友圈还有qq的好友动态等功能集合到了一起.这个软件整体就相当于一个空间,可以加好友互 ...