欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

系统学习JavaEE的ORM框架之Mybatis入门案例

程序员文章站 2024-03-18 09:11:34
...

Mybatis入门

  1. MyBatis介绍
    
  2. Mybatis架构
    
  3. Mybatis下载
    
  4. Mybatis入门程序
    

MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

Mybatis架构
系统学习JavaEE的ORM框架之Mybatis入门案例
2.1、mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2.2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
2.3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
2.4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
2.5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一 个Mapped Statement对象,sql的id即是Mapped statement的id。
2.6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输 入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
2.7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

mybatis下载
mybaits的代码由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases
系统学习JavaEE的ORM框架之Mybatis入门案例
mybatis-3.2.7.jar----mybatis的核心包
lib----mybatis的依赖包
mybatis-3.2.7.pdf----mybatis使用手册
上述的内容了解之后准备就绪就需要用案例驱动来实现操作了
Mybatis入门程序
首先来看一下需求
4.1根据用户id来查询一个用户的信息
4.2根据用户名称来模糊查询一个用户的信息
4.3添加用户
4.4更新用户
4.5删除用户
第一步:环境准备
jar包:加入mybatis核心包、依赖包、数据驱动包。
上图的mybatis-3.2.7.jar----mybatis的核心包
lib----mybatis的依赖包 都加入
不要忘记还有数据库驱动包(这里使用sqljdbc4.jar)
工程:(使用Myeclipse开发工具) com.dao包和com.mapper包先不用管这里用不到 后边在写
系统学习JavaEE的ORM框架之Mybatis入门案例
日志文件:创建一个config根路径
在根路径下创建一个log4j.properties文件
里面填写如下代码(切记要加入相应的jar包在mybats依赖包里面有)

					```
					# Global logging configuration
					#在开发环境中日志级别要设置成DEBUG
					log4j.rootLogger=DEBUG, stdout
					# MyBatis logging configuration...
					log4j.logger.org.mybatis.example.BlogMapper=TRACE
					# 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
					```

环境配置好之后现在来编写Mybatis的主配置文件
第二步:SqlMapConfig.xml
在classpath下创建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>

 <environments default="development">
	 <environment id="development">
	 	<!-- 使用JDBC事务管理 -->
	 	<transactionManager type="JDBC"/>
	 	<!-- 数据库连接 -->
		 <dataSource type="POOLED">
		 <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
		 <property name="url" value="jdbc:sqlserver://127.0.0.1:1433;databaseName=mydb"/>
		 <property name="username" value="sa"/>
		 <property name="password" value="123456"/>
		 </dataSource>
	 </environment>
 </environments>
 
</configuration>

SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。
接下来就要创建我们的实体类了
第三步:创建entity类
entity类作为mybatis进行sql映射使用,entity类通常与数据库表对应,UserInfo.java如下:

public class UserInfo {
//	uid int primary key identity(1,1),
//	uacc nvarchar(50) not null,
//	upwd nvarchar(20) not null,
//	uname nvarchar(50) not null 
	Integer uid;
	String uacc;
	String upwd;
	String uname;
	//set-get--省略
	}

第四步:编写SqlSessionFactory.java类
大家都知道要操作数据库的话是需要一个SessionFactory的.这里用最基本的mybatis读取配置文件来创建一个SessionFactory.
在com.db包下创建一个SQLSessionFactory.java
编写单例模式来通过getSqlSessionFactory获取到SessionFactory.

public class SQLSessionFactory {
	static SqlSessionFactory sf;
	//拿到sqlsessionfactory
	public static SqlSessionFactory getSqlSessionFactory(){
		try {
			//读取配置文件
			String resource="SqlMapConfig.xml";
			//得到配置文件流
			InputStream inputStream;
			inputStream = Resources.getResourceAsStream(resource);
			//拿到sessionfactory
			sf=new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return sf;
	}
}

第五步:编写sql映射文件
在classpath下的sqlmap目录下创建sql映射文件Users.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代理开发非常重要的作用。-->
<mapper namespace="test">

</mapper>

4.1根据id来查询用户信息
在sqlmap/Users.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代理开发非常重要的作用。-->
<mapper namespace="test">
	<!-- 
				select:查询
					id:标识,
						将sql语句封装到statement对象中,所以id未statement的id
	     parameterType:传入参数的类型
			resultType:指定结果集的类型(映射为java对象)
				 #{}:占位符
				 #{id}:其中id为要接受参数
	 -->
	<select id="findUserById" parameterType="int" resultType="com.po.UserInfo">
	 	select * from userinfo where uid=#{id}
	 </select>
</mapper>

在classpath下的SqlMapConfig.xml中加载User.xml的映射文件

<configuration>
	<environments default="development">
	 <environment id="development">
	 	<!-- 使用JDBC事务管理 -->
	 	<transactionManager type="JDBC"/>
	 	<!-- 数据库连接 -->
		 <dataSource type="POOLED">
		 <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
		 <property name="url" value="jdbc:sqlserver://127.0.0.1:1433;databaseName=mydb"/>
		 <property name="username" value="sa"/>
		 <property name="password" value="123456"/>
		 </dataSource>
	 </environment>
 </environments>
<!-- User映射 -->
 <mappers>
 <mapper resource="sqlmap/User.xml"/>
 </mappers>
</configuration>

到现在sql映射文件编写好了,SessionFactory也拿到了,那就可以进行测试了
编写测试类

public class TestClass {

