都说Mybatis是比较简单的框架,那我就把它当成高级框架突破口,进去康康。
在之前项目中,使用JDBC连接Mysql数据库时,都是直接创建一个类,但现在走到了框架这一步,就改变了这一做法。
Mybatis框架简介:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
身为SSM中的一员,操作数据库(同三层架构中的Dao层)的工作就交由此框架处理
从下载到配置
Mybatis 3.4.1版本,下载自GitHub开源社区:https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.4.2
下载之后解压可以看到这样的文件夹(pdf为官方文档,本片后续操作都是参照文档所写)
新建Java项目,然后导包就像这样(JDBC的包别忘了导入),随后build path
项目搭建
如果只有导包可是做不了什么操作的,关键在项目的搭建,从上面简介中的一句:MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。,可以看出需要编写XML文件。
依照官方文档写出两个XML:一个全局,一个映射
全局mybatis.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">
<!-- 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/testJDBC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
接下来编写mybatis.xml最后mapper中的映射文件UserMapper.xml:
相关参数:namespace名称空间;id唯一标识;resuleType返回值类型-设置成封装的bean;#{id}从参数中取出id
<?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">
<mapper namespace="com.mybatis.test">
<select id="selectUser" resultType="com.mybatis.bean.UserBean">
select * from user where uid = #{id}
</select>
</mapper>
有了这两个xml文件,就可以开始编写Java代码
开始编写
首先编写一个和JavaBean,成员与数据库对应,构造一个 toString() 方法即可使用
编写一个Java类用以实际操作,两个方法如下
//获取SqlSessionFactory
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
// TODO Auto-generated method stub
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
public static void test01() throws IOException {
// TODO Auto-generated method stub
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//用于执行sql
SqlSession session=sqlSessionFactory.openSession();
//传入uid为 1
UserBean user=session.selectOne("org.mybatis.UserMapper.selectUser", 1);
System.out.println(user);
session.close();
}
执行test01()方法即可,查看控制台看到
UserBean [uid=1, uname=yang, upwd=123, regtime=1999-11-04 00:00:00.0]
接口式编程
简介中的接口,依照官方文档可以编写出
首先创建一个Java interface,提供传入 uid 返回UserBean对象的方法
import com.mybatis.bean.UserBean;
public interface UserMapper {
public UserBean getUser(int uid);
}
联想到之前的映射XML文件UserMapper.xml是对于类的编写,所以现在需要改写两处,将接口与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">
<mapper namespace="com.mybatis.dao.UserMapper">
<!--
namespace:接口式编程不能随意命名应该是全类名
#{id}从参数中取出id
public UserBean getUser(int uid); #修改唯一标识完成绑定id="getUser"
-->
<select id="getUser" resultType="com.mybatis.bean.UserBean">
select * from user where uid = #{id}
</select>
</mapper>
完了之后呢测试方法也要重写,test02() 就像这样
public static void test02() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession session=sqlSessionFactory.openSession();
//获取接口的实现对象
//实际上是mybatis创建的代理对象执行的操作
UserMapper mapper=session.getMapper(UserMapper.class);
UserBean user=mapper.getUser(1);
System.out.println(mapper.getClass());
System.out.println(user);
session.close();
}
考虑到是接口,这里特意打印了一下==mapper.getClass() 在控制台看到一串神秘代码:class com.sun.proxy.$Proxy0,这里的Proxy的意思是代理对象的意思,当程序执行时Mybatis会产生一个代理对象去完成一系列操作
class com.sun.proxy.$Proxy0
UserBean [uid=1, uname=yang, upwd=123, regtime=1999-11-04 00:00:00.0]
注释:
- SqlSession表示和数据库进行一次会话,属于非线程安全,用完之后需要关闭,每次获取都要获取新的对象
- 暂时无了,想起来再加