MyBatis入门
Posted gdwkong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis入门相关的知识,希望对你有一定的参考价值。
一、MyBatis简介
MyBatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它赋值的过程全部可以交给MyBatis去完成。
与Hibernate比较:
1.Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。
2.sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。
二、入门案例
1、数据库的准备(创表语句)
1 -- ---------------------------- 2 -- Table structure for `user` 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `user`; 5 CREATE TABLE `user` ( 6 `id` int(11) NOT NULL AUTO_INCREMENT, 7 `username` varchar(32) NOT NULL COMMENT \'用户名称\', 8 `birthday` date DEFAULT NULL COMMENT \'生日\', 9 `sex` char(1) DEFAULT NULL COMMENT \'性别\', 10 `address` varchar(256) DEFAULT NULL COMMENT \'地址\', 11 PRIMARY KEY (`id`) 12 ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; 13 14 -- ---------------------------- 15 -- Records of user 16 -- ---------------------------- 17 INSERT INTO `user` VALUES (\'1\', \'王五\', null, \'2\', null); 18 INSERT INTO `user` VALUES (\'10\', \'张三\', \'2014-07-10\', \'1\', \'北京市\'); 19 INSERT INTO `user` VALUES (\'16\', \'张小明\', null, \'1\', \'河南郑州\'); 20 INSERT INTO `user` VALUES (\'22\', \'陈小明\', null, \'1\', \'河南郑州\'); 21 INSERT INTO `user` VALUES (\'24\', \'张三丰\', null, \'1\', \'河南郑州\'); 22 INSERT INTO `user` VALUES (\'25\', \'陈小明\', null, \'1\', \'河南郑州\'); 23 INSERT INTO `user` VALUES (\'26\', \'王五\', null, null, null);
2、使用idea新建maven-archetype-quickstart项目
3、引入依赖
1 <dependency> 2 <groupId>mysql</groupId> 3 <artifactId>mysql-connector-java</artifactId> 4 <version>5.1.45</version> 5 </dependency> 6 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> 7 <dependency> 8 <groupId>org.mybatis</groupId> 9 <artifactId>mybatis</artifactId> 10 <version>3.2.7</version> 11 </dependency>
4、于resources文件夹中创建SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 和spring整合后 environments配置将废除 --> 7 <environments default="development"> 8 <environment id="development"> 9 <!-- 使用jdbc事务管理 --> 10 <transactionManager type="JDBC" /> 11 <!-- 数据库连接池 --> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" 15 value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 16 <property name="username" value="root" /> 17 <property name="password" value="" /> 18 </dataSource> 19 </environment> 20 </environments> 21 22 <mappers> 23 <!-- 第一种方式,加载 resource--> 24 <mapper resource="User.xml"></mapper> 25 <mapper resource="UserMapper.xml"/> 26 27 <!-- 第三种方式,包扫描器要求(推荐使用此方式): 28 1、映射文件与接口同一目录下 29 2、映射文件名必需与接口文件名称一致 30 --> 31 <!--<package name="com.cenobitor.mapper"/>--> 32 </mappers> 33 </configuration>
5、创建实体类User
1 package com.cenobitor.pojo; 2 3 import java.util.Date; 4 5 public class User { 6 7 private Integer id; 8 private String username;// 用户姓名 9 private String sex;// 性别 10 private Date birthday;// 生日 11 private String address;// 地址 12 private String uuid; 13 14 ...... 15 }
6、配置SQL查询的映射文件(resources目录)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- namespace:命名空间,类似于java包,主要用于隔离sql语句的,后续有重要作用 6 #{}:占位符,相当于jdbc的? 7 ${}:字符串拼接指令,注意如果入参为普通数据类型时,括号里面只能写value 8 --> 9 <mapper namespace="user"> 10 <!-- id:sql id标识sql语句的唯一标识 11 parameterType:入参的数据类型 12 resultType:返回结果的数据类型 13 --> 14 <select id="getUserById" parameterType="int" resultType="com.cenobitor.pojo.User"> 15 SELECT 16 `id`, 17 `username`, 18 `birthday`, 19 `sex`, 20 `address` 21 FROM `user` 22 WHERE id = #{id} 23 </select> 24 25 <!-- resultType:如果返回结果是集合时,只需要设置为元素的数据类型就可 --> 26 <select id="getUserByName" parameterType="String" resultType="com.cenobitor.pojo.User"> 27 SELECT 28 `id`, 29 `username`, 30 `birthday`, 31 `sex`, 32 `address` 33 FROM `user` 34 WHERE username LIKE \'%${value}%\' 35 </select> 36 37 <insert id="insertUser" parameterType="com.cenobitor.pojo.User"> 38 INSERT INTO USER (`username`,`birthday`,`sex`,`address`) 39 VALUES (#{username},#{birthday},#{sex},#{address}) 40 </insert> 41 42 <!--返回MySql自增主键--> 43 <!-- useGeneratedKeys:标识插入使用自增id 44 keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性 45 --> 46 <insert id="insertUserKey" parameterType="com.cenobitor.pojo.User" 47 useGeneratedKeys="true" keyProperty="id"> 48 49 <!-- selectKey:用于配置主键返回 50 keyProperty:要绑定的pojo属性 51 resultType:属性数据类型 52 order:指定什么时候执行,AFTER之后 53 --> 54 <!-- <selectKey keyProperty="id" resultType="int" order="AFTER"> 55 SELECT LAST_INSERT_ID() 56 </selectKey> --> 57 58 INSERT INTO USER (`username`,`birthday`,`sex`,`address`) 59 VALUES (#{username},#{birthday},#{sex},#{address}) 60 </insert> 61 62 <!--返回MySql的uuid返回主键--> 63 <insert id="insertUserUUID" parameterType="com.cenobitor.pojo.User"> 64 65 <!-- selectKey:用于配置主键返回 66 keyProperty:要绑定的pojo属性 67 resultType:属性数据类型 68 order:指定什么时候执行,AFTER之后 69 --> 70 <selectKey keyProperty="uuid" resultType="String" order="BEFORE"> 71 SELECT UUID() 72 </selectKey> 73 74 INSERT INTO USER (`username`,`birthday`,`sex`,`address`,`uuid`) 75 VALUES (#{username},#{birthday},#{sex},#{address},#{uuid}) 76 </insert> 77 78 <update id="updateUser" parameterType="com.cenobitor.pojo.User"> 79 UPDATE USER SET username = #{username} WHERE id = #{id} 80 </update> 81 82 <delete id="deleteUser" parameterType="com.cenobitor.pojo.User"> 83 DELETE FROM `user` WHERE `id` = #{id} 84 </delete> 85 86 </mapper>
7、加载映射文件,在SqlMapConfig.xml配置mappers节点
8、编写测试类
1 package com.cenobitor; 2 3 import com.cenobitor.Utils.SqlSessionFactoryUtils; 4 import com.cenobitor.pojo.User; 5 import junit.framework.Test; 6 import junit.framework.TestCase; 7 import junit.framework.TestSuite; 8 import org.apache.ibatis.io.Resources; 9 import org.apache.ibatis.session.SqlSession; 10 import org.apache.ibatis.session.SqlSessionFactory; 11 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 12 13 import java.io.IOException; 14 import java.io.InputStream; 15 import java.util.Date; 16 import java.util.List; 17 18 /** 19 * Unit test for simple App. 20 */ 21 public class AppTest extends TestCase { 22 //根据id查找用户 23 public void testGetUserById() throws IOException { 24 25 //创建SqlSessionFactoryBuilder对象 26 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); 27 //查找配置文件,创建输入流 28 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); 29 //加载配置文件,创建SqlSessionFactory 30 SqlSessionFactory sqlSessionFactory = sfb.build(inputStream); 31 //创建SqlSession 32 SqlSession sqlSession = sqlSessionFactory.openSession(); 33 //执行查询,参数一:要查询的statementId,参数二:sql语句入参 34 User user = sqlSession.selectOne("user.getUserById", 1); 35 //输入查询结果 36 System.out.println(user); 37 38 //释放资源 39 sqlSession.close(); 40 } 41 42 //根据用户名查找用户列表 43 public void testGetUserByName(){ 44 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 45 SqlSession sqlSession = sqlSessionFactory.openSession(); 46 List<User> list = sqlSession.selectList("user.getUserByName", "张"); 47 for (User user : list) { 48 System.out.println(user); 49 } 50 51 sqlSession.close(); 52 } 53 54 //插入用户 55 public void testInsertUser(){ 56 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 57 SqlSession sqlSession = sqlSessionFactory.openSession(); 58 59 User user = new User(); 60 user.setUsername("貂蝉"); 61 user.setSex("0"); 62 user.setBirthday(new Date()); 63 user.setAddress("吕布"); 64 65 //执行插入语句 66 sqlSession.insert("user.insertUser",user); 67 //提交事务 68 sqlSession.commit(); 69 //释放资源 70 sqlSession.close(); 71 } 72 73 //Mysql自增返回 74 public void testInsertUserKey(){ 75 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 76 SqlSession sqlSession = sqlSessionFactory.openSession(); 77 78 User user = new User(); 79 user.setUsername("杨玉环"); 80 user.setSex("0"); 81 user.setBirthday(new Date()); 82 user.setAddress("李隆基"); 83 84 //执行插入语句 85 sqlSession.insert("user.insertUserKey", user); 86 System.out.println(user); 87 //提交事务 88 sqlSession.commit(); 89 //释放资源 90 sqlSession.close(); 91 } 92 93 //Mysql的uuid返回主键 94 //注:在使用uuid之前数据库user表要先加上uuid2字段、user的pojo也要加上相应属性 95 public void testInsertUserUUID(){ 96 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 97 SqlSession sqlSession = sqlSessionFactory.openSession(); 98 99 User user = new User(); 100 user.setUsername("孙尚香"); 101 user.setSex("0"); 102 user.setBirthday(new Date()); 103 user.setAddress("刘备"); 104 105 //执行插入语句 106 sqlSession.insert("user.insertUserUUID", user); 107 System.out.println(user); 108 //提交事务 109 sqlSession.commit(); 110 //释放资源 111 sqlSession.close(); 112 } 113 114 //修改用户 115 public void testUpdateUser(){ 116 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 117 SqlSession sqlSession = sqlSessionFactory.openSession(); 118 119 User user = new User(); 120 user.setUsername("吕雉"); 121 user.setId(32); 122 123 //执行插入语句 124 sqlSession.update("user.updateUser",user); 125 126 //提交事务 127 sqlSession.commit(); 128 //释放资源 129 sqlSession.close(); 130 } 131 132 //删除用户 133 public void testDeleteUser(){ 134 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory(); 135 SqlSession sqlSession = sqlSessionFactory.openSession(); 136 sqlSession.delete("user.deleteUser",32); 137 sqlSession.commit(); 138 sqlSession.close(); 139 } 140 }
9、抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory的对象
1 public class SqlSessionFactoryUtils { 2 private SqlSessionFactoryUtils(){} 3 4 private static class SqlSessionFactoryInstance{ 5 6 public static SqlSessionFactory sqlSessionFactory; 7 8 static { 9 try { 10 sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"<以上是关于MyBatis入门的主要内容,如果未能解决你的问题,请参考以下文章
markdown [mybatis参考]关于mybatis #mybatis的一些片段