初识框架之MyBatis

一、什么是框架

  1)传统 的JDBC编程

    JDBC作为Java语言连接数据库的一个重要的技能点,不可否认的是在一个程序中,如果我们需要多次进行与数据库的交互,那我们所需要的重复操作就就会有很多:

      1.加载数据库驱动

      2.获取数据库连接(Connection),获取Statement对象

      3.使用Statement操作sql语句

      4.如果是查询的话还需要获取一个ResultSet对象,并进行处理才能获取到查询的信息

      5.关闭数据库连接

    而且每次进行数据库交互,都需要进行一次类似与以上5个步骤的操作,这样就会对我们的工作量提升了许多,而且还是没有必要的。除此之外,我们还需要对以上操作不断地进行异常的捕捉,在我们工作的项目一般都很复杂,那么,这些操作是不是可以交给一个类似与第三方的工具进行处理,那我们的工作量不久会减轻好多吗?

  2)持久化与ORM

      1.持久化:持久化就是字面上的意思,很好理解,就是要数据以文件的形式,或者数据库等等方式永久的保存就是所谓的持久化。

        比较官方的解释就是:是程序数据在瞬时状态和持久状态之间转换的过程被称之为持久化。让对象的生存期超越使用对象的程序的运行期。(瞬时状态就是内存中的数据)

      2.ORM(Object Relational Mapping)

        编写程序时,与面向对象的方式处理数据(对象)

        保存数据时,以关系型数据库方式保存数据(表)

  3)框架的含义与好处:(比如我们在写简历的时候通常都会上网找一些模板来写,这时候我们就不需要考录简历的排版问题了,我们只需要把其中的内容填写好。使用框架的原因就类似与它)

    •  是一个应用程序的半成品。
    • 提供可重用的公共结构。
    • 按一定规则组织的一组组件
    • 不用再考虑公共性的问题
    • 专心在业务实现上
    • 结构统一,易于学习,维护
    • 新手也可以写出好程序

