MyBatis
mybatis-3.4.6
jdk1.8+
一、mybatis入門
1.依賴jar包
mybatis基礎包
- pom.xml引入依賴
<dependencies>
<!-- mybatis依賴及需要的依賴start -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- mybatis依賴及需要的依賴 end -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
<!-- 2.10及以上版本新增了對java9的特性支持,不兼容 -->
</dependency>
</dependencies>
2. 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">
<!-- 配置文件包含mybatis核心設置 -->
<configuration>
<!-- 引入外部資源文件 -->
<properties resource="db.properties"></properties>
<settings>
<!-- 指定mybatis所用日志的具體實現 -->
<setting name="logImpl" value="LOG4J"/>
<!-- 設置駝峰匹配 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<!-- 設置包掃描(別名) -->
<typeAliases>
<package name="com.zhougl.web.beans" />
</typeAliases>
<!-- 配置環境:可以配置多個環境,default:配置某一個環境的唯一標識,表示默認使用哪個環境 -->
<environments default="development">
<environment id="development">
<!-- 指定事務管理類型,type="JDBC"指直接簡單實用了JDBC提交和回滾設置 -->
<transactionManager type="JDBC" />
<!-- dataSource指配置數據源,type="POOLED"是JDBC連接對象的數據源連接池的實現 -->
<dataSource type="POOLED">
<!-- 配置連接信息 -->
<property name="driver" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 配置持久化類映射文件:用來配置sql語句和結果集類型等 -->
<mappers>
<mapper resource="com/zhougl/web/dao/mapper/PhoneUserMapper.xml" />
</mappers>
</configuration>
3. Mapper映射文件
- PhoneUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace習慣上設置成包名+sql映射文件(PhoneUserMapper.xml去除后綴) -->
<mapper namespace="com.zhougl.web.dao.mapper.PhoneUserMapper">
<resultMap id="BaseResultMap" type="com.zhougl.web.beans.PhoneUser">
<id column="ID" jdbcType="VARCHAR" property="id" />
<result column="NAME" jdbcType="VARCHAR" property="name" />
<result column="BIRTH_DAY" jdbcType="TIMESTAMP" property="birthDay" />
<result column="ID_NO" jdbcType="VARCHAR" property="idNo" />
<result column="MOBILE_TEL" jdbcType="VARCHAR" property="mobileTel" />
<result column="E_MAIL" jdbcType="VARCHAR" property="eMail" />
<result column="PASSWD" jdbcType="VARCHAR" property="passwd" />
<result column="CREATE_DATE" jdbcType="TIMESTAMP" property="createDate" />
</resultMap>
<insert id="insertPhoneUser" parameterType="com.zhougl.web.beans.PhoneUser">
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
select SQ_PHONE_USER_ID.nextval as id from dual
</selectKey>
insert into PHONE_USER (ID, NAME, BIRTH_DAY,
ID_NO, MOBILE_TEL, E_MAIL,
PASSWD, CREATE_DATE)
values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{birthDay,jdbcType=TIMESTAMP},
#{idNo,jdbcType=VARCHAR}, #{mobileTel,jdbcType=VARCHAR}, #{eMail,jdbcType=VARCHAR},
#{passwd,jdbcType=VARCHAR}, #{createDate,jdbcType=TIMESTAMP})
</insert>
<select id="selectPhoneUserById" parameterType="String" resultMap="BaseResultMap">
select * from PHONE_USER where ID=#{id,jdbcType=VARCHAR}
</select>
</mapper>
4.MyBatis完成數據操作代碼
public class BasicMyBaitisTest {
public static void main(String[] args) throws IOException {
//讀取mybatis-config.xml配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//初始化mybatis.創建SQLSessionFactory實例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//創建session實例
SqlSession session = sqlSessionFactory.openSession();
//創建phoneUser 對象
PhoneUser user = new PhoneUser("test", "吳總", new Date(1992, 9, 26), "54232819800130824X", "15555555858", "wuzong@163.com", "123456", new Date());
//插入數據
//session.insert("com.zhougl.web.dao.mapper.PhoneUserMapper.insertPhoneUser", user);
PhoneUser userOne = session.selectOne("com.zhougl.web.dao.mapper.PhoneUserMapper.selectPhoneUserById", "1");
System.out.println(userOne.toString());
//提交事務
session.commit();
//關閉session
session.close();
}
}
//打印結果
PhoneUser [id=1, name=測試, birthDay=Tue Oct 23 00:00:00 CST 1984, idNo=220724198410236590, mobileTel=199123425678, eMail=ces@qq.com, passwd=1, createDate=Thu Nov 22 00:00:00 CST 2018]
5. log4j日志文件配置
#全局日志配置
#log4j.rootLogger=ERROR,stdout
log4j.rootLogger=DEBUG,Console
#MyBatis日志配置
#log4j.logger.com.zhougl.mapper.UserMapper=DEBUG
#控制臺輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
6.mybatis-generator插件使用(快速生成代碼)
- 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="db.properties"></properties>
<!--
出現錯誤:Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
解決辦法:將本地的MAVEN倉庫中的mysql驅動引入進來
-->
<classPathEntry location="D:\Oracle\ojdbc6.jar"/>
<context id="oraclegenerator" targetRuntime="MyBatis3">
<!-- 生成的Java文件的編碼 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化java代碼 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代碼 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<!--不生成注釋-->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 配置數據庫連接 -->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}" />
<!-- java類型處理器
用于處理DB中的類型到Java中的類型,默認使用JavaTypeResolverDefaultImpl;
注意一點,默認會先嘗試使用Integer,Long,Short等來對應DECIMAL和 NUMERIC數據類型;
-->
<javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
<!--
true:使用BigDecimal對應DECIMAL和 NUMERIC數據類型
false:默認,
scale>0;length>18:使用BigDecimal;
scale=0;length[10,18]:使用Long;
scale=0;length[5,9]:使用Integer;
scale=0;length<5:使用Short;
-->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 指定javaBean生成的位置 -->
<javaModelGenerator targetPackage="com.zhougl.web.beans" targetProject="src/main/java" >
<!-- 在targetPackage的基礎上,根據數據庫的schema再生成一層package,最終生成的類放在這個package下,默認為false -->
<property name="enableSubPackages" value="true" />
<!-- 設置是否在getter方法中,對String類型字段調用trim()方法 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.zhougl.web.dao.mapper" targetProject="src/main/java" >
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 指定dao接口生成的位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.zhougl.web.dao" targetProject="src/main/java" >
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- table表生成對應的DoaminObject -->
<!-- 指定表 emp 指定schema 配合enableSubPackages="false" 會讓schema作為包的后綴
這里不指定schema,逆向工程會查詢sysuser都有哪些schema,對每個schema生成對象-->
<table tableName="PHONE_USER" domainObjectName="PhoneUser"></table>
<!-- <table schema="TJ" tableName="tbl_dept" domainObjectName="Department"></table> -->
</context>
</generatorConfiguration>