初识框架之MyBatis
Posted tiandaochouqin1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识框架之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单元测试,其中增删改大家自行测试
以上是关于初识框架之MyBatis的主要内容,如果未能解决你的问题,请参考以下文章