最近几天还是在看框架,都是为了找工作。另外,郑州的工作是真的不好找。
今天来写一个搭建单个框架的练习,搭建的是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中的具体架构图,图事别人的,要是有问题,联系我,我删除。
剩下就没有什么问题了,其他的问题以后再添加。结束。