准备数据库表
1. CREATE TABLE `t_car` ( 2. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', 3. `car_num` varchar(100) DEFAULT NULL COMMENT '汽车编号', 4. `brand` varchar(100) DEFAULT NULL COMMENT '品牌', 5. `guide_price` decimal(10,0) DEFAULT NULL COMMENT '指导价', 6. `produce_time` varchar(10) DEFAULT NULL COMMENT '生成时间', 7. `car_type` varchar(100) DEFAULT NULL COMMENT '汽车类型', 8. PRIMARY KEY (`id`) 9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
搭建工程
创建Project:建议创建Empty Project,设置Java版本以及编译版本等。
创建Module:普通的Maven Java模块
打包方式:jar(不需要war,因为mybatis封装的是jdbc。)
1. <groupId>com.study</groupId> 2. <artifactId>mybatis001</artifactId> 3. <packaging>jar</packaging> 4. <version>1.0-SNAPSHOT</version>
引入依赖(mybatis依赖 + mysql驱动依赖)
1. <dependencies> 2. <!--mybatis核心依赖--> 3. <dependency> 4. <groupId>org.mybatis</groupId> 5. <artifactId>mybatis</artifactId> 6. <version>3.5.10</version> 7. </dependency> 8. <!--mysql驱动依赖--> 9. <dependency> 10. <groupId>mysql</groupId> 11. <artifactId>mysql-connector-java</artifactId> 12. <version>8.0.30</version> 13. </dependency> 14. </dependencies>
在resources根目录下新建mybatis-config.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. <environments default="development"> 7. <environment id="development"> 8. <transactionManager type="JDBC"/> 9. <dataSource type="POOLED"> 10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/> 11. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> 12. <property name="username" value="root"/> 13. <property name="password" value="newroot"/> 14. </dataSource> 15. </environment> 16. </environments> 17. <mappers> 18. <!--sql映射文件创建好之后,需要将该文件路径配置到这里--> 19. <mapper resource=""/> 20. </mappers> 21. </configuration>
注意1:mybatis核心配置文件的文件名不一定是mybatis-config.xml,可以是其它名字。
注意2:mybatis核心配置文件存放的位置也可以随意。这里选择放在resources根下,相当于放到了类的根路径下。
在resources根目录下新建CarMapper.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先随意写一个--> 6. <mapper namespace="car"> 7. <!--insert sql:保存一个汽车信息--> 8. <insert id="insertCar"> 9. insert into t_car 10. (id,car_num,brand,guide_price,produce_time,car_type) 11. values 12. (null,'102','丰田mirai',40.30,'2014-10-05','氢能源') 13. </insert> 14. </mapper>
- 注意1:sql语句最后结尾可以不写“;”
- 注意2:CarMapper.xml文件的名字不是固定的。可以使用其它名字。
- 注意3:CarMapper.xml文件的位置也是随意的。这里选择放在resources根下,相当于放到了类的根路径下。
- 注意4:将CarMapper.xml文件路径配置到mybatis-config.xml:
编写MyBatisIntroductionTest代码
1. /** 2. * @author 风轻云淡 3. */ 4. public class MybatisIntroductionTest { 5. public static void main(String[] args) { 6. //1.创建sqlSessionFactorBuilder对象 7. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 8. //2.创建sqlSessionFactor对象 9. InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml"); 10. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); 11. //3.创建sqlSession对象 12. SqlSession sqlSession = sqlSessionFactory.openSession(); 13. //4.执行sql语句 14. //insertCar为执行sql语句的id 15. int count = sqlSession.insert("insertCar"); 16. System.out.println("插入数据条数:"+count); 17. //5.提交(mybatis默认采用的事务管理器为JDBC,默认是不提交的,需要手动提交) 18. sqlSession.commit(); 19. //6.关闭资源 20. sqlSession.close(); 21. 22. } 23. }
注意1:默认采用的事务管理器是:JDBC。JDBC事务默认是不提交的,需要手动提交。
核心配置文件的名字是随意的,因为以下的代码:
1. // 文件名是出现在程序中的,文件名如果修改了,对应这里的java程序也改一下就行了。 2. InputStream is = Thread.currentThread().getContextClassLoader() 3. .getResourceAsStream("mybatis-config.xml");
mybatis核心配置文件的名字是随意的,存放路径也是随意的。
虽然mybatis核心配置文件的名字不是固定的,但通常该文件的名字叫做:mybatis-config.xml
虽然mybatis核心配置文件的路径不是固定的,但通常该文件会存放到类路径当中,这样让项目的移植更加健壮。
- 在mybatis中提供了一个类:Resources【org.apache.ibatis.io.Resources】,该类可以从类路径当中获取资源,我们通常使用它来获取输入流InputStream,代码如下
1. // 这种方式只能从类路径当中获取资源,也就是说mybatis-config.xml文件需要在类路径下。 2. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
运行程序,查看运行结果,以及数据库表中的数据:
完整规范写法
1. public class MyBatisCompleteCodeTest { 2. public static void main(String[] args) { 3. SqlSession sqlSession = null; 4. try { 5. // 1.创建SqlSessionFactoryBuilder对象 6. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 7. // 2.创建SqlSessionFactory对象 8. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml")); 9. // 3.创建SqlSession对象 10. sqlSession = sqlSessionFactory.openSession(); 11. // 4.执行SQL 12. int count = sqlSession.insert("insertCar"); 13. System.out.println("更新了几条记录:" + count); 14. // 5.提交 15. sqlSession.commit(); 16. } catch (Exception e) { 17. // 回滚 18. if (sqlSession != null) { 19. sqlSession.rollback(); 20. } 21. e.printStackTrace(); 22. } finally { 23. // 6.关闭 24. if (sqlSession != null) { 25. sqlSession.close(); 26. } 27. } 28. } 29. }
引入日志框架lockback
- 引入日志框架的目的是为了看清楚mybatis执行的具体sql。
- 启用标准日志组件,只需要在mybatis-config.xml文件中添加以下配置:【可参考mybatis手册】
mybatis-config.xml修改增加:
1. <settings> 2. <setting name="logImpl" value="STDOUT_LOGGING" /> 3. </settings>
标准日志也可以用,但是配置不够灵活,可以集成其他的日志组件,例如:log4j,logback等。
- logback是目前日志框架中性能较好的,较流行的,所以我们选它。
- 引入logback的步骤:
- 第一步:引入logback相关依赖
1. <dependency> 2. <groupId>ch.qos.logback</groupId> 3. <artifactId>logback-classic</artifactId> 4. <version>1.2.11</version> 5. </dependency>
- 第二步:引入logback相关配置文件(文件名叫做logback.xml或logback-test.xml,放到类路径当中)
1. <?xml version="1.0" encoding="UTF-8"?> 2. 3. <configuration debug="false"> 4. <!-- 控制台输出 --> 5. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 6. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 7. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 8. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> 9. </encoder> 10. </appender> 11. <!-- 按照每天生成日志文件 --> 12. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 13. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 14. <!--日志文件输出的文件名--> 15. <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern> 16. <!--日志文件保留天数--> 17. <MaxHistory>30</MaxHistory> 18. </rollingPolicy> 19. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 20. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 21. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> 22. </encoder> 23. <!--日志文件最大的大小--> 24. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 25. <MaxFileSize>100MB</MaxFileSize> 26. </triggeringPolicy> 27. </appender> 28. 29. <!--mybatis log configure--> 30. <logger name="com.apache.ibatis" level="TRACE"/> 31. <logger name="java.sql.Connection" level="DEBUG"/> 32. <logger name="java.sql.Statement" level="DEBUG"/> 33. <logger name="java.sql.PreparedStatement" level="DEBUG"/> 34. 35. <!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR --> 36. <root level="DEBUG"> 37. <appender-ref ref="STDOUT"/> 38. <appender-ref ref="FILE"/> 39. </root> 40. 41. </configuration>
再次执行main方法
SqlSessionUtil工具类封装
- 每一次获取SqlSession对象代码太繁琐,封装一个工具类
1. 2. /** 3. * @author 风轻云淡 4. */ 5. public class SqlSessionUtil { 6. private static SqlSessionFactory sqlSessionFactory; 7. 8. /** 9. * 类加载时初始化sqlSessionFactory对象 10. */ 11. static { 12. try { 13. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 14. sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml")); 15. } catch (Exception e) { 16. e.printStackTrace(); 17. } 18. } 19. 20. /** 21. * 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。 22. * 23. * @return 新的会话对象 24. */ 25. public static SqlSession openSession() { 26. return sqlSessionFactory.openSession(true); 27. } 28. }