赞
踩
掌握了JDBC,就可以学习MyBatis。
DROP TABLE IF EXISTS `t_car`;
CREATE TABLE `t_car` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自然主键,和业务没有关系,自增',
`car_num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车编号',
`brand` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车品牌',
`guide_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '厂商指导价',
`produce_time` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产日期',
`car_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车类型:燃油车 新能源 氢能源',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;
INSERT INTO `t_car` VALUES (1, '1001', '宝马520LI', 10.00, '2020-10-11', '燃油车');
INSERT INTO `t_car` VALUES (2, '1002', '奔驰E 300L', 55.00, '2020-11-11', '新能源');
SET FOREIGN_KEY_CHECKS = 1;
创建一个普通的maven项目
1.配置Maven环境,打包方式设置为jar,加载MyBatis,MySql驱动(在pom.xml中配置)
<!--打包方式--> <packaging>jar</packaging> <dependencies> <!--mybaits以来--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies>
2.在resource文件夹中新建mybatis-config.xml文件
注意:
其中我的mysql数据库账户:root 密码:123456
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/powernode"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="CarMapper.xml"/> </mappers> </configuration>
3.编写XxxMapper.xml文件
<!--insert语句-->
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values (null,'1003','chuyu','30.0','2010-10-11','燃油车');
</insert>
4.在xxxMapper中编写sql代码(在3中已完成)
5.在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径:
<mapper resource="CarMapper.xml"/>
注意:resource属性会自动从类的根路径下开始查找资源。
最后验收成果:编写MyBatis程序。(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查就行了。)
在MyBatis当中,负责执行SQL语句的那个对象叫做什么呢?
SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。
想要获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。
那么怎么获取SqlSessionFactory对象呢?
mybatis的核心对象包括:
它们之间的关系为:
SqlSessionFactoryBuilder —> SqlSessionFactory —>SqlSession
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//Resource.getResourceAsStream默认就是从类的根路径下开始查找资源
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//通过SqlSessionFactoryBuilder中的builder方法获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行SQL语句
int count = sqlSession.insert("insertCar");
System.out.println(count);
//手动提交
sqlSession.commit();
运行程序后,这条数据被成功加添进数据库。
<transactionManager type = "JDBC"/>
SqlSession sqlSession = null; try { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml")); //开始会话(底层开始事务) sqlSession = sqlSessionFactory.openSession(); //执行SQL语句,处理相关业务 int insertCar = sqlSession.insert("insertCar"); System.out.println(insertCar); //执行到这里,没有发生任何异常,提交事务。终止事务。 sqlSession.commit(); } catch (IOException e) { //回滚事务 if (sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); }finally { //关闭会话(释放资源) if (sqlSession != null) { sqlSession.close(); } }
在编写代码中,每次都通过SqlSessionFactoryBuilder三步骤获取session太麻烦,我们编写一个工具类get会比较方便点。
//工具类的构造方法一般都是私有化的。 //工具类中所有的方法都是静态的,直接采用类名即可调用。不需要new对象。 private SqlSessionUtil(){} //为了防止new对象,构造方法私有化。 private static SqlSessionFactory sqlSessionFactory; //类加载时执行 //SqlSessionUtil工具类在第一次加载的时候,解析mybatis-config.xml文件。创建SqlSessionFactory对象。 static { try { sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); } catch (IOException e) { throw new RuntimeException(e); } } /** * 获取会话对象 * @return 会话对象 */ public static SqlSession openSession(){ return sqlSessionFactory.openSession(); }
编写测试程序
public void testInsertCarByUtil(){
SqlSession sqlSession = SqlSessionUtil.openSession();
int insert = sqlSession.insert("insertCar");
System.out.println(insert);
sqlSession.commit();
sqlSession.close();
}
<!--加入junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
public class CarMapperTest { @Test public void insertCar(){ SqlSession sqlSession = null; try { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsReader("mybatis-config.xml")); sqlSession = sqlSessionFactory.openSession(); int count = sqlSession.insert("insertCar"); System.out.println("新增了记录"+count); //提交事务 sqlSession.commit(); } catch (Exception e) { if (sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); }finally { if (sqlSession != null) { sqlSession.close(); } } } }
关于mybaits集成日志文件组件。让我们调试起来更加方便。
<!--日志框架logback-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
注意:这个标签在写的时候要注意顺序,它应该出现在environments标签之前,当然,这个顺序不需要记忆。因为有dtd文件进行约束,我们只要参考dtd约束即可。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
<?xml version="1.0" encoding="UTF-8"?> <!-- 配置文件修改时重新加载,默认true --> <configuration debug="false"> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"> <!-- 输出日志记录格式 --> <pattern>[%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!--mybatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!-- 日志输出级别,LOGBACK日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR--> <root level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </root> </configuration>
除了STDOUT_LOGGING自带日志组件外,其他组件不需要写日志设置。
在mybatis-config.xml中删除日志设置
<!-- 删除这些 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。