JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用

这篇博客介绍了MyBatis的基本概念和开发环境,包括JDBC编程的问题、MyBatis架构及优势。通过实例演示了MyBatis的入门程序,包括如何设置别名、抽取代码块、使用动态SQL,以及实现增删改查操作。还讨论了MyBatis的DAO开发方式,包括原始DAO和mapper代理方式,并提供了SqlMapConfig.xml的配置详解。
摘要由CSDN通过智能技术生成

mybatis简介

 mybatis是一个Java持久层框架,Java中操作关系型数据库使用的是jdbc,mybatis是对jdbc的封装。

mybatis的入门需要掌握以下几点:

1、使用jdbc程序使用原生态的jdbc进行开发存在很多弊端,优点是执行效率高,mybatis弥补了jdbc的缺陷。

2、mybatis的架构(重点)。

3、mybatis的入门程序(重点)。

     实现数据的查询、添加、修改、删除

4、mybatis开发DAO的两种方法(重点)

     原始的DAO开发方式(DAO接口和DAO实现都需要编写)

     mapper代理方式(只需要编写DAO接口)

5、输入映射类型和输出映射类型

6、动态SQL

mybatis的高级知识主要包括以下几点:

高级映射查询(一对一、一对多、多对多)(重点)

查询缓存

延迟加载

mybatis和spring整合(重点)

mybatis逆向工程

开发环境(eclipse、MySQL)

创建数据库

创建数据库mybatis

新建表结构:

