zoukankan      html  css  js  c++  java
  • 搭建简单的单个Mybatis框架

      最近几天还是在看框架,都是为了找工作。另外,郑州的工作是真的不好找。

      今天来写一个搭建单个框架的练习,搭建的是Mybatis,主要的原因是自己对于单个框架的原理不太懂,虽然前面的博客对于SSM框架进行了整合,但是最好还是自己在进行深入的了解。不再废话了,直接开始。

      搭建框架最主要的是jar包,这次为了从头开始,Maven也不再使用。直接就是简单的web项目。博客的目的也是为了简单的记录自己的一些思路和想法。可能大家不太好照搬。

      下面就说一说具体的搭建思路。

      1.复制jar包,直接复制到WEB-INF下面的lib文件夹下,在build path。具体的jar包如图,可能有些jar包有些多余。

      2.配置Mybatis的配置文件,Mybatis的配置文件主要有两类,一个是Mybatis的核心配置文件SQLMapConfig.xml(这里名字可以随意起,但是最好统一),还有一个就是映射文件***Mapper.xml(看具体的需求),这个映射文件可以有多个。因为Mybatis封装了JDBC,但是对于底层SQL的实现还是依赖于JDBC。所以Mybatis还要配置一个log4j.properties(这个配置文件可能和JDBC的一些设置有关)。

      SQLMapConfig.xml是Mybatis核心的配置文件,主要配置数据库连接的一些参数和加载映射文件。本次项目的SQLMapConfig.xml具体代码如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!-- 和spring整合后 environments配置将废除 -->
        <environments default="development">
            <!-- 环境,开发和测试用到的环境不同 -->
            <environment id="development">
                <!-- 使用jdbc事务管理 -->
                <transactionManager type="JDBC" />
                <!-- 数据库连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url"
                        value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
        <!-- 映射文件配置,加载映射文件 -->
        <mappers>
            <mapper resource="mybatis/UserMapper.xml"/>
        </mappers>
    </configuration>
    

       log4j.properties的作用我这里还不是很清楚,还是自己学习的太浅了,这个问题以后有机会我在研究。后来知道了,这是日志输出格式配置文件,主要和日志输出有关。代码具体如下:

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

       mapper.xml文件因为和具体的需求有关,会在下面粘贴。

      3.搭建项目的具体的结构。在这里因为需要pojo类和dao层,因为不再显示在页面上,这里需要写一个test包。具体的项目结构如下:

      pojo就是实体类对象,没有什么关键代码可以写的,记得要写构造函数(无参和有参都要有),toString方法,get和set方法。其他的在看自己id需求。

      下面就说说代码中具体怎么使用Mybatis,首先要有一个mapper.xml映射文件,这里和具体的表对应,我的映射文件实现的比较少,主要还是具体的理解,代码如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- namespace:命名空间,用于隔离SQL语句 -->
    <mapper namespace="user">
        <!-- 一般自己编写查询语句是要注意SQL优化,不可以查询全部。 -->
        <!-- parameterType是传参的数据类型,resultType是结果的数据类型 -->
        <!-- #{id}是占位符,相当于jdbc中“?”,“id”可以随便起 -->
        <select id="getUserById" parameterType="int" resultType="com.psq.MybatisTrain.pojo.User">
            select * from user where id=#{id}
        </select>
        
        <!-- 如果返回的类型为集合,只需要设置元素的类型 -->
        <!-- '%${value}%' 设置字符串的拼接指令。 -->
        <select id="getUserByUserName" parameterType="String" resultType="com.psq.MybatisTrain.pojo.User">
            select * from user where username like '%${value}%'
        </select>
        
        <!-- 这里要注意  ` 和 ' 的区别,也可以不用` -->
        <insert id="insertUser" parameterType="com.psq.MybatisTrain.pojo.User" useGeneratedKeys="true" keyProperty="id">
            <!-- 主键返回,selectKey:用于配置主键返回,keyProperty:要绑定的pojo属性
                ,resultType:属性数据类型,order:指定什么时候执行,AFTER之后
                                        也可以在insert属性中配置  useGeneratedKeys="true" keyProperty="id"
             -->
            <!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
                SELECT LAST_INSERT_ID()
            </selectKey> -->
            insert into user(username,birthday,sex,address) 
                values (#{username},#{birthday},#{sex},#{address})    
        </insert>
    </mapper>
    

       映射文件写完了,具体的一些细节问题我都写在注释里了,这里不再叙述。因为要让系统知道mapper文件的位置,所以上面Mybatis的核心配置文件中已经声明了。也不再叙述。

      下面就是代码,因为要使用到@Test注解,所以这里没有其他的东西,直接在方法里面查询。下面就说说具体的步骤。

      (1)创建 SqlSessionFactoryBuilder(这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需 要存在了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是本地方法变量))。

      (2)创建核心配置文件的输入流。

      (3)创建SqlSessionFactory对象,用于开启Session(一旦被创建,SqlSessionFactory 实例应该在你的应用程序执行期间都存在。没有理由来 处理或重新创建它。使用 SqlSessionFactory 的最佳实践是在应用程序运行期间不要重复创建 多次)。

      (4)开启session(每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能共享使用,它也是 线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在 一个类的静态字段甚至是实例字段中。也绝不能将 SqlSession 实例的引用放在任何类型的管 理范围中)。

      (5)执行SQL语句。

      (6)关闭session。

      具体的代码如下:

    		// 创建 SqlSessionFactoryBuilder
    		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    
    		// 创建核心配置文件的输入流
    		InputStream inputStream = Resources.getResourceAsStream("SQLMapConfig.xml");
    
    		// 创建SqlSessionFactory对象,用于开启Session
    		SqlSessionFactory factory = builder.build(inputStream);
    
    		// 开启session
    		SqlSession session = factory.openSession();
    
    		// 执行查询 参数一是sql语句的id 参数二是传入sql语句的参数
    		User user = session.selectOne("user.getUserById", 1);
    
    		// 输出user对象,实现了tostring方法
    		System.out.println(user);
    
    		// 关闭session资源
    		session.close();
    

       上面的代码有加载Mybatis的核心配置文件,在实际的应用中有一些要改进的地方,其中,如果和Spring整合的时候完全不需要创建,直接依赖注入就可以了,这是后话。到这里,其实已经完成了大部分的工作,剩下的就都是一些细节性的问题,因为都是开发中遇到的问题,这里提也有一些繁琐。这里还是提一下,给自己一个提醒,但是不再举出解决方案,估计以后会用到更好的。

      首先是可以看到上面的代码有些多,其中我也列举出SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession各自存在的区域和理由,所以这个可以写一个工具类,实现就是单例模式的实现,因为SqlSessionFactory只要有一个就可以。具体的实现可以自己下去找找。

      其次是插入数据时需求是要有主键返回值,这里用到了Mybatis的解决方案,具体的实现还是利用了框架,另外,插入时因为有缓存的存在,所以插入要立即看到效果就要立即提交Session(事务)。

      在其次就是Mybatis Dao开发,有两种方式,一个是比较老的dao开发,就是直接开发,写完dao接口在写实现类。最后调用。另一种我在前面SSM整合中使用到,是接口动态代理的方式,只写一个dao接口,在调用接口。实现接口的动态代理要有四个规则。如下:1 namespace必需是接口的全路径名。2 接口的方法名必需与映射文件的sql id一致。3 接口的输入参数必需与映射文件的parameterType类型一致。4 接口的返回类型必须与映射文件的resultType类型一致。

      最后,粘贴一个图片,就是Mybatis中的具体架构图,图事别人的,要是有问题,联系我,我删除。

      剩下就没有什么问题了,其他的问题以后再添加。结束。

  • 相关阅读:
    CString to char*
    修改mfc中的图标的问题
    MFC Class Wizard要到这里来找
    多文档情形下,窗口的重绘
    64位的ubuntu跑不了32位下编译出来的代码,可是我就是想跑啊
    ubuntu不能执行某个执行文件,这个叫权限不够
    碰到了在ubuntu下不能读windows盘符的问题——ubuntu使用心得
    画个多边形来,CDC
    如果要在mFC客户区添加控件怎么办
    饿汉单例模式实例——取快递
  • 原文地址:https://www.cnblogs.com/yanyu01/p/9383765.html
Copyright © 2011-2022 走看看