mybatis 是一个数据库操作的持久层框架,能够执行普通的 SQL 查询,消除了几乎所有的 jdbc 代码和参数的手工设置,取而代之的是较为简洁的 XML 文件或注解,总的来说是一个优秀的数据库操作框架。
mybatis 的初步使用
1、引入 mybatis 的相关 jar 包 或者依赖注入
org.mybatis mybatis 3.2.6 mysql mysql-connector-java 5.0.5
2、建立 mybatis-configuration.xml 文件
可以看到,mybatis-configuration.xml 主要是配置了事物管理器和数据库的连接设置。
3、创建一个实例类,类与所需获取的表中的要查询的字段一一对应,以一个 survey 表为例, 这个表总共有如下这些字段
@Data@NoArgsConstructorpublic class SurveyBean { public String questId; public String sceneId; public String surveyId; public String name; public String version; public String seq; public String type; public String required; public String createTime;}
4、创建一个操作 survey 表的的 xml 文件 surveyMapper.xml
UPDATE survey_quest SET quest_name = #{name}, version = #{version} WHERE quest_id = #{questId}
5、添加 mapper 文件到 mybatis-configuration.xml 文件
6、编写测试文件
public class SurveyMapperTest { SqlSession session; @Before public void beforeLoadXml() { InputStream inputStream = SurveyMapperTest.class. getClassLoader().getResourceAsStream("mybatis-configuration.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); session = sqlSessionFactory.openSession(); } @Test public void testSelect() { String statement = "com.study.hugy.surveyMapper.selectAllSurvey"; Listbean = session.selectList(statement); session.close(); } @Test public void testSelectByCondition () { String statement = "com.study.hugy.surveyMapper.selectByCondition"; String id = "101"; List beans = session.selectList(statement, id); session.close(); } @Test public void testUpdateByCondition () { String statement = "com.study.hugy.surveyMapper.updateByCondition"; SurveyBean bean = new SurveyBean(); bean.setQuestId("101"); bean.setName("这是测试哦"); bean.setVersion("321"); session.update(statement, bean); session.commit(); session.close(); }}
以上基本就可以将 mybatis 使用起来了,附上项目的目录文件结构
插个题外话,如何使用 log4j 在控制台打印 mybatis 要执行的SQL?
1) 添加依赖
log4j log4j 1.2.17
2)新建 log4j.properties 文件
### Log4j配置 ###### 与Spring结合需要在web.xml中指定此文件位置,并添加监听器 ####定义log4j的输出级别和输出目的地(目的地可以自定义名称,和后面的对应)#[ level ] , appenderName1 , appenderName2log4j.rootLogger=DEBUG,console,file#-----------------------------------##1 定义日志输出目的地为控制台log4j.appender.console = org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target = System.outlog4j.appender.console.Threshold=DEBUG####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ####%c: 输出日志信息所属的类目,通常就是所在类的全名#%m: 输出代码中指定的消息,产生的日志具体信息#%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行log4j.appender.console.layout = org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=[%c]-%m%n#-----------------------------------##2 文件大小到达指定尺寸的时候产生一个新的文件log4j.appender.file = org.apache.log4j.RollingFileAppender#日志文件输出目录log4j.appender.file.File=log/tibet.log#定义文件最大大小log4j.appender.file.MaxFileSize=10mb###输出日志信息####最低级别log4j.appender.file.Threshold=ERRORlog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#-----------------------------------##3 druidlog4j.logger.druid.sql=INFOlog4j.logger.druid.sql.DataSource=infolog4j.logger.druid.sql.Connection=infolog4j.logger.druid.sql.Statement=infolog4j.logger.druid.sql.ResultSet=info#4 mybatis 显示SQL语句部分log4j.logger.org.mybatis=DEBUG#log4j.logger.cn.tibet.cas.dao=DEBUG#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG##log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG##log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG##log4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
3)在 web.xml 添加监听
org.springframework.web.util.Log4jConfigListener
4)在 mybatis-configuration.xml 中使用 log4j
注意一点 mybatis-configuration.xml 中添加的标签是有顺序的,顺序错误会导致加载此配置文件报错。 然后再来看看如何使用注解来实现 mybatis 的使用。 步骤 1,2,3 不变,有变化是从第四步开始, 使用注解需要 XxxMapper.xml 文件, 取而代之的是一个 interface --- XxxMapper
public interface SurveyMapper { @Select("SELECT * FROM survey_quest") ListselectAllQuest(); @Select("SELECT * FROM survey_quest WHERE quest_id = #{id}") List selectByCondition(String id); @Select("UPDATE survey_quest SET quest_name = #{name}, version=#{version} WHERE quest_id = #{questId}") void updateByCondition(SurveyBean bean);}
然后在 mybatis-configuration.xml 文件中注册此 mapper 类
<mapper class = "com.study.hugy.mapper.SurveyMapper"/>
使用的话,如下所示:
@Test public void selectAllSurvey () { SurveyMapper mapper = session.getMapper(SurveyMapper.class); Listlist = mapper.selectAllQuest(); session.close(); } @Test public void selectByCondition() { SurveyMapper mapper = session.getMapper(SurveyMapper.class); List list = mapper.selectByCondition("101"); session.close(); } @Test public void updateByCondition () { SurveyMapper mapper = session.getMapper(SurveyMapper.class); SurveyBean bean = new SurveyBean(); bean.setQuestId("101"); bean.setName("这是注解啊"); bean.setVersion("321"); mapper.updateByCondition(bean); session.commit(); session.close(); }
了解了这些,mybatis 的就能使用起来了,总结一下需要注意的几点:
1、关于 sql 中参数的设置,如果只有一个,可以随意设置,但是如果有多个(一个实例类), sql 中的命名一定要与实例类的属性名称一致;
2、如果遇到乱码问题,检查页面的编码和数据库操作的编码是否一致,如页面使用的是 utf-8 ,添加数据库的 url 的时候可以在后面加上 ?useUnicode=true&characterEncoding=utf-8;
3、就是上面提到过的 mybatis-configuration.xml 中标签的顺序问题,不要弄错,否则会报错的;
---- mybatis 进阶应用 动态 sql 问题
所谓的动态 sql ,就是根据不同的情况, 条件会发生变化的 sql 语句, 针对这种情况 mybatis 在 mapper.xml 文件中提供了一些标签来解决;
1、 if 标签
SELECT *FROM STUDENTWHERE1 = 1AND STUDENT_ID = #{studentId} AND STUDENT_NAME = #{studentName}
2、 foreach 标签
foreach 标签是一个循环用的标签,在传入的参数中有集合的时候使用, 可以将集合中的条目方便的取出
INSERT INTO STUDENT(STUDENT_ID, STUDENT_NAME)VALUES(#{item.studentId}, #{item.studentName})
3、choose/when/otherwise
相当于 java 中的 if ... else if ... else
SELECT *FROM STUDENTWHERE1= 1AND STUDENT_ID = #{studentId} AND STUDNET_NAME = #{studentName} AND STUDENT_AGE BETWEEN 1 AND 3
还有一些生成动态 sql 的标签,可以参考一下的网址:
也写一些使用时的注意事项吧:
使用 SqlSession 传参数的时候 如果参数是一个常量类型 在 sql 中可以直接使用 #{1} 之类的来调用
使用 SqlSession 传递引用类型的参数, sql 中能拿到的值一定是 此参数的属性值,比如 你传递了一个 STUDENT 对象 ,名为 zhangsan ,你在 sql 中使用 #{zhangsan.studentName} 是拿不到值的,必须使用 #{studentName}, 所以如果使用 foreach 标签做循环的时候,如果只是传入一个集合, 记得要将他封装一层,不然你是拿不到的(好麻烦)
关于 mybatis 就讲到这里了。勤于学习,勤于总结!!!