MyBatis+SpringMVC+SpringBootspring+springmvc+mybatis(SSM)

1. MyBatis介绍及基本环境搭建

2019-03-28  本文已影响0人  飞扬code

1.1 MyBatis介绍:

MyBatis 世界上流行最广泛的基于SQL语句的ORM框架,由Clinton Begin 在2002 年创建,其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。

1.2 与Hibernate比较

a. 学习成本:MyBatis简单易学(特别是有SQL语法基础的人),较接近JDBC
b. 程序灵活性:MyBatis直接使用SQL,灵活性高
c. 程序执行效律:MyBatis效律高
d. 可移植性:hibernate较好(与数据库关联在配置中完成,HQL语句与数据库无关)

1.3 适用场合

MyBatis是一个灵活的DAO层解决方案,满足较高的性能要求,可以在很多场合使用,但一般以下场合不建议使用:

1.4 开发步骤(推荐)

新建JAVA项目或WEB项目
部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包:下载地址http://code.google.com/p/mybatis
编写主配置文件
创建数据库及表(如已创建,可省略)
创建实体类及SQL映射文件
编写数据库接口及实现
编写测试类及测试

1.5 开发示例

1.5.1 新建项目

新建java项目或web 项目。

1.5.2 导入JAR包

导入mybatis和数据库驱动包、日志包。


image.png

1.5.3 创建数据库

image.png
drop database if exists mybatis;
create database mybatis CHARACTER SET UTF8;
use mybatis;
create table dept(
    dept_id int primary key auto_increment,
    dept_name varchar(50),
    dept_address varchar(50)
);
insert into dept(dept_name,dept_address) values('研发部一部','北京');
insert into dept(dept_name,dept_address) values('研发部二部','上海');
insert into dept(dept_name,dept_address) values('研发部三部','广州');
select * from dept;
1.5.4 创建实体类:Dept.java
package com.demo.entity;
public class Dept {
    private Integer deptId; //部门编号
    private String deptName;//部门名称
    private String deptAddress;//部门地址
    public Integer getDeptId() {
         return deptId;
    }
    public void setDeptId(Integer deptId) {
         this.deptId = deptId;
    }
    public String getDeptName() {
         return deptName;
    }
    public void setDeptName(String deptName) {
         this.deptName = deptName;
    }
    public String getDeptAddress() {
         return deptAddress;
    }
    public void setDeptAddress(String deptAddress) {
         this.deptAddress = deptAddress;
    }
    @Override
    public String toString() {
         return "Dept [deptId=" + deptId + ", deptName=" + deptName
                 + ", deptAddress=" + deptAddress + "]";
    }   
}
1.5.5 创建config.xml

在src下,创建mybatis配置文件,导入,可以参考mybatis用户手册


image.png

配置文件信息如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
<configuration>
    <!-- 引用db.properties配置文件 -->
    <properties resource="db.properties"/>
    <!--environments指定数据源环境,default指的是使用哪个数据源  -->
    <environments default="development">
         <!--environment定义数据源的信息  -->
         <environment id="development">
             <!-- type="JDBC"表示事务由jdbc连接管理,type="MANAGED"表示事务由容器来管理 -->
             <transactionManager type="JDBC" />
             <!-- type="POOLED"表示使用连接池, type="UNPOOLED"表示不使用连接池 -->
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.jdbc.Driver" />
                 <!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&amp;characterEncoding=UTF-8,如下 -->
                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8" />
                 <property name="username" value="root" />
                 <property name="password" value="" />
             </dataSource>
         </environment>
    </environments>
</configuration>

写xml文件需要对一些字符进行转义:
下面是五个在 XML 文档中预定义好的转义实体:

&lt;     < 小于号
&gt;     > 大于号
&amp;   &
&apos;   ' 单引号
&quot;   " 双引号
小于等于“<=”,其转义为:&lt;=
大小等于“>=”,转义为:&gt;=
使用 CDATA 部件

CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束。在"<![CDATA["和"]]>"之间 的特殊字符的意义都不起作用,而转变为普通字符串内容。
在 MyBatis 的 XML 映射语句配置文件中,如果 SQL 语句有特殊字符,使用CDTA 部件括起来,如:

<select id= "selectBlog_use_collection" resultMap= "blogResult" >
    <![CDATA[ SELECT id , title, author_id as authored FROM BLOG WHERE ID > 0 and ID < 10 ]]> 
</select>
1.5.6 创建SQL映射文件及修改主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
<!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
<mapper namespace="com.demo.entity.DeptMapper">
    <!-- type指定的是对应的实体类 -->
    <resultMap type="com.demo.entity.Dept" id="deptResultMap">
         <!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
         <id column="dept_id" property="deptId"/>
         <!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
         <result column="dept_name" property="deptName"/>
         <result column="dept_address" property="deptAddress"/>
    </resultMap>
</mapper>
修改config.xml,加入映射文件信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
<configuration>
   <environments default="development">
   …………    
   </environments>
   <mappers>
      <mapper resource="com/demo/mapping/DeptMapper.xml" />
   </mappers>
</configuration>
1.5.7 编写数据库操作

包括操作接口及实现,接口略,实现类为:DeptDaoImpl.java

package com.demo.dao.imp;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.demo.entity.Dept;
public class DeptDaoImpl {
    /**
     * 用于插入数据到dept表。
     * @param dept 部门信息
     * @return 表示受影响的行数
     */
    public int insert(Dept dept){
         /*
          * 1.读取配置信息
          * 2.构建session工厂
          * 3.创建session
          * 4.启动事务(可选)
          * 5.数据处理
          * 6.提交事务、回滚事务(可选)
          * 7.关闭session 
          */      
         int i=0;
         SqlSession session = null;
         String config="config.xml";
        Reader reader = null;
         try {
             reader = Resources.getResourceAsReader(config);
             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
             session=sqlSessionFactory.openSession();
             //事务默认自动启动
             //SQL映射文件定义的命名空间+SQL语句的ID定位SQL语句,例如下的:cn.itcast.entity.DeptMapper.insert
             i=session.insert("com.demo.entity.DeptMapper.insert",dept);
             session.commit();     
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             session.rollback();
         }finally{
//关闭reader对象,这里略
             session.close();
         }        
         return i;
    }
}
1.5.8 编写测试类

需要导入junit包


image.png image.png image.png

在 DeptMapper.xml添加sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
<!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
<mapper namespace="com.demo.entity.DeptMapper">
    <!-- type指定的是对应的实体类 -->
    <resultMap type="com.demo.entity.Dept" id="deptResultMap">
         <!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
         <id column="dept_id" property="deptId"/>
         <!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
         <result column="dept_name" property="deptName"/>
         <result column="dept_address" property="deptAddress"/>
    </resultMap>
    <!-- 定义插入的sql语句,通过命名空间+id方式被定位 -->
    <insert id="insert" parameterType="com.demo.entity.Dept">
        insert into dept(dept_name,dept_address) values(#{deptName},#{deptAddress});
    </insert>
</mapper>

测试类,DeptTest.java

package com.demo.test;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.demo.dao.imp.DeptDaoImpl;
import com.demo.entity.Dept;
public class DeptTest {
    private static DeptDaoImpl deptDaoImpl;
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
         //在整个类初始化之后调用,一般用来做测试准备工作
         deptDaoImpl = new DeptDaoImpl();
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
         //在整个类结束之前调用,一般作测试的清理工作
         deptDaoImpl = null;
    }
    @Test
    public void test() {
         Dept dept=new Dept();
         dept.setDeptName("市场部");
         dept.setDeptAddress("沈阳");
         int i=deptDaoImpl.insert(dept);
         System.out.println("受影响行数:"+i);
    }
}

运行效果:


image.png image.png
上一篇下一篇

猜你喜欢

热点阅读