Mybatis基本信息
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,
将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
特点
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
-
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
搭建mybatis框架环境
1、创建maven工程
右键选择New、Module,选择左侧的maven、更换jdk、下方选择框打勾然后搜索webapp、Ctrl+下方向键选择图中相同版本的webapp。
2、导入相关pom依赖
pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.yuan</groupId> 8 <artifactId>mybatis01</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <packaging>war</packaging> 11 12 <name>mybatis01 Maven Webapp</name> 13 <!-- FIXME change it to the project's website --> 14 <url>http://www.example.com</url> 15 16 <properties> 17 <maven.compiler.source>1.8</maven.compiler.source> 18 <maven.compiler.target>1.8</maven.compiler.target> 19 </properties> 20 21 22 <dependencies> 23 <!-- ********************** junit单元测试依赖 ********************** --> 24 <dependency> 25 <groupId>junit</groupId> 26 <artifactId>junit</artifactId> 27 <version>4.12</version> 28 <scope>test</scope> 29 </dependency> 30 31 <!-- ********************** Java Servlet API ********************** --> 32 <dependency> 33 <groupId>javax.servlet</groupId> 34 <artifactId>javax.servlet-api</artifactId> 35 <version>4.0.0</version> 36 <scope>provided</scope> 37 </dependency> 38 39 <!-- ********************** Mybatis依赖 ********************** --> 40 <dependency> 41 <groupId>org.mybatis</groupId> 42 <artifactId>mybatis</artifactId> 43 <version>3.4.5</version> 44 </dependency> 45 46 <!-- ********************** Mysql JDBC驱动 ********************** --> 47 <dependency> 48 <groupId>mysql</groupId> 49 <artifactId>mysql-connector-java</artifactId> 50 <version>5.1.44</version> 51 </dependency> 52 53 <!-- ********************** 日志配置 ********************** --> 54 <!--记得修改mybatis.cfg.xml添加如下内容--> 55 <!--<setting name="logImpl" value="LOG4J2"/>--> 56 <!--核心log4j2jar包--> 57 <dependency> 58 <groupId>org.apache.logging.log4j</groupId> 59 <artifactId>log4j-core</artifactId> 60 <version>2.9.1</version> 61 </dependency> 62 <dependency> 63 <groupId>org.apache.logging.log4j</groupId> 64 <artifactId>log4j-api</artifactId> 65 <version>2.9.1</version> 66 </dependency> 67 <!--web工程需要包含log4j-web,非web工程不需要--> 68 <dependency> 69 <groupId>org.apache.logging.log4j</groupId> 70 <artifactId>log4j-web</artifactId> 71 <version>2.9.1</version> 72 </dependency> 73 </dependencies> 74 75 <build> 76 <finalName>mybatis01</finalName> 77 <resources> 78 <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--> 79 <resource> 80 <directory>src/main/java</directory> 81 <includes> 82 <include>**/*.xml</include> 83 </includes> 84 </resource> 85 <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--> 86 <resource> 87 <directory>src/main/resources</directory> 88 <includes> 89 <include>jdbc.properties</include> 90 <include>*.xml</include> 91 </includes> 92 </resource> 93 </resources> 94 95 <plugins> 96 <plugin> 97 <groupId>org.mybatis.generator</groupId> 98 <artifactId>mybatis-generator-maven-plugin</artifactId> 99 <version>1.3.2</version> 100 <dependencies> 101 <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --> 102 <dependency> 103 <groupId>mysql</groupId> 104 <artifactId>mysql-connector-java</artifactId> 105 <version>5.1.44</version> 106 </dependency> 107 </dependencies> 108 <configuration> 109 <overwrite>true</overwrite> 110 </configuration> 111 </plugin> 112 </plugins> 113 </build> 114 </project>
3、Mybatis相关插件安装
顶部工具栏处找到扳手图标(setting),选择图中底部的按钮
Free mybatis plugin --我这里是已经下载好了,没下载的右侧会有一个install,下载完之后再点击右侧的按钮(重启IDEA生效)
Mybatis generator
mybatis tools
maven helper
全部下载后关闭IDEA再重启
4、Mybatis.cfg.xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入外部配置文件 --> <properties resource="jdbc.properties"/> <settings> <setting name="logImpl" value="LOG4J2"/> </settings> <!-- 别名 --> <typeAliases> <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>--> </typeAliases> <!-- 配置mybatis运行环境 --> <environments default="development"> <environment id="development"> <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 --> <transactionManager type="jdbc"/> <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC数据源连接池 --> <!-- UNPOOLED 表示不支持数据源连接池 --> <!-- JNDI 表示支持外部数据源连接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/yuan/mapper/BookMapper.xml"/> </mappers> </configuration>
基于ssm逆向工程的使用
1、安装Mybatis generator插件 上一步已完成
2、配置generatorConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" 3 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > 4 <generatorConfiguration> 5 <!-- 引入配置文件 --> 6 <properties resource="jdbc.properties"/> 7 8 <!--指定数据库jdbc驱动jar包的位置--> 9 <classPathEntry location="D:Maven-folderapache-maven-3.5.0-binapache-maven-3.5.0mvn_repositorymysqlmysql-connector-java5.1.44mysql-connector-java-5.1.44.jar"/> 10 11 <!-- 一个数据库一个context --> 12 <context id="infoGuardian"> 13 <!-- 注释 --> 14 <commentGenerator> 15 <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> 16 <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --> 17 </commentGenerator> 18 19 <!-- jdbc连接 --> 20 <jdbcConnection driverClass="${jdbc.driver}" 21 connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> 22 23 <!-- 类型转换 --> 24 <javaTypeResolver> 25 <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> 26 <property name="forceBigDecimals" value="false"/> 27 </javaTypeResolver> 28 29 <!-- 01 指定javaBean生成的位置 --> 30 <!-- targetPackage:指定生成的model生成所在的包名 --> 31 <!-- targetProject:指定在该项目下所在的路径 --> 32 <javaModelGenerator targetPackage="com.yuan.model" 33 targetProject="src/main/java"> 34 <!-- 是否允许子包,即targetPackage.schemaName.tableName --> 35 <property name="enableSubPackages" value="false"/> 36 <!-- 是否对model添加构造函数 --> 37 <property name="constructorBased" value="true"/> 38 <!-- 是否针对string类型的字段在set的时候进行trim调用 --> 39 <property name="trimStrings" value="false"/> 40 <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --> 41 <property name="immutable" value="false"/> 42 </javaModelGenerator> 43 44 <!-- 02 指定sql映射文件生成的位置 --> 45 <sqlMapGenerator targetPackage="com.yuan.mapper" 46 targetProject="src/main/java"> 47 <!-- 是否允许子包,即targetPackage.schemaName.tableName --> 48 <property name="enableSubPackages" value="false"/> 49 </sqlMapGenerator> 50 51 <!-- 03 生成XxxMapper接口 --> 52 <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 --> 53 <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 --> 54 <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> 55 <javaClientGenerator targetPackage="com.yuan.mapper" 56 targetProject="src/main/java" type="XMLMAPPER"> 57 <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> 58 <property name="enableSubPackages" value="false"/> 59 </javaClientGenerator> 60 61 <!-- 配置表信息 --> 62 <!-- schema即为数据库名 --> 63 <!-- tableName为对应的数据库表 --> 64 <!-- domainObjectName是要生成的实体类 --> 65 <!-- enable*ByExample是否生成 example类 --> 66 <!--<table schema="" tableName="t_book" domainObjectName="Book"--> 67 <!--enableCountByExample="false" enableDeleteByExample="false"--> 68 <!--enableSelectByExample="false" enableUpdateByExample="false">--> 69 <!--<!– 忽略列,不生成bean 字段 –>--> 70 <!--<!– <ignoreColumn column="FRED" /> –>--> 71 <!--<!– 指定列的java数据类型 –>--> 72 <!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>--> 73 <!--</table>--> 74 75 <table schema="" tableName="t_mvc_book" domainObjectName="Book" 76 enableCountByExample="false" enableDeleteByExample="false" 77 enableSelectByExample="false" enableUpdateByExample="false"> 78 </table> 79 80 </context> 81 </generatorConfiguration>
3、配置maven运行generator命令
点击左上角的+号、选择maven,右侧name(名称,可随意取),Working directory:需配置该命令的项目路径,Command line:mybatis-generator:generate -e ;
mybatis增删改案例
SessionUtil.java
1 package com.yuan.util; 2 3 import org.apache.ibatis.session.SqlSession; 4 import org.apache.ibatis.session.SqlSessionFactory; 5 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 6 7 8 public class SessionUtil { 9 private static SqlSessionFactory sessionFactory; 10 private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); 11 static { 12 sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml")); 13 } 14 15 public static SqlSession openSession() { 16 SqlSession session = threadLocal.get(); 17 if (null == session) { 18 session = sessionFactory.openSession(); 19 threadLocal.set(session); 20 } 21 return session; 22 } 23 24 public static void main(String[] args) { 25 SqlSession session = openSession(); 26 System.out.println(session.getConnection()); 27 session.close(); 28 // System.out.println(session.getConnection()); 29 } 30 }
BookService.java
1 package com.yuan.service; 2 3 import com.yuan.model.Book; 4 5 public interface BookService { 6 7 int deleteByPrimaryKey(Integer bid); 8 9 int insert(Book record); 10 11 int insertSelective(Book record); 12 13 Book selectByPrimaryKey(Integer bid); 14 15 int updateByPrimaryKeySelective(Book record); 16 17 int updateByPrimaryKey(Book record); 18 19 }
BookServiceImpl.java
1 package com.yuan.service.impl; 2 3 import com.yuan.mapper.BookMapper; 4 import com.yuan.model.Book; 5 import com.yuan.service.BookService; 6 7 public class BookServiceImpl implements BookService { 8 private BookMapper bookMapper; 9 10 public BookMapper getBookMapper() { 11 return bookMapper; 12 } 13 14 public void setBookMapper(BookMapper bookMapper) { 15 this.bookMapper = bookMapper; 16 } 17 18 @Override 19 public int deleteByPrimaryKey(Integer bid) { 20 return bookMapper.deleteByPrimaryKey(bid); 21 } 22 23 @Override 24 public int insert(Book record) { 25 return bookMapper.insert(record); 26 } 27 28 @Override 29 public int insertSelective(Book record) { 30 return bookMapper.insertSelective(record); 31 } 32 33 @Override 34 public Book selectByPrimaryKey(Integer bid) { 35 return bookMapper.selectByPrimaryKey(bid); 36 } 37 38 @Override 39 public int updateByPrimaryKeySelective(Book record) { 40 return bookMapper.updateByPrimaryKeySelective(record); 41 } 42 43 @Override 44 public int updateByPrimaryKey(Book record) { 45 return bookMapper.updateByPrimaryKey(record); 46 } 47 }
BookServiceImplTest.java
1 package com.yuan.service; 2 3 4 import com.yuan.mapper.BookMapper; 5 import com.yuan.model.Book; 6 import com.yuan.service.impl.BookServiceImpl; 7 import com.yuan.util.SessionUtil; 8 import org.apache.ibatis.session.SqlSession; 9 import org.junit.After; 10 import org.junit.Before; 11 import org.junit.Test; 12 13 14 public class BookServiceTest{ 15 16 private BookService bookService; 17 private SqlSession sqlSession; 18 @Before 19 public void setUp(){ 20 BookServiceImpl bookService = new BookServiceImpl(); 21 sqlSession = SessionUtil.openSession(); 22 23 BookMapper mapper = sqlSession.getMapper(BookMapper.class); 24 bookService.setBookMapper(mapper); 25 this.bookService = bookService; 26 } 27 28 @Test 29 public void insert() { 30 Book book = new Book(); 31 book.setBid(1); 32 book.setBname("mybatis插入"); 33 book.setPrice(33f); 34 bookService.insert(book); 35 } 36 37 @Test 38 public void selectByPrimaryKey() { 39 // Book book = this.bookService.selectByPrimaryKey(27); 40 this.bookService.deleteByPrimaryKey(1); 41 // System.out.println(book); 42 } 43 @After 44 public void tearDown()throws Exception{ 45 sqlSession.commit(); 46 sqlSession.close(); 47 } 48 }