MyBatis历史
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
MyBatis特性
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
1<dependencies> 2<dependency> 3<groupId>org.mybatis</groupId> 4<artifactId>mybatis</artifactId> 5<version>3.5.10</version> 6</dependency> 7<dependency> 8<groupId>mysql</groupId> 9<artifactId>mysql-connector-java</artifactId>10<version>8.0.33</version>11</dependency>12</dependencies>
要使用Mybatis需要配置Mybatis的核心配置,在resources资源文件夹下创建一个mybatis配置文件(名字随意),并写入配置,配置参考Mybatis官方文档
在数据源<dataSource>的配置中,配置好driver,url,username,password
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-config.dtd"> 5<configuration> 6<environmentsdefault="development"> 7<environmentid="development"> 8<transactionManagertype="JDBC"/> 9<dataSourcetype="POOLED">10<propertyname="driver" value="com.mysql.cj.jdbc.Driver"/>11<propertyname="url" value="jdbc:mysql://localhost:3307/mybatis"/>12<propertyname="username" value="root"/>13<propertyname="password" value="root"/>14</dataSource>15</environment>16</environments>17<!--<mappers>18 <mapper resource="org/mybatis/example/BlogMapper.xml"/>19 </mappers>-->20</configuration>
现在需要一个数据库和表和一些数据用做连接测试
1CREATEDATABASEIFNOTEXISTS `mybatis`DEFAULTCHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci; 2 3CREATETABLEUSER( 4 `id`INT UNSIGNEDPRIMARYKEY AUTO_INCREMENT COMMENT'ID', 5 `name`VARCHAR(100) COMMENT'姓名', 6 `age`TINYINT UNSIGNED COMMENT'年龄', 7 `gender`TINYINT UNSIGNED COMMENT'性别, 1:男, 2:女', 8 `phone`VARCHAR(11) COMMENT'手机号' 9 ) COMMENT'用户表';1011INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'白眉鹰王',55,'1','18800000000');12INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'金毛狮王',45,'1','18800000001');13INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'青翼蝠王',38,'1','18800000002');14INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'紫衫龙王',42,'2','18800000003');15INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'光明左使',37,'1','18800000004');16INSERTINTOUSER(id, NAME, age, gender, phone)VALUES (NULL,'光明右使',48,'1','18800000005');
构建整体项目结构controller、service、mapper三层架构,创建一个实体类对应数据库的表结构,创建MyBatis的映射文件xxxMapper.xml
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
在resources文件目录下创建mapper的时候需要和main文件目录下的mapper同包名,在创建directory的时候,目录结构不能使用点,而是用/代替
User实体类中的属性需要和表中的字段名相对应,这里也可以用Lombok注解
然后在mapper中写我们需要的语句,查询语句用<select>、增加语句用<insert>、删除语句用<delete>、修改语句用<update>标签,返回类型resultType要和实体类中的实体类名称对应
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6<mappernamespace="mapper.UserMapper"> 7 8<selectid="selectAll" resultType="pojo.User"> 9 SELECT id, name, age, gender, phone FROM user10</select>11</mapper>
写好了之后回到mybatis-config.xml中配置一下mapper映射
在UserMapper中将UserMapper.xml中配置好的方法声明一下,方法名要和上面的id对应上
在service层写好业务逻辑代码,在接口中声明方法,在实现类中实现方法
1publicclass UserServiceImplimplements UserService { 2 3 @Override 4public List<User> selectAll()throws IOException { 5//读取MyBatis的核心配置文件 6 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); 7//获取SqlSessionFactoryBuilder对象 8 SqlSessionFactoryBuilder sqlSessionFactoryBuilder =new SqlSessionFactoryBuilder(); 9//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象10 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);11//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务12 SqlSession sqlSession = sqlSessionFactory.openSession();13//通过代理模式创建UserMapper接口的代理实现类对象14 UserMapper mapper = sqlSession.getMapper(UserMapper.class);15//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句16 List<User> users = mapper.selectAll();17return users;18 }19 }
在controller层中写好处理结果代码
1publicclass UserController {2private UserService userService =new UserServiceImpl();34publicvoid selectAll()throws IOException {5 List<User> users = userService.selectAll();6 users.forEach(System.out::println);7 }8 }
创建一个Test类去测试mybatis数据库连接,因为没有引入单元测试依赖,所以这里用主函数去测试
发现结果成功输出打印
如果SQL语句比较简单,可以使用mybatis中的注解,查询语句用@Select、增加语句用@Insert、删除语句用@Delete、修改语句用@Update注解
在里面写上sql语句,再运行发现,也可以查询成功。
当然,复杂一点的sql语句和动态SQL建议还是使用Mapper配置,只是简单的sql语句写在注解里面可以简化,复杂的sql只会增加代码的复杂度
总结
在Maven项目中,使用mybatis需要先导入mybatis依赖和连接数据库的依赖,然后创建mybatis配置文件,在配置文件中配置数据源细信息,随后创建MyBatis的映射文件Mapper,在mapper文件中写好对应的语句,然后在业务层进行SqlSession连接,调用mapper中的方法,再在controller层处理返回方法。
2、用Spring框架整合Mybatis
1<dependencies> 2<dependency> 3<groupId>org.mybatis</groupId> 4<artifactId>mybatis</artifactId> 5<version>3.5.10</version> 6</dependency> 7<dependency> 8<groupId>mysql</groupId> 9<artifactId>mysql-connector-java</artifactId>10<version>8.0.33</version>11</dependency>12<dependency>13<groupId>org.springframework</groupId>14<artifactId>spring-context</artifactId>15<version>5.3.30</version>16</dependency>17<dependency>18<groupId>com.alibaba</groupId>19<artifactId>druid</artifactId>20<version>1.2.20</version>21</dependency>22<dependency>23<groupId>org.mybatis</groupId>24<artifactId>mybatis-spring</artifactId>25<version>1.3.2</version>26</dependency>27<dependency>28<groupId>org.springframework</groupId>29<artifactId>spring-jdbc</artifactId>30<version>5.3.2</version>31</dependency>32</dependencies>
构建整体项目结构
2.1、基于XML整合Mybatis
- 导入Mybatis整合Spring的相关坐标
- 编写Mapper和Mapper.xml
- 配置SqlSessionFactoryBean和MapperScannerConfigurer
- 编写测试代码
和上面步骤相同,编写Mapper和Mapper.xml,一定要放在相同路径下
在UserMapper.xml中写我们需要的语句,并在UserMapper接口中写对应id的方法声明;
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6<mappernamespace="mapper.UserMapper"> 7 8<selectid="selectAll" resultType="pojo.User"> 9 SELECT id, name, age, gender, phone FROM user10</select>11</mapper>
publicinterface UserMapper { List<User> selectAll(); }
同样的,简单的SQL语句也可以用@Select注解编写,不需要UserMapper.xml配置
在Spring配置文件中配置SqlSessionFactoryBean
1<?xml version="1.0" encoding="UTF-8"?> 2<beansxmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6<!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器--> 7<beanclass="org.mybatis.spring.SqlSessionFactoryBean"> 8<propertyname="dataSource" ref="dataSource"></property> 9</bean>1011<!--配置数据源信息-->12<beanid="dataSource" class="com.alibaba.druid.pool.DruidDataSource">13<propertyname="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>14<propertyname="url" value="jdbc:mysql://localhost:3307/mybatis"></property>15<propertyname="username" value="root"></property>16<propertyname="password" value="root"></property>17</bean>18</beans>
对应的是之前配置文件中的
1<dataSourcetype="POOLED">2<propertyname="driver" value="com.mysql.cj.jdbc.Driver"/>3<propertyname="url" value="jdbc:mysql://localhost:3307/mybatis"/>4<propertyname="username" value="root"/>5<propertyname="password" value="root"/>6</dataSource>
在Spring配置文件中配置MapperScannerConfigurer
1<!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->2<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">3<propertyname="basePackage" value="mapper"></property>4</bean>
对应的是
1<mappers>2<packagename="com.tedu.mapper"/>3</mappers>
在Spring配置文件中配置好之后,在使用的时候就不用手动创建了,直接注入即可。
在UserServiceImpl属性中添加UserMapper,并为其添加setter方法用于注入。
1publicclass UserServiceImplimplements UserService { 2private UserMapper userMapper; 3 4publicvoid setUserMapper(UserMapper userMapper) { 5this.userMapper = userMapper; 6 } 7 8 @Override 9public List<User> selectAll() {10return userMapper.selectAll();11 }12 }
同样,在UserController属性中添加UserService,并为其添加setter方法用于注入。在selectAll方法中处理返回的结果。
1publicclass UserController { 2private UserService userService; 3 4publicvoid setUserService(UserService userService) { 5this.userService = userService; 6 } 7 8publicvoid selectAll(){ 9 List<User> users = userService.selectAll();10 users.forEach(System.out::println);11 }12 }
在Spring配置文件中配置上述UserService和UserController用于注入
1<beanid="userServiceImpl" class="service.impl.UserServiceImpl">2<propertyname="userMapper" ref="userMapper"></property>3</bean>45<beanid="userContorller" class="controller.UserController">6<propertyname="userService" ref="userServiceImpl"></property>7</bean>
最后创建一个测试类进行数据库连接测试
1publicclass TestSelectAll {2publicstaticvoid main(String[] args) {3 ApplicationContext context =new ClassPathXmlApplicationContext("application.xml");4 UserController userController = context.getBean(UserController.class);