sql_table.sql

  1. *  
  2. SQLyog v10.2   
  3. MySQL - 5.1.72-community : Database - mybatis  
  4. *********************************************************************  
  5. */  
  6.   
  7.   
  8. /*!40101 SET NAMES utf8 */;  
  9.   
  10. /*!40101 SET SQL_MODE=''*/;  
  11.   
  12. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;  
  13. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;  
  14. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;  
  15. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;  
  16. /*Table structure for table `items` */  
  17.   
  18. CREATE TABLE `items` (  
  19.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  20.   `namevarchar(32) NOT NULL COMMENT '商品名称',  
  21.   `price` float(10,1) NOT NULL COMMENT '商品定价',  
  22.   `detail` text COMMENT '商品描述',  
  23.   `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',  
  24.   `createtime` datetime NOT NULL COMMENT '生产日期',  
  25.   PRIMARY KEY (`id`)  
  26. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;  
  27.   
  28. /*Table structure for table `orderdetail` */  
  29.   
  30. CREATE TABLE `orderdetail` (  
  31.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  32.   `orders_id` int(11) NOT NULL COMMENT '订单id',  
  33.   `items_id` int(11) NOT NULL COMMENT '商品id',  
  34.   `items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',  
  35.   PRIMARY KEY (`id`),  
  36.   KEY `FK_orderdetail_1` (`orders_id`),  
  37.   KEY `FK_orderdetail_2` (`items_id`),  
  38.   CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,  
  39.   CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  40. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;  
  41.   
  42. /*Table structure for table `orders` */  
  43.   
  44. CREATE TABLE `orders` (  
  45.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  46.   `user_id` int(11) NOT NULL COMMENT '下单用户id',  
  47.   `number` varchar(32) NOT NULL COMMENT '订单号',  
  48.   `createtime` datetime NOT NULL COMMENT '创建订单时间',  
  49.   `note` varchar(100) DEFAULT NULL COMMENT '备注',  
  50.   PRIMARY KEY (`id`),  
  51.   KEY `FK_orders_1` (`user_id`),  
  52.   CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
  53. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;  
  54.   
  55. /*Table structure for table `user` */  
  56.   
  57. CREATE TABLE `user` (  
  58.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  59.   `username` varchar(32) NOT NULL COMMENT '用户名称',  
  60.   `birthday` date DEFAULT NULL COMMENT '生日',  
  61.   `sex` char(1) DEFAULT NULL COMMENT '性别',  
  62.   `address` varchar(256) DEFAULT NULL COMMENT '地址',  
  63.   PRIMARY KEY (`id`)  
  64. ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;  
  65.   
  66. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;  
  67. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;  
  68. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;  
  69. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;  
创建数据

sql_data.sql

  1. /*  
  2. SQLyog v10.2   
  3. MySQL - 5.1.72-community : Database - mybatis  
  4. *********************************************************************  
  5. */  
  6.   
  7.   
  8. /*!40101 SET NAMES utf8 */;  
  9.   
  10. /*!40101 SET SQL_MODE=''*/;  
  11.   
  12. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;  
  13. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;  
  14. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;  
  15. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;  
  16. /*Data for the table `items` */  
  17.   
  18. insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2015-02-06 13:23:02');  
  19.   
  20. /*Data for the table `orderdetail` */  
  21.   
  22. insert  into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);  
  23.   
  24. /*Data for the table `orders` */  
  25.   
  26. insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);  
  27.   
  28. /*Data for the table `user` */  
  29.   
  30. insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);  
  31.   
  32. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;  
  33. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;  
  34. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;  
  35. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;  

jdbc编程中的问题

 企业开发中,根据项目大小、特点进行技术选型,jdbc操作数据库时效率时很高的,jdbc也是结束选型的参考

jdbc程序 

 需要数据库驱动包


上边是MySQL的驱动,下边是Oracle的驱动

参考下边一段程序

  1. package test.lx.mybatis.jdbc;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8.   
  9. /** 
  10.  * jdbc的测试程序 
  11.  *  
  12.  * @author lx 
  13.  *  
  14.  */  
  15. public class JdbcTest {  
  16.     public static void main(String[] args) {  
  17.         Connection connection = null;  
  18.         //PreparedStatement是预编译的Statement,通过Statement发起数据库的操作  
  19.         //PreparedStatement防止sql注入,执行数据库效率高  
  20.         PreparedStatement preparedStatement = null;  
  21.         ResultSet resultSet = null;  
  22.           
  23.         try {  
  24.             //加载数据库驱动  
  25.             Class.forName("com.mysql.jdbc.Driver");  
  26.               
  27.             //通过驱动管理类获取数据库链接  
  28.             connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8""root""root");  
  29.             //定义sql语句 ?表示占位符  
  30.         String sql = "select * from user where username = ?" ;  
  31.             //获取预处理statement  
  32.             preparedStatement = connection.prepareStatement(sql);  
  33.             //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值  
  34.             preparedStatement.setString(1"王五");  
  35.             //向数据库发出sql执行查询,查询出结果集  
  36.             resultSet =  preparedStatement.executeQuery();  
  37.             //遍历查询结果集  
  38.             while(resultSet.next()){  
  39.                 System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));  
  40.             }  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         }finally{  
  44.             //释放资源  
  45.             if(resultSet!=null){  
  46.                 try {  
  47.                     resultSet.close();  
  48.                 } catch (SQLException e) {  
  49.                     // TODO Auto-generated catch block  
  50.                     e.printStackTrace();  
  51.                 }  
  52.             }  
  53.             if(preparedStatement!=null){  
  54.                 try {  
  55.                     preparedStatement.close();  
  56.                 } catch (SQLException e) {  
  57.                     // TODO Auto-generated catch block  
  58.                     e.printStackTrace();  
  59.                 }  
  60.             }  
  61.             if(connection!=null){  
  62.                 try {  
  63.                     connection.close();  
  64.                 } catch (SQLException e) {  
  65.                     // TODO Auto-generated catch block  
  66.                     e.printStackTrace();  
  67.                 }  
  68.             }  
  69.   
  70.         }  
  71.   
  72.     }  
  73. }  

jdbc问题总结

1、数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率
      设想:使用数据库连接池
2、SQL语句是硬编码,如果需求变更需要修改SQL,就需要修改Java代码,需要重新编译,系统不易维护。
      设想:将SQL语句统一配置在文件中,修改SQL不需要修改Java代码
3、通过PreparedStatement向占位符设置参数,存在硬编码(参数位置,参数)问题。系统不易维护。
      设想:将SQL中的占位符以及对应的参数类型配置在配置文件中,能够自动输入映射
4、遍历查询结果集中存在硬编码(列名)
      设想:自动进行SQL查询结果向Java对象的映射(输出映射)

mybatis架构(重点)

mybatis介绍:
  • mybatis本是Apache的一个开源项目ibatis,2010年这个项目由Apache software foundation迁移到了Google code,并且改名为mybatis,实质上mybatis对ibatis进行了一些改进。目前mybatis在GitHub上托管。git(分布式版本控制,当前比较流行)
  • mybatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
  • mybatis通过xml或注解的方式将要执行的各种statement( statement、PreparedStatement、CallableStatement)配置起来,并通过Java对象和Statement中的SQL进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL并将结果映射成Java对象并返回。
mybatis架构

mybatis入门程序

需求

实现用户查询:

根据用户的id查询用户的信息(单条记录)

根据用户名模糊查询用户信息(多条记录)

用户添加、用户修改、用删除

导入jar包

从mybatis官网下载地址是: https://github.com/mybatis/mybatis-3/releases


mybatis-3.2.7.pdf —操作手册

mybatis-3.2.7.jar— 核心jar

lib—依赖jar包


工程结构


log4j.properties(公用文件)

建议开发环境中要使用debug

  1. # Global logging configuration\uff0c\u5efa\u8bae\u5f00\u53d1\u73af\u5883\u4e2d\u8981\u7528debug  
  2. log4j.rootLogger=DEBUG, stdout  
  3. # Console output...  
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  6. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n  

SqlMapConfig.xml(公用文件)

通过SqlMapConfig.xml加载mybatis运行环境
  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.             <dataSource type="POOLED">  
  12.                 <property name="driver" value="com.mysql.jdbc.Driver" />  
  13.                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />  
  14.                 <property name="username" value="root" />  
  15.                 <property name="password" value="root" />  
  16.             </dataSource>  
  17.         </environment>  
  18.     </environments>  
  19.   
  20.     <!-- 加載mapper文件 -->  
  21.     <mappers>  
  22.         <mapper resource="sqlmap/User.xml" />  
  23.     </mappers>  
  24. </configuration>  

根据id查询用户

pojo (User.java)
  1. public class User {  
  2.     private int id;  
  3.     private String username; // 用户姓名  
  4.     private String sex; // 性别  
  5.     private Date birthday; // 生日  
  6.     private String address; // 地址  
  7.         // 添加对应的setter和getter方法  
  8.         ......  
  9. }  
User.xml (重点)
建议命名规则:表名+mapper.xml
早期ibatis命名规则:表名.xml
  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命名空间,为了对SQL语句进行隔离,方便管理,mapper可开发dao方式,使用namespace有特殊作用   
  6. mapper代理开发时将namespace指定为mapper接口的全限定名 -->  
  7. <mapper namespace="test">  
  8. <!-- 在mapper.xml文件中配置很多的SQL语句,执行每个SQL语句时,封装为MappedStatement对象  
  9. mapper.xml以statement为单位管理SQL语句  
  10.  -->  
  11.    
  12.  <!-- 根据id查询用户信息 -->  
  13.  <!--   
  14.     id: 唯一标识一个statement  
  15.     #{}:表示一个占位符,如果#{} 中传入简单类型的参数,#{}中的名称随意  
  16.     parameterType: 输入参数的类型,通过#{}接收parameterType输入的参数  
  17.     resultType:输出结果类型,指定单条记录映射的pojo类型  
  18.   -->  
  19.   <select id="findUserById" parameterType="int" resultType="test.lx.mybatis.po.User">  
  20.      SELECT * FROM USER WHERE id=#{id};  
  21.   </select>  
  22.     
  23. </mapper>  
编码
创建SqlSessionFactory
  1.               // 会话工厂  
  2. private SqlSessionFactory sqlSessionFactory;  
  3. // 创建工厂  
  4. @Before  
  5. public void init() throws IOException {  
  6.   
  7.     // 配置文件(SqlMapConfig.xml)  
  8.     String resource = "SqlMapConfig.xml";  
  9.   
  10.     // 加载配置文件到输入 流  
  11.     InputStream inputStream = Resources.getResourceAsStream(resource);  
  12.   
  13.     // 创建会话工厂  
  14.     sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  15.   
  16. }  
  17.   
  18. // 测试根据id查询用户(得到单条记录)  
  19. @Test  
  20. public void testFindUserById() {  
  21.   
  22.     // 通过sqlSessionFactory创建sqlSession  
  23.   
  24.     SqlSession sqlSession = sqlSessionFactory.openSession();  
  25.   
  26.     // 通过sqlSession操作数据库  
  27.     // 第一个参数:statement的位置,等于namespace+statement的id  
  28.     // 第二个参数:传入的参数  
  29.     User user = null;  
  30.     try {  
  31.         user = sqlSession.selectOne("test.findUserById"1);  
  32.     } catch (Exception e) {  
  33.         e.printStackTrace();  
  34.     } finally {  
  35.         // 关闭sqlSession  
  36.         sqlSession.close();  
  37.     }  
  38.   
  39.     System.out.println(user);  
  40.   
  41. }  

根据用户名称模糊查询用户信息

根据用户名称模糊查询用户信息可能返回多条记录。
User.xml
  1. <!-- 根据用户名称查询用户信息,可能返回多条   
  2.  ${}:表示SQL的拼接,通过${}接收参数,将参数的内容不加任何修饰的拼接在SQL中  
  3.  -->  
  4.  <select id="findUserByName" parameterType="java.lang.String" resultType="test.lx.mybatis.po.User">  
  5.       select * from user where username like '%${value}%'   
  6.  </select>  
  7.    
  8.  <select id="findUserByName2" parameterType="java.lang.String" resultType="test.lx.mybatis.po.User">  
  9.       select * from user where username like #{username}   
  10.  </select>  
编码
  1. // 测试根据名称模糊查询用户(可能得到多条记录)  
  2.         @Test  
  3.         public void testFindUserByName() {  
  4.               
  5.             // 通过sqlSessionFactory创建sqlSession  
  6.               
  7.             SqlSession sqlSession = sqlSessionFactory.openSession();  
  8.               
  9.             // 通过sqlSession操作数据库  
  10.             
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值