二、MyBatis

  1)MyBatis的构成

    1.SqlSessionFactoryBuilder

      SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory 的,通过它可以构建多个SessionFactory。它的作用仅仅是一个构建器而已,一旦我们构建了SessionFactory,那么它将毫无意义,应立即回收!

    2.SqlSessoinFactory

      SqlSessionFactory的作用是创建SqlSession,而SqlSession相当于一个会话,相当于JDBC中的connection对象,每次应用程序需要访问数据库,我们就要通SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在整个应用的生命周期中。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建的SqlSessionFactory会打开更多的数据库连接资源,那么连接资源很开会被耗尽,因此SqlSessionFactory的职责是唯一的。果断的采取单例模式,在应用中使用同一个SqlSessionFactory对象即可

    3.SqlSession

      SqlSession是一个会话,相当于JDBC中的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中,SqlSession是线程非安全的对象,涉及多线程时要特别的当心,每次创建的SqlSession对象都要及时的关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能影响很大

  2)使用MyBatis做简单的数据库增删改查

    1.导入jar包(https://github.com/mybatis/mybatis-3/releases)

      以上时官方下载地址,jar包的就导入方式在这里就不做介绍了(每个开发工具都有所不同)

      如果是使用idea的话也可以导入pom节点(https://mvnrepository.com/artifact/org.mybatis/mybatis)

      除了以上的MyBatis所依赖的包之外我们还需要导入JDBC的jar包或者pom,这些都可以在官方或者maven仓库中找到

    2.创建表结构

      

    3.准备resources目录

      1>database.properties文件(不会的就上网找一下,就是几个数据连接参数)

      2>configuration.xml文件(名字随便不是固定的,但是必须是xml文件)

        

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- xml文件的头文件,起到对文件的约束作用(例如:必须存在哪些节点) -->
 3 <!DOCTYPE configuration
 4         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 5         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 6 <configuration>
 7     <!--指向配置文件-->
 8     <properties resource="database.properties"></properties>
 9     <!--声明别名-->
10     <typeAliases>
11         <!--第一种方法-->
12         <!--<typeAlias type="com.cn.Dao.类名" alias="Monkey"></typeAlias>-->
13         <!--第二种方法,这玩意好用,别名就是其类名-->
14         <package name="com.cn.entity"></package>
15     </typeAliases>
16     <environments default="development">
17         <environment id="development">
18             <!--事务管理器:type JDBC or UNSIGNED(托管)-->
19             <transactionManager type="JDBC"></transactionManager>
20             <!--数据源:type jndi pooled unpooled-->
21             <dataSource type="POOLED">
22                 <!--连接数据库的4个连接参数-->
23                 <property name="driver" value="${driver}"></property>
24                 <property name="url" value="${url}"></property>
25                 <property name="username" value="${username}"></property>
26                 <property name="password" value="${password}"></property>
27             </dataSource>
28         </environment>
29     </environments>
30     <!--指向小配置文件xml-->
31     <mappers>
32         <package name="com.cn.Dao"></package>
33     </mappers>
34 </configuration>

    4.设置扫描路径+database.properties

    以上代码中有一个节点<mappers>中指定了一个相对路径,不难发现,这里是指定了xml的路径。但是有一定经验的会发现,idea中xml文件不是不可以在java目录下吗?当然,默认情况下是不可以的,即便是你放到了java目录下也不会被识别,更不要说说是使用了。但是上帝在把一扇门关上的同时自然也会给你打开一扇窗的。只需要在pom.xml文件中加入着呢一个接单就可以了

 

 1 <build>
 2   <resources>
 3     <resource>
 4       <directory>src/main/java</directory>
 5       <includes>
 6         <include>**/*.xml</include>
 7       </includes>
 8     </resource>
 9   </resources>
10 </build>

其中resource的节点就是祈祷这个作用的,resource节点是位于<build>节点下的,把<resource>节点放到该节点下就行了

    5.生成实体类(这个就不用多说了把)

    6.创建dao层的接口,并且声明相对应的方法

    

    7.生成mapper映射文件,起名与接口对应(UserDao.xml)

    

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!--namespace:该属性值为本配置文件所指向的接口的相对路径-->
 6 <mapper namespace="com.cn.Dao.UserDao">
 7     <!--增加语句-->
 8     <insert id="addUser" parameterType="User"><!--这里id为接口中的方法名,parameterType入参的类型(设置了configuration.xml中的别名这里就是该别名了,否则就是全类名)-->
 9         insert into user values(default ,#{name},#{pwd})/*如果接口的入参是对象,那么这里的name和pwd就是对象中的属性名*/
10     </insert>
11     <!--修改语句-->
12     <update id="updateUser" parameterType="User">
13         update user set name=#{name},pwd=#{pwd} where id=#{id}
14     </update>
15     <!--删除语句-->
16     <delete id="delUser" parameterType="int">
17         delete from user where id=#{id}/*如果接口的入参是基本类型,那么这里的id就是其变量名*/
18     </delete>
19     <!--查询语句-->
20     <select id="getUser" parameterType="int" resultType="User">/*resultType是返回值的类型*/
21         select * from user where id=#{id}
22     </select>
23 </mapper>

    8.创建工厂

 1 package com.cn.util;
 2 
 3 import org.apache.ibatis.session.SqlSessionFactory;
 4 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 5 
 6 import java.io.InputStream;
 7 
 8 public class SqlSessionUtil {
 9     private static SqlSessionFactory factory;
10     public static SqlSessionFactory getFactory(){
11         if (factory==null){
12             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
13             //将配置文件configuration.xml,也就是最外层的配置Mybatis的xml文件放转换成流
14             InputStream is = SqlSessionUtil.class.getResourceAsStream("/configuration.xml");
15             //获取工厂
16             factory = builder.build(is);
17         }
18         return factory;
19     }
20 }

上边介绍中说过对于同一个数据库我们只需要一个工厂就可以了,所以在这里我们选择是使用单例模式

    9.基于我们初步使用MyBatis,在这里我们还要创建接口的实现类来完成测试

package com.cn.Dao;

import com.cn.entity.User;
import com.cn.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;


public class UserDaoImpl implements UserDao {
    @Override
    public void addUser(User user) {
        //获取会话(SqlSessoin)对象
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            //把入参传入该会话的insert房中,其中“addUser为接口中的方法名,也就是小配置文件中的id属性”
            session.insert("addUser", user);
            //提交事务
            session.commit();
        } catch (Exception e) {
            //如果发生异常,回滚事务
            session.rollback();
        } finally {
            //最后必须要把此次会话关闭
            session.close();
        }
    }

    @Override
    public void delUser(int id) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            session.delete("delUser", id);
            session.commit();

        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }

    @Override
    public void updateUser(User user) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            session.update("updateUser", user);
            session.commit();
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }

    @Override
    public User getUser(int id) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            User getUser = (User)session.selectOne("getUser", id);
            session.commit();
            return getUser;
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
        return null;
    }
}

    10.编写测试方法

    

package com.cn.text;

import com.cn.Dao.UserDao;
import com.cn.Dao.UserDaoImpl;
import com.cn.entity.User;
import org.junit.Test;

public class TextMybatis {
    UserDao ud= new UserDaoImpl();
    @Test
    public void test1(){
        User user=new User(-1,"sjdf","123");
        ud.addUser(user);
    }
    @Test
    public void test2(){
        User user=new User(1,"山间的风","789132");
        ud.updateUser(user);
    }
    @Test
    public void test3(){
        ud.delUser(1);
    }
    @Test
    public void test4(){
        User user = ud.getUser(1);
        System.out.println(user.toString());
    }
}

这里我使用junit单元测试,其中增删改大家自行测试

 

      

      

猜你喜欢

转载自www.cnblogs.com/Tiandaochouqin1/p/10260250.html