MyBatis學習小結
阿新 • • 發佈:2019-02-01
mvn package oci alias 命名 LEDE ted request time
一款輕量級的ORM框架
全局配置文件 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加載全局配置, 延遲加載和二級緩存等 --> <settings> <setting name="lazyLoadingEnabled" value="true"> </setting> <!-- 以下配置在mybatis的3.4.1版本後默認為false --> <!-- <setting name="aggressiveLazyLoading" value="false"/> --> <!-- <setting name="cacheEnabled" value="true"/> --> <!-- 使用JDBC的getGeneratedKeys獲取數據庫自增主鍵值,默認為false --> <setting name="useGeneratedKeys" value="true"> </setting> <!-- 使用列別名替換列名,默認為true --> <setting name="useColumnLabel" value="true"> </setting> <!-- 開啟駝峰標識命名轉換,默認為false:Table(create_time) -> Entity(createTime) --> <setting name="mapUnderscoreToCamelCase" value="true"> </setting> </settings> <!-- 定義別名 --> <typealiases> <!-- <typeAlias type="domain.User" alias="user"/> --> <package name="domain"> </package> </typealiases> <!-- 事務及連接池,整合spring後需要在spring中進行配置 --> <environments default="development"> <environment id="development"> <transactionmanager type="JDBC"> </transactionmanager> <datasource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"> </property> <property name="username" value="root"> </property> <property name="password" value="root"> </property> </datasource> </environment> </environments> <!-- 加載映射文件 --> <mappers> <!-- 加載單個映射文件<mapper resource="sqlMap/UserMapper.xml" /> --> <!-- 加載包下的所有映射文件(使用mapper代理) --> <package name="mapperProxy"> </package> </mappers> </configuration>
基本映射文件
<?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"> <mapper namespace="mabatis"> <select id="selectUser" resulttype="com.mybatis.entity.User"> <!-- 使用#{value}占位符 --> select * from user where id = #{value} <!-- 使用${value}拼接符,只能寫value?可能會引起SQL註入 --> select * from user where name like '%${value}%' <!-- 使用字符連接符||,或函數concat(),oracle只能連接兩個字符 !--> select * from user where name like '%' || #{model.name} || '%' </select> </mapper>
獲取MySQL自增主鍵ID的兩種方式
1.使用mysql的 LAST_INSERT_ID() 函數:
<insert id="insertUser" parametertype="user"> <selectkey keyproperty="id" order="AFTER" resulttype="int"> select LAST_INSERT_ID() </selectkey> insert into user(username,birthday,sex,address) values(#{username}, #{birthday}, #{sex}, #{address}) <!-- 使用mybatis向oracle數據庫添加/修改數據時盡量指定jdbcType --> </insert>
2.使用 useGeneratedKeys 屬性,可在全局配置文件中將此屬性設為true:
<insert id="insertUser" keyproperty="id" parametertype="user" usegeneratedkeys="true">
insert into user(username,birthday,sex,address) values(#{username}, #{birthday}, #{sex}, #{address})
</insert>
獲取非自增主鍵的id
使用MySQL的 UUID() 函數
使用Oracle的序列的偽列:seq_name.nextval
創建SqlSessionFactory
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/**
* arg0:映射文件中的namespace + statement的id
* arg1:指定和映射文件中所匹配的parameterType類型的參數
*/
User user = sqlSession.selectOne("mabatis.selectUser", 1);
//更新操作需要手動提交事務
sqlSession.commit();
sqlSession.close();
使用mapper代理:只寫接口,mybatis自動實現:
1. xml的namespace名要與dao接口的全類名一致
2. 方法名對應statement的id
3. 參數對應parameterType
4. 返回類型對應ResultType
//獲取代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
動態SQL
if判斷
where
foreach
sql片段:基於單表
若有多個參數,不需要寫parameterType,但需要使用@Param
註解綁定參數名稱
<select id="findAll" resultType="product">
select * from product limit #{begin}, #{pageSize}
</select>
List<Product> findAll(@Param("begin") int begin, @Param("pageSize") int pageSize);
關聯查詢
左外連接查詢(left join on):左方全查,右方只查詢滿足條件的
SQL使用多表連接查詢,使用resultMap接收查詢結果集:
<!-- autoMapping默認為false,只能自動映射基本屬性,
關聯映射要在collection和association中聲明,屬性少的話建議寫上result -->
<resultmap automapping="true" id="orderMap" type="orders">
<!-- id一定要寫清column和property,否則沒有唯一標識符 -->
<id column="oid" property="oid">
</id>
<!-- property為引用對象名,使用ofType聲明集合中元素的java類型 -->
<collection automapping="true" oftype="orderitem" property="orderitems">
<id column="itemid" property="itemid">
</id>
<!-- 使用javaType聲明關聯對象的java類型 -->
<association automapping="true" javatype="product" property="product">
<id column="pid" property="pid">
</id>
</association>
</collection>
</resultmap>
延遲加載
二級緩存
批量刪除
<delete id="deleteBatch">
delete from emp where empno in
<!-- 在這裏聲明參數是數組或者List集合 -->
<foreach close=")" collection="array" item="empno" open="(" separator=",">
#{empno, jdbcType=INTEGER}
</foreach>
</delete>
<delete id="deleteBatch" parametertype="map">
delete from emp where empno in
<!-- 若參數類型為map,則直接寫為map中存放數組的key即可 -->
<foreach close=")" collection="empnos" item="empno" open="(" separator=",">
#{empno, jdbcType=INTEGER}
</foreach>
</delete>
mybatis調用存儲過程
<!-- 返回值也是map? -->
<select id="getUserSexCount" parameterMap="getUserSexCountMap" statementType="CALLABLE">
call get_user_sex_count(?,?)
</select>
<parameterMap type="java.util.Map" id="getUserSexCountMap">
<parameter property="sexid" jdbcType="INTEGER" mode="IN"/>
<parameter property="usercount" jdbcType="INTEGER" mode="OUT"/>
</parameterMap>
分頁插件:pagehelper
<!-- 1. 首先引入分頁插件 -->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
<!-- 2. 在mybatis的配置文件中配置插件及參數 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 分頁參數合理化,不允許小於1或大於總頁數的 -->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
// 3. 使用,在請求方法中進行查詢之前調用
@RequestMapping(value="/list")
public String list(@RequestParam(value="pageNo", defaultValue="1") Integer pageNo, Model model) {
//分頁插件:查詢之前調用,4為每頁顯示的數量
PageHelper.startPage(pageNo, 4);
//startPage方法後緊跟的查詢就是一個分頁查詢
List<Employee> list = employeeService.selectAll(pageNo);
//封裝了詳細的分頁信息,傳入查詢結果及連續顯示的頁數
PageInfo<Employee> pageInfo = new PageInfo<Employee>(list, 5);
model.addAttribute("pageInfo", pageInfo);
return "list";
}
mybatis-generator
generator.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>
<!-- 數據庫驅動包位置,手動生成才需要配置,若在項目中添加jar包就可以了 -->
<!-- <classPathEntry location=".\mysql-connector-java-5.1.39-bin.jar" /> -->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 不生成註釋 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 數據庫鏈接URL、用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/shop" userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成javaBean的包名和位置,.\指當前工程下 -->
<javaModelGenerator targetPackage="cn.mbq.model"
targetProject=".\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成的映射文件包名和位置 -->
<sqlMapGenerator targetPackage="cn.mbq.mapper"
targetProject=".\java">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="cn.mbq.dao" targetProject=".\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 不生成Example文件 -->
<table tableName="user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
1.使用本地命令行的方式生成:
#同一目錄下必須包含這些文件,最好不要帶中文
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
2.使用java工程的方式創建:運行此java文件
public class Generator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 默認文件在項目根路徑下
File configFile = new File("src/generator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
}
MyBatis學習小結