	/**
	 * 通过id查询用户
	 */
	@Test
	public void test() {
		//拿到sqlsession
		SqlSessionFactory ssf = SQLSessionFactory.getSqlSessionFactory();
		SqlSession s = ssf.openSession();
		//操作数据库
		//第一个参数:调用User.xml映射文件中的namespace名.id名(例如:test.findUserById)
		//第二个参数:传入的参数 	
		UserInfo user=s.selectOne("test.findUserById", 1);
		s.close();
		System.out.println(user);
	}
}

这样就可以取到数据库中的数据了.那么接下来实现第二个功能

4.2根据用户名称来模糊查询一个用户的信息
同样先在sqlmap/User.xml(sql映射文件)中编写sql语句
这里要思考一个问题
sql语句中的like关键词后边要用占位符还是sql语句拼接
例如: 我们用占位符之后 会变成like ‘%?%’ 这个问号表示我们要注入的数据 但这里mybatis执行的时候会把单引号里边的?当做字符串 来拼接这样程序就会出错无法注入,所以我们要用mybatis提供的${}符号来进行sql拼接 注意#{占位符}和${sql语句拼接} 的不同

<!-- ${value} 表示拼接sql语句 如果传入类型是简单类型,则只能填写value -->
	 <select id="findUserByName" parameterType="java.lang.String" resultType="com.po.UserInfo">
	 	select * from userinfo where uname like '%${value}%'
	 </select>

编写测试类

/**
	 * 通过名字查询客户(模糊查询)
	 */
	@Test
	public void test2(){
		//拿到sqlsession
		SqlSessionFactory ssf = SQLSessionFactory.getSqlSessionFactory();
		SqlSession s = ssf.openSession();
		//进行模糊查询
		List<Object> list = s.selectList("test.findUserByName", "三");
		s.close();
		System.out.println(list);
	}

4.3添加用户
添加用户这里需要注入的是sqlmap/User.xml(映射文件)中传入参数的数据类型问题
同样先在sqlmap/User.xml(sql映射文件)中编写sql语句
parameterType传入一个entity实体对象 我们直接把全限定路径填写进去
id由数据库自增长能力,其它参数用#{占位符}使mybatsi自动注入进入(字段名和属性名一定要一致)

 <!-- 
	 	添加用户
	  -->
	 <insert id="insertUser" parameterType="com.po.UserInfo">
	  		insert into userinfo values(#{uacc},#{upwd},#{uname})
	 </insert>

编写测试类

/**
	 * 保存用户
	 */
	@Test
	public void test3(){
		//拿到sqlsession
		SqlSessionFactory ssf = SQLSessionFactory.getSqlSessionFactory();
		SqlSession s = ssf.openSession();
		//插入数据
		UserInfo user=new UserInfo();
		user.setUacc("tangseng");
		user.setUpwd("ts123456");
		user.setUname("唐僧");
		s.insert("test.insertUser",user );
		//提交事务
		s.commit();
		//关闭资源
		s.close();
	}

4.4更新用户
上边的都没问题的话更新用户自然是小菜一碟
同样先在sqlmap/User.xml(sql映射文件)中编写sql语句

 <!-- 修改用户 -->
	 <update id="updateUser" parameterType="com.po.UserInfo" >
	 		update userinfo set uacc=#{uacc},upwd=#{upwd},uname=#{uname} where uid=#{uid}
	 </update>

编写测试类
这里是先查询出来了一个用户修改了他的姓名

/**
	 * 修改用户
	 */
	@Test
	public void test5(){
		//拿到sqlsession
		SqlSessionFactory ssf = SQLSessionFactory.getSqlSessionFactory();
		SqlSession s = ssf.openSession();
		UserInfo user = s.selectOne("test.findUserById", 1);
		user.setUname("张三");
		s.update("test.updateUser", user);
		s.commit();
		s.close();		
	}

4.5删除用户
那删除用户就更简单了
同样先在sqlmap/User.xml(sql映射文件)中编写sql语句

<!-- 删除用户 -->
	 <delete id="deleteUser" parameterType="java.lang.Integer" >
	 		delete from userinfo where uid=#{uid}
	 </delete>

编写测试类

/**
	 * 删除用户
	 */
	@Test
	public void test4(){
		//拿到sqlsession
		SqlSessionFactory ssf = SQLSessionFactory.getSqlSessionFactory();
		SqlSession s = ssf.openSession();
		s.delete("test.deleteUser", 6);
		s.commit();
		s.close();
	}

到这里Mybatis的入门程序基本就搞定了

总结

  1. jar包问题:jar包就用核心包和依赖包就行了,测试类用的是工具自带的junit包
  2. 路径:所有配置文件都写在src目录下也行,为了区分所有可以工程右键new一个Source Folder文件夹
  3. SqlMapConfig.xml:需要注意的是 就配置一个数据库和事务管理还有加载映射 应该没什么问题
  4. User.xml:需要注意的是namespace不能乱写 在后边mapper代理开发有着重要的作用 其他的注意一下parameterType 传入的类型和#{}和${}的区别
  5. SQLSessionFactory.java: 这里用的是最原始的方法来获取到Mybatis支持的SessionFactory,后边可以直接配置到Spring容器中