带你走进mybatis--快速入门

来源:互联网 发布:mac怎么看u盘隐藏文件 编辑:程序博客网 时间:2024/05/16 16:24

 在SSH框架盛行的时代,ORM和持久层框架都不断响彻在耳边,今天小编就带领大家一起来认识另一种持久层框架;

一、基本概况

        MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO对象映射成数据库中的记录。

框架图如下;

二、入门教程(使用mysql的数据库)

1. 搭建开发环境:

  创建一个普通的Java项目,如下图所示:

                         

 添加数据库和mybatis的jar包;

创建数据库,并建立数据表:

[sql] view plain copy
  1. <span style="font-size:18px;">CREATE TABLE `items` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `namevarchar(32) NOT NULL COMMENT '商品名称',  
  4.   `price` float(10,1) NOT NULL COMMENT '商品定价',  
  5.   `detail` text COMMENT '商品描述',  
  6.   `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',  
  7.   `createtime` datetime NOT NULL COMMENT '生产日期',  
  8.   PRIMARY KEY (`id`)  
  9. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;  
  10.   
  11. /*Table structure for table `orderdetail` */  
  12.   
  13. CREATE TABLE `orderdetail` (  
  14.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  15.   `orders_id` int(11) NOT NULL COMMENT '订单id',  
  16.   `items_id` int(11) NOT NULL COMMENT '商品id',  
  17.   `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',  
  18.   PRIMARY KEY (`id`),  
  19.   KEY `FK_orderdetail_1` (`orders_id`),  
  20.   KEY `FK_orderdetail_2` (`items_id`),  
  21.   CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,  
  22.   CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  23. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;  
  24.   
  25. /*Table structure for table `orders` */  
  26.   
  27. CREATE TABLE `orders` (  
  28.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  29.   `user_id` int(11) NOT NULL COMMENT '下单用户id',  
  30.   `number` varchar(32) NOT NULL COMMENT '订单号',  
  31.   `createtime` datetime NOT NULL COMMENT '创建订单时间',  
  32.   `note` varchar(100) DEFAULT NULL COMMENT '备注',  
  33.   PRIMARY KEY (`id`),  
  34.   KEY `FK_orders_1` (`user_id`),  
  35.   CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  36. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;  
  37.   
  38. /*Table structure for table `user` */  
  39.   
  40. CREATE TABLE `user` (  
  41.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  42.   `username` varchar(32) NOT NULL COMMENT '用户名称',  
  43.   `birthday` date DEFAULT NULL COMMENT '生日',  
  44.   `sex` char(1) DEFAULT NULL COMMENT '性别',  
  45.   `address` varchar(256) DEFAULT NULL COMMENT '地址',  
  46.   PRIMARY KEY (`id`)  
  47. ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;</span>  

2. 实例-- 查询用户表中姓名为“小明”的模糊查询

  在src中建立数据库的配置文件(db.properties)和日志的配置文件(log4j.properties),并创建用户的实体类(User.java)

     db.properties

[html] view plain copy
  1. <span style="font-size:18px;">jdbc.driver=com.mysql.jdbc.Driver  
  2. jdbc.url=jdbc:mysql://localhost:3306/mybatis  
  3. jdbc.username=root  
  4. jdbc.password=mysql</span>  
log4j.properties:

[html] view plain copy
  1. <span style="font-size:18px;"># Global logging configuration  
  2. #\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error  
  3. log4j.rootLogger=DEBUG, stdout  
  4. # Console output...  
  5. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n  
  8. </span>  
 User.java:

[html] view plain copy
  1. <span style="font-size:18px;">package cn.itcast.mybatis.po;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class User {  
  6.       
  7.     //属性名和数据库表的字段对应  
  8.     private int id;  
  9.     private String username;// 用户姓名  
  10.     private String sex;// 性别  
  11.     private Date birthday;// 生日  
  12.     private String address;// 地址  
  13.     public int getId() {  
  14.         return id;  
  15.     }  
  16.     public void setId(int id) {  
  17.         this.id = id;  
  18.     }  
  19.     public String getUsername() {  
  20.         return username;  
  21.     }  
  22.     public void setUsername(String username) {  
  23.         this.username = username;  
  24.     }  
  25.     public String getSex() {  
  26.         return sex;  
  27.     }  
  28.     public void setSex(String sex) {  
  29.         this.sex = sex;  
  30.     }  
  31.     public Date getBirthday() {  
  32.         return birthday;  
  33.     }  
  34.     public void setBirthday(Date birthday) {  
  35.         this.birthday = birthday;  
  36.     }  
  37.     public String getAddress() {  
  38.         return address;  
  39.     }  
  40.     public void setAddress(String address) {  
  41.         this.address = address;  
  42.     }  
  43.     @Override  
  44.     public String toString() {  
  45.         return "User [id=" + id + "username=" + username + "sex=" + sex  
  46.                 + ", birthday=" + birthday + "address=" + address + "]";  
  47.     }  
  48.   
  49.   
  50. }</span>  

      然后建立系统的映射文件sqlMapConfig.xml(用来加载映射文件Mapper):

[html] view plain copy
  1. <span style="font-size:18px;"><?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.   
  7.     <!-- 加载属性文件 -->  
  8.     <properties resource="db.properties">  
  9.         <!--properties中还可以配置一些属性名和属性值  -->  
  10.         <!-- <property name="jdbc.driver" value=""/> -->  
  11.     </properties>  
  12.     <!-- 全局配置参数,需要时再设置 -->  
  13.     <!-- <settings>  
  14.       
  15.     </settings> -->  
  16.       
  17.     <!-- 别名定义 -->  
  18.     <typeAliases>  
  19.           
  20.         <!-- 针对单个别名定义  
  21.         type:类型的路径  
  22.         alias:别名  
  23.          -->  
  24.         <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->  
  25.         <!-- 批量别名定义   
  26.         指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)  
  27.         -->  
  28.         <package name="cn.itcast.mybatis.po"/>  
  29.           
  30.     </typeAliases>  
  31.       
  32.     <!-- 和spring整合后 environments配置将废除-->  
  33.     <environments default="development">  
  34.         <environment id="development">  
  35.         <!-- 使用jdbc事务管理,事务控制由mybatis-->  
  36.             <transactionManager type="JDBC" />  
  37.         <!-- 数据库连接池,由mybatis管理-->  
  38.             <dataSource type="POOLED">  
  39.                 <property name="driver" value="${jdbc.driver}" />  
  40.                 <property name="url" value="${jdbc.url}" />  
  41.                 <property name="username" value="${jdbc.username}" />  
  42.                 <property name="password" value="${jdbc.password}" />  
  43.             </dataSource>  
  44.         </environment>  
  45.     </environments>  
  46.     <!-- 加载 映射文件 -->  
  47.     <mappers>  
  48.         <mapper resource="sqlmap/User.xml"/>  
  49.           
  50.         <!--通过resource方法一次加载一个映射文件 -->  
  51.         <!-- <mapper resource="mapper/UserMapper.xml"/> -->  
  52.           
  53.         <!-- 通过mapper接口加载单个 映射文件  
  54.         遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中  
  55.         上边规范的前提是:使用的是mapper代理方法  
  56.          -->  
  57.         <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->  
  58.           
  59.         <!-- 批量加载mapper  
  60.         指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载  
  61.         遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中  
  62.         上边规范的前提是:使用的是mapper代理方法  
  63.          -->  
  64.         <package name="cn.itcast.mybatis.mapper"/>  
  65.   
  66.     </mappers>  
  67.       
  68. </configuration>  
  69. </span>  
    在上述文件的路径“cn.itcast.mybatis.mapper”下建立用户的实体文件(UserMapper.java)和实体映射文件(UserMapper.xml);

       UserMapper.java(主要是mapper的代理接口)

[java] view plain copy
  1. <span style="font-size:18px;">package cn.itcast.mybatis.mapper;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.itcast.mybatis.po.User;  
  6. import cn.itcast.mybatis.po.UserCustom;  
  7. import cn.itcast.mybatis.po.UserQueryVo;  
  8.   
  9. public interface UserMapper {  
  10.   
  11.     //根据用户名列模糊查询用户列表  
  12.     public List<User> findUserByName(String name)throws Exception;  
  13.       
  14. }  
  15. </span>  

      UserMapper的实体映射文件(编辑程序功能用到的sql语句)

[html] view plain copy
  1. <span style="font-size:18px;"><?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.   
  6. <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离   
  7. 注意:使用mapper代理方法开发,namespace有特殊重要的作用  
  8. -->  
  9. <mapper namespace="test">  
  10.   
  11.     <!-- 根据用户名称模糊查询用户信息,可能返回多条  
  12.     resultType:指定就是单条记录所映射的java对象 类型  
  13.     ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。  
  14.     使用${}拼接sql,引起 sql注入  
  15.     ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value  
  16.      -->  
  17.     <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">  
  18.         SELECT * FROM USER WHERE username LIKE '%${value}%'  
  19.     </select>  
  20.           
  21. </mapper>  
  22. </span>  

PS:【与hibernate框架中的层结构一样都需要dao和daoImpl,这里dao和daoImpl就不再赘述】:

上述的准备工作都准备完毕之后,我们建立一个单元测试代码如下;

[java] view plain copy
  1. <span style="font-size:18px;">package cn.itcast.mybatis.first;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  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. import org.junit.Test;  
  13.   
  14. import cn.itcast.mybatis.po.User;  
  15.   
  16. public class MybatisFirst {  
  17.   
  18.     // 根据用户名称模糊查询用户列表  
  19.     @Test  
  20.     public void findUserByNameTest() throws IOException {  
  21.         // mybatis配置文件  
  22.         String resource = "SqlMapConfig.xml";  
  23.         // 得到配置文件流  
  24.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  25.   
  26.         // 创建会话工厂,传入mybatis的配置文件信息  
  27.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()  
  28.                 .build(inputStream);  
  29.   
  30.         // 通过工厂得到SqlSession  
  31.         SqlSession sqlSession = sqlSessionFactory.openSession();  
  32.         // list中的user和映射文件中resultType所指定的类型一致  
  33.         List<User> list = sqlSession.selectOne("test.findUserByName""小明");  
  34.         System.out.println(list);  
  35.         sqlSession.close();  
  36.   
  37.     }  
  38. }  
  39. </span>  
 到这里,使用mybatis+ mysql 实现模糊查询的功能就实现了,有兴趣的可以动手尝试一下;

三、总结

         mybatis是Apache下的顶级项目,是一个持久层框架,是一个不完全的ORM框架;

        mybatis使得程序将主要精力放在了sql上,它通过自身提供的映射方式,自由且灵活地生成满足程序需要的sql语句(半自动化,大部分需要程序员自己编写);

        mybatis可以将向PreparedStatement中输入的参数自动进行输入映射,将查询结果集灵活映射成Java对象(输出映射);

      以上是小编对mybatis基础的整理,希望能帮大家更好的了解MyBatis!如有更好的建议或者意见,请留言!