系统学习JavaEE的ORM框架之Mybatis入门案例
Mybatis入门
-
MyBatis介绍
-
Mybatis架构
-
Mybatis下载
-
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架构
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
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包先不用管这里用不到 后边在写
日志文件:创建一个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的入门程序基本就搞定了
总结
- jar包问题:jar包就用核心包和依赖包就行了,测试类用的是工具自带的junit包
- 路径:所有配置文件都写在src目录下也行,为了区分所有可以工程右键new一个Source Folder文件夹
- SqlMapConfig.xml:需要注意的是 就配置一个数据库和事务管理还有加载映射 应该没什么问题
- User.xml:需要注意的是namespace不能乱写 在后边mapper代理开发有着重要的作用 其他的注意一下parameterType 传入的类型和
#{}和${}的区别
- SQLSessionFactory.java: 这里用的是最原始的方法来获取到Mybatis支持的SessionFactory,后边可以直接配置到Spring容器中
上一篇: saltstac的简介和安装与配置
下一篇: LTP 第四章 开发_exit()测试集