篇首语:本文由编程笔记#小编为大家整理,主要介绍了MyBatis框架概述相关的知识,希望对你有一定的参考价值。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
实现基本的数据库操作功能的流程如下:
一、xml配置文件
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
1.MybatisConfig.xml
Mybatis的全局配置文件,主要用于配置Mybatis的运行环境(事务管理器、数据源等)。具体详情可见Mybatis说明文档。
下面通过一个简单的示例,来简要说明这个配置文件。
1 xml version="1.0" encoding="UTF-8"?>
2 DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
3 <configuration>
4
5 <properties resource="db.properties">properties>
6
7 <environments default="development">
8 <environment id="development">
9
10 <transactionManager type="JDBC" />
11
12 <dataSource type="POOLED">
13 <property name="username" value="${username}"/>
14 <property name="password" value="${password}"/>
15 <property name="url" value="${url}"/>
16 <property name="driver" value="${driver}"/>
17 <property name="poolMaximumActiveConnections" value="${maxActive}"/>
18 dataSource>
19 environment>
20 environments>
21
22 <mappers>
23 <mapper resource="StudentMapper.xml"/>
24 mappers>
25 configuration>
2.StudentMapper.xml
sql映射文件,主要用于实现数据库操作的具体细节。此文件需要在MybatisConfig.xml中加载。
下面通过一个简单的示例,来简要说明这个配置文件。
1 xml version="1.0" encoding="UTF-8" ?>
2 DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 <mapper namespace="cn.cage.student.StudentDAO">
4
5 <insert id="addStu" parameterType="cn.cage.student.Student">
6 INSERT INTO students
7 (name,qq,major,entrytime,gra_school,id_jnshu,daily_url,desire,bro_jnshu,knowfrom)
8 VALUES
9 (#{name},#{qq},#{major},#{entryTime},#{school},#{jnshuId},#{dailyUrl},#{desire},#{jnshuBro},#{knowFrom})
10 insert>
11
12 <delete id="delStuById" parameterType="long">
13 DELETE FROM students WHERE
14 id=#{id}
15 delete>
16 <delete id="delStu" parameterType="cn.cage.student.Student">delete>
17
18 <update id="updateStu">
19 UPDATE students SET
20 name=#{stu.name},qq=#{stu.qq},major=#{stu.major},entrytime=#{stu.entryTime},gra_school=#{stu.school},id_jnshu=#{stu.jnshuId}
21 ,daily_url=#{stu.dailyUrl},desire=#{stu.desire},bro_jnshu=#{stu.jnshuBro},knowfrom=#{stu.knowFrom}
22 WHERE id=#{id}
23 update>
24
25 <select id="queryStuById" resultMap="stuMap">
26 SELECT
27 id,create_at,update_at,name,qq,major,entrytime,gra_school,id_jnshu,daily_url,desire,bro_jnshu,knowfrom
28 FROM students WHERE id=#{id}
29 select>
30 <select id="queryStuByName" resultMap="stuMap">
31 SELECT
32 id,create_at,update_at,name,qq,major,entrytime,gra_school,id_jnshu,daily_url,desire,bro_jnshu,knowfrom
33 FROM students WHERE name=#{name}
34 select>
35 <select id="queryStuByJnshu" resultMap="stuMap">
36 SELECT
37 id,create_at,update_at,name,qq,major,entrytime,gra_school,id_jnshu,daily_url,desire,bro_jnshu,knowfrom
38 FROM students WHERE major=#{major} and id_jnshu=#{jnshuId}
39 select>
40 <select id="queryStu">select>
41
42 <resultMap type="cn.cage.student.Student" id="stuMap">
43 <constructor>
44 <arg column="name" javaType="String" jdbcType="VARCHAR" />
45 <arg column="major" javaType="String" jdbcType="VARCHAR" />
46 <arg column="id_jnshu" javaType="int" jdbcType="INTEGER" />
47 constructor>
48 <id property="id" column="id" />
49 <result property="createTime" column="create_at" />
50 <result property="updateTime" column="update_at" />
51 <result property="qq" column="qq" />
52
53 <result property="entryTime" column="entrytime" />
54 <result property="school" column="gra_school" />
55 <result property="dailyUrl" column="daily_url" />
56 <result property="desire" column="desire" />
57 <result property="jnshuBro" column="bro_jnshu" />
58 <result property="knowFrom" column="knowfrom" />
59 resultMap>
60
61 mapper>
>>关于类文件的别名:在MybatisConfig.xml的Configuration中,添加属性typeAlias即可:
<typeAlias type="cn.cage.Student" alias="Student"/>
二、Java代码
通过StudentMapper.xml进行DAO接口绑定后,不需要编写接口的实现类,就能直接根据接口规定的参数列表传入参数,进行数据操作。值得注意的是,如果不编写实现类的话,接口中增删改函数的返回值设定是无用的,只能返回SqlSession类中对应函数指定的返回值类型。
数据库操作在代码中的实现步骤大体如下:
下面主要讲解一下通过SqlSession对象操作数据库的内容。
1.SqlSession类中的常用方法
目前主要用到过的方法有:
2.注意事项
最后,对上述内容举例说明:上述配置文件的测试代码。
1 /**
2 * @FileName:MybatisStuImpl.java
3 * @description:
4 * @author Cage Yang
5 * @version
6 * Modified Date:2017年8月23日
7 * Why & What is modified: <修改原因描述>
8 */
9 package cn.cage.student;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNull;
13
14 import java.io.InputStream;
15 import java.util.HashMap;
16 import java.util.Iterator;
17 import java.util.List;
18
19 import org.apache.ibatis.io.Resources;
20 import org.apache.ibatis.session.SqlSession;
21 import org.apache.ibatis.session.SqlSessionFactory;
22 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
23 import org.junit.AfterClass;
24 import org.junit.BeforeClass;
25 import org.junit.Test;
26
27 /**
28 * @ClassName MybatisStuImpl
29 * @description 测试通过Mybatis接口绑定自动生成的数据操作类的运行情况。
30 * @author Cage Yang
31 */
32 public class MybatisStuImpl {
33 static InputStream in = null;
34 static SqlSession sqlSession = null;
35
36 /**
37 * @description 创建出SqlSession实例
38 * @throws java.lang.Exception
39 */
40 @BeforeClass
41 public static void setUpBeforeClass() throws Exception {
42 String resource = "MybatisConfig.xml";
43 in = Resources.getResourceAsStream(resource);
44 SqlSessionFactory sqlSessiOnFactory= new SqlSessionFactoryBuilder().build(in);
45 sqlSession = sqlSessionFactory.openSession();
46 }
47
48 /**
49 * @description 释放资源
50 * @throws java.lang.Exception
51 */
52 @AfterClass
53 public static void tearDownAfterClass() throws Exception {
54 sqlSession.close();
55 in.close();
56 }
57
58 @Test
59 public void testAddStu() {
60 Student stu = RandomStudent.getStudent();
61 stu.setMajor("java");
62 stu.setJnshuId(1501);
63 assertEquals("插入失败!", 1, sqlSession.insert("addStu", stu));
64 sqlSession.commit();
65 HashMap
66 param.put("major", "java");
67 param.put("jnshuId", 1501);
68 Student stu2 = sqlSession.selectOne("queryStuByJnshu", param);
69 assertEquals("插入错误,或查询byJnshu出错", stu, stu2);
70 }
71
72 @Test
73 public void testDelStuById() {
74 long id = 4;
75 Student student = sqlSession.selectOne("queryStuById", id);
76 System.out.println(student.getEntryTime());
77 assertEquals("删除失败!", 1, sqlSession.delete("delStuById", id));
78 sqlSession.commit();
79 assertNull("删除错误,或查询byId出错", sqlSession.selectOne("queryStuById", id));
80 }
81
82 @Test
83 public void testUpdateStu() {
84 long id = 5;
85 Student stu = sqlSession.selectOne("queryStuById", id);
86 stu.setDesire("哈哈哈哈哈哈哈哈");
87 HashMap
88 param.put("stu", stu);
89 param.put("id", id);
90 assertEquals("更新失败!", 1, sqlSession.update("updateStu", param));
91 sqlSession.commit();
92 assertEquals("更新错误,或查询byId出错", "哈哈哈哈哈哈哈哈", ((Student) sqlSession.selectOne("queryStuById", id)).getDesire());
93 }
94
95 @Test
96 public void testQueryStuByName() {
97 List
98 for (Iterator
99 Student student = (Student) iterator.next();
100 if (student.getJnshuId() == 1111) {
101 assertEquals("查询byName出错", "2017-08-06", student.getEntryTime());
102 }
103 }
104 }
105 }
三、与Spring-JdbcTemplate的比较
1.Mybatis必须用IO流载入xml配置文件,JdbcTemplate可以直接载入。
2.Mybatis可以无需编写数据操作类、通过配置文件绑定接口,JdbcTemplate必须编写类实现数据操作接口。
3.Mybatis可使用自带数据源类,JdbcTemplate只能使用外部数据源类。
4.mapper中的元素:增删改查元素对应StudentDAOImpl中的各实现方法,resultMap对应JdbcTemplate中的QueryStuRowMapper。
Mybatis说明文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html