Mybatis系列是学习笔记,是阅读路人甲java的原创博客,然后跟着步骤写的,主要是为了加深理解。有兴趣的同学可以直接去原创作者处查看博客:
链接如下:https://home.cnblogs.com/u/itsoku123/
本文是Mybatis学习系列的第一篇博客,分为两部分:一部分是Mybatis入门,Mybatis-generator逆向工程的使用,另一部分是Mybatis的部分基础内容。
一、Mybatis-generator逆向工程。
1、创建maven项目。
2、往pom文件中添加配置。<configurationFile>标签注意填写全路径名称,我这跑项目的时候写相对路径名称会提示找不到配置文件。
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> </dependencies> <executions> <execution> <id>Generate MyBatis Artifacts</id> <phase>package</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!--允许移动生成的文件 --> <verbose>true</verbose> <!-- 是否覆盖 --> <overwrite>true</overwrite> <!-- 自动生成的配置 --> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> </configuration> </plugin> </plugins> </build>
3、在resources文件下,创建generatorConfig.xml文件。并增加配置。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!--加载配置文件,为下面读取数据库信息准备--> <properties resource="application.properties"/> <!--defaultModelType="flat" 大数据字段,不分表 --> <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <property name="autoDelimitKeywords" value="true" /> <property name="beginningDelimiter" value="`" /> <property name="endingDelimiter" value="`" /> <property name="javaFileEncoding" value="utf-8" /> <plugin type="org.mybatis.generator.plugins.SerializablePlugin" /> <plugin type="org.mybatis.generator.plugins.ToStringPlugin" /> <!-- 注释 --> <commentGenerator > <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳--> </commentGenerator> <!-- 数据库链接地址账号密码 --> <jdbcConnection driverClass="${spring.datasource.driver-class-name}" connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}" password="${spring.datasource.password}"> </jdbcConnection> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="true"/> </javaTypeResolver> <!-- 生成Model类存放位置 --> <javaModelGenerator targetPackage="entity" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成mapxml文件 --> <!-- 配置存放dao层的包名为dao --> <sqlMapGenerator targetPackage="dao" targetProject="src/main/java" > <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 生成mapxml对应client,也就是接口dao --> <javaClientGenerator targetPackage="dao" targetProject="src/main/java" type="XMLMAPPER" > <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- domainObjectName用来自定义生成的实体类名 --> <!-- mapperName用来自定义生成的dao接口和xml文件名字 --> <table tableName="t_user" domainObjectName="User" mapperName="UserDao" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <generatedKey column="id" sqlStatement="Mysql" identity="true" /> </table> </context> </generatorConfiguration>
4、在resources文件下,创建application.properties,与generatorConfig.xml的<properties resource="application.properties"/>相关,用来设置数据的相关信息。
spring.datasource.url=jdbc:mysql://localhost:3306/code2020?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
5、在MavenProject中选中Plugins,运行mybatis-generator插件下的mybatis-gennerator:generator命令。
6、生成的结果如下所示,选中文件将其复制到具体路径下。
二、Mybatis相关基础
1、maven项目搭建
2、添加pom文件的依赖,若是pom文件中没有添加<resources>,mybatis默认获取解析resources文件下的xml文件,添加了这个标签之后,可以解析存放在src/java路径下的其他xml文件。
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!--日志相关--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
3、在resources文件下,添加mybatis-config.xml及log4j.properties相关配置文件,用来添加mybatis和日志打印的配置。
mybatis-config.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> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/code2020?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!--此处用的是引用到具体xml文件的方式--> <!--<mapper resource="dao/UserDao.xml"/>--> <package name="dao"/> </mappers> </configuration>
log4j.properties文件
log4j.debug=true log4j.rootLogger=INFO,D,E,stdout log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = D:/logs/mybatis_chat02_log.log log4j.appender.E.Append = true log4j.appender.E.Threshold = DEBUG log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D:/logs/mybatis_chat02_error.log log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n # Direct log messages to stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout #log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
4、编写简单的test方法,进行数据库的操作。
@Test public void test1() throws Exception { SqlSession sqlSession = null; try { //1.获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); log.info("factory" + sqlSessionFactory); //2.获取sqlSession创建 //设置自动提交 sqlSession = sqlSessionFactory.openSession(true); UserDao dao = sqlSession.getMapper(UserDao.class); //封装对象 User user = new User().builder().name("chat025").age(Short.valueOf("18")).salary(BigDecimal.TEN).startWorkDate(new Date()).build(); int i = dao.insert(user); log.info("插入影响行数:" + i); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } finally { sqlSession.close(); } }
从test方法中可以看出,mybatis操作数据库只要是如下的步骤:
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserDao dao = sqlSession.getMapper(UserDao.class);
SqlSessionFactoryBuilder:用来构建SqlSessionFactory对象,SqlSessionFactoryBuilder对mybatis配置文件、mapper xml
文件、mapper xml
文件和Mapper 接口
的映射关系,进行解析,解析配置之后,生成了SqlSessionFactory对象
,创建这个是比较耗时的,所以一般我们的服务在启动时会根据db配置生成一个SqlSessionFactory
对象,然后在系统运行过程中会一直存在,而SqlSessionFactoryBuilder用完了就可以释放了。
SqlSessionFactory:是一个接口,这个接口有2个实现DefaultSqlSessionFactory(DefaultSqlSessionFactory只实现了SqlSessionFactory)
和SqlSessionManager(SqlSessionManager同时实现SqlSessionFactory和SqlSession)
,一般都是通过SqlSessionFactoryBuilder
来创建SqlSessionFactory
对象。SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次的创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。 为此,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。
SqlSession:sql会话对象,一个db的操作需要创建一个SqlSession对象。
Mapper接口: 可以直接使用SqlSession直接调用xml中的db操作,不过更简单的以及推荐的方式是使用Dao层接口,接口中的方法和xml文件中的db操作
建立了映射关系,接口完整名称 + 方法名称
和xml
中的namespace + 具体操作的id
来进行关联的,然后直接调用接口的方法就可以进行db操作了,接口需要通过SqlSession
获取,传入接口对应的Class
对象,就能得到这个接口的实例。