持久层框架-Mybatis
1. Mybatis和数据库的交互方式
1.1. 使用原始的Dao来调用mybatis
需要定义dao接口 需要实现dao接口 在dao接口实现类上注入sqlSessionFactory,创建时需要读取mapper.xml到内存 创建sqlSession对象调用mapper中的sql语句(sqlSession.insert(statementID,sql)),操作结束后需要手工提交,释放资源,返回结果 存在的问题:
dao实现类方法中存在大量模板方法 通过sqlSession进行编码的数据库操作方法存在id的硬编码 sqlSession方法使用泛型,运行时错误
1.2. Mapper动态代理
需要实现mapper接口 定义mapper.xml是需要保证
namespace和mapper接口方法的路径相同 statementID和mapper接口中定义的方法相同 paramerType和mapper接口中定义的参数类型相同 返回的resultType要和mapper接口中定义的返回结果相同
2. MyBatis映射文件
MyBatis最强大之处就在于它的映射语句 映射文件的几个顶级元素:
cache:对给定命名空间的缓存配置 cache-ref:对其他命名空间缓存配置的引用 resultMap:描述如何从数据库的结果中来加载对象 sql:可被其他语句引用的可重用语句块 insert:映射插入语句 update:映射更新语句 delete:映射删除语句 select:映射查询语句
2.1. select语句
< select id = " select" parameterType = " int" resultType = " hashmap" >
SELECT * FROM PERSON WHERE ID = #{id}
</ select>
注意参数的符号 允许更多的参数:详见
2.2. insert && update && delete
这些都和select比较相近 如果使用的数据库(MySQL)可以自动生成主键的字段,那么可以设置:useGeneratedKeys = "true"
2.3. sql
用于定义可重用的SQL代码代码段 可以被使用在别的之中 未完待续
< include refid = " name" > </ include>
3. 动态SQL
3.1. if
条件判断的一部分,往往放置在where中 例子:
< select id = " name" resultType = " int" >
SELECT * FROM BLOG WHERE state = "new"
< if test = " title != null" >
AND title like #{title}
</ if>
</ select>
3.2. choose,when,otherwise
类似java中的switch 例子:
< select id = " find" resultType = " PRESON" >
SELECT * FROM PERSON WHERE name = "job"
< choose>
< when test = " title != null" >
</ when>
< when test = " author != null" >
</ when>
< otherwise>
</ otherwise>
</ choose>
</ select>
3.3. trim,where,set
where:防止没有条件符合造成的炸裂 例子:
< select id = " name" resultType = " int" >
SELECT * FROM BLOG
< where>
< if>
</ if>
</ where>
</ select>
trim:自定义where元素的功能
prefixOverrides属性中的内容会被替换成prefix suffixOverrides属性中的会被添加进去,比如逗号
< trim prefix = " WHERE" prefixOverrides = " AND|OR" >
set:动态更新语句
会动态设置SET关键字,同时删除无关的逗号
< update id = " name" >
update Author
< set>
< if test = " " >
</ if>
</ set>
</ update>
3.4. foreach
foreach:对一个集合进行遍历
声明在集合体中使用的集合项,也允许你放置分隔符和开始结尾 index是键 item是值
< select id = " name" resultType = " blog.post" >
SELECT *
FROM POST P
WHERE ID in
< foreach item = " item" index = " index" collection = " list" open = " (" separator = " ," close = " )" >
#{item}
</ foreach>
</ select>
3.5. bind
可以冲OGNL表达式中创建一个变量绑定到上下文 例子:
< select id = " name" resultType = " blog.post" >
< bind name = " pattern" value = " ' %" + _parameter.getTitle()+"%" />
</ select>
4. 多数据库支持
5. 动态SQL中的可插拔脚本语言
6. 导出导入数据到数据库
6.1. 导出数据库
进入Mysql安装地点的bin文件夹下:mysqldump -u [用户名] -p [要导出的数据库]>[导出的路径//[文件名].txt]
例如:mysqldump -u root -p jyb > jyb.txt (输入后会让你输入进入MySQL的密码)
6.2. 导入服务器
进入Xftp,将刚刚的.txt文件上传到服务器 创建数据库:create database name;
将刚刚的文件导入:source [所在的路径//*.txt]
确认数据:show databases;
7. mybatis-generator
mybatis-generator是一款mybatis的自动代码生成工具,可以通过配置,快速生成mapper和xml文件。
7.1. 具体实现
7.1.1. 在pom文件中添加配件配置
< plugin>
< groupId> org.mybatis.generator</ groupId>
< artifactId> mybatis-generator-maven-plugin</ artifactId>
< version> 1.3.2</ version>
< configuration>
< verbose> true</ verbose>
< overwrite> true</ overwrite>
</ configuration>
< executions>
< execution>
< id> Generate MyBatis Artifacts</ id>
< goals>
< goal> generate</ goal>
</ goals>
</ execution>
</ executions>
< dependencies>
< dependency>
< groupId> org.mybatis.generator</ groupId>
< artifactId> mybatis-generator-core</ artifactId>
< version> 1.3.2</ version>
</ dependency>
</ dependencies>
</ plugin>
7.1.2. 在resource下创建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>
< classPathEntry location = " C:\Users\Administrator\Downloads\mysql-connector-java-8.0.13.jar" />
< context id = " DB2Tables" targetRuntime = " MyBatis3" >
< commentGenerator>
< property name = " suppressDate" value = " true" />
< property name = " suppressAllComments" value = " true" />
</ commentGenerator>
< jdbcConnection driverClass = " com.mysql.cj.jdbc.Driver" connectionURL = " jdbc:mysql://127.0.0.1/cigit2019?serverTimezone=GMT" userId = " root" password = " 1234" >
</ jdbcConnection>
< javaTypeResolver>
< property name = " forceBigDecimals" value = " false" />
</ javaTypeResolver>
< javaModelGenerator targetPackage = " com.example.cigit.dao" targetProject = " src/main/java" >
< property name = " enableSubPackages" value = " true" />
< property name = " trimStrings" value = " true" />
</ javaModelGenerator>
< sqlMapGenerator targetPackage = " mapping" targetProject = " src/main/resources" >
< property name = " enableSubPackages" value = " true" />
</ sqlMapGenerator>
< javaClientGenerator type = " XMLMAPPER" targetPackage = " com.example.cigit.mapping" targetProject = " src/main/java" >
< property name = " enableSubPackages" value = " true" />
</ javaClientGenerator>
< table tableName = " t_user" domainObjectName = " User" enableCountByExample = " false" enableUpdateByExample = " false" enableDeleteByExample = " false" enableSelectByExample = " false" selectByExampleQueryId = " false" > </ table>
</ context>
</ generatorConfiguration>
在如上模板中需要修改的位置
classPathEntry—数据库驱动:选择你的本地硬盘上面的数据库驱动包,具体可以在https://mvnrepository.com/artifact/mysql/mysql-connector-java下载 jdbcConnection—数据库连接的信息,用户名密码等 javaModelGenerator—生成模型的包名和位置 sqlMapGenerator—生成生成映射文件的包名和位置 javaClientGenerator—生成DAO的包名和位置 table— 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名
7.1.3. 出现的问题
具体参考参考中的相应链接
8. 使用标签结合Mybatis
注解 功能 备注 @Update 对应更新数据库 - @Select 对应选择数据库中项 - @Insert 向数据库添加项 - @Delete 删除数据库中项 -
9. 参考
用mybatis的generator自动生成代码 Mybatis自动生成xml文件、dao接口、实体类 idea中mybatis自动生成工具及用法