搭建简单的单个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中的具体架构图,图事别人的,要是有问题,联系我,我删除。

 

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

 

posted on 2018-07-28 23:44  丶烟雨丶  阅读(594)  评论(0编辑  收藏  举报

导航