1、学习工具:
(1)、mybatis版本:mybatis-3.2.7
(2)、开发工具:eclipse jee oxygen
(3)、数据库驱动:mysql-connector-java-5.1.0-bin
2、持久化与ORM
(1)持久化:持久化是程序数据在瞬时状态和持久状态间转换的过程。
(2)ORM:Object Relational Mapping对象关系映射。
问题:由于我们在程序中是以面向对象的方式操作数据,但是在保存数据的时候却是以关系型数据库的方式存储。
解决问题:ORM就是用于解决对象和关系之间的转换。
a、实现在持久化层的增、删、改、查。
b、对持久层提供一种查询语言获API
c、对象-关系映射工具
d、提供与事务对象交互、执行检查、延迟加载以及其他优化功能。
对象–关系映射
类对象中属性 | 关系数据库中字段 |
---|---|
id | t_id |
uname | t_uname |
hobby | t_hobby |
3、mybatis
在使用mybatis之前,先看一段传统实现数据库操作的代码段
List<User> ulist = new ArrayList<User>();
Connection conn = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=FALSE&serverTimezone=UTC", "root", "");
String sql = "select t_name,t_pwd from t_user where id > ?";//? 为 占位符
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, 14);//参数索引是从1开始的,而不是0
ResultSet rs = ps.executeQuery();
while(rs.next()) {
User u = new User();
u.setId(rs.getObject(1));
u.setName(rs.getObject(2));
}
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
} finally {
if(null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我们需要加载数据库驱动,建立连接,遍历取出来的数据,将数据封装到类对象中。
在看使用使用mybatis。
mybatis-config.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>
<!-- 配置db的xml文件 -->
<properties resource="db.properties"></properties>
<!-- 方便使用类的别名,直接可以使用在com.cn.pojo这个包下的类名,而不用写完整路径 -->
<typeAliases>
<package name="com.cn.pojo"/>
</typeAliases>
<!-- 驱动环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件 存放sql语句 自动生成接口实现 -->
<mappers>
<mapper resource="com/cn/dao/user/UserDao.xml" />
</mappers>
</configuration>
db.properties
driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
user=root
password=root
UserDao.java(dao层接口,所需要实现的方法)
public interface UserDao {
public User getUserById(String id);
}
UserDao.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 包名+类名
<mapper namespace="com.cn.dao.user.UserDao">
//id 方法名 //parameterType 参数类型 //resutlType 返回类型
<select id="getUserById" parameterType="String" resultType="User">
//列名,User对象中的属性一般和列名相同,如果不相同自动封装会失败。
//我们可以通过给列名取一个和属性名一样的别名 这样也是可以映射的
//比如 数据库中的列名为 t_id,类中属性名为id 我们select语句可以写成 select t_id as id ......
SELECT id,userCode,userName,userPassword,gender,birthday,phone,
address,userRole,createdBy,creationDate,modifyBy,modifyDate FROM smbms_user//(表名)
where
//id(列名)=#{id}(参数名id)
id=#{id}
</select>
</mapper>
调用
public class MybatisUtils {
//mybatis的核心类二 SqlSessionFactory
private static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
//获取资源文件
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//获取SqlSession工厂
//mybatis的核心类一 SqlSessionFactoryBuilder
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 获取sqlSession
*/
//mybatis的核心类三 SqlSession
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
/**
* 关闭sqlSession
*/
public static void closeSession(SqlSession sqlSession) {
if(null != sqlSession) {
sqlSession.close();
}
}
}
//获取myabtis核心类SqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
//通过反射机制获取UserDao的实现类
UserDao userDao = sqlSession.getMapper(UserDao.class);
//直接封装成User对象
User user = userDao.getUserById("1");
System.out.println(user);
通过使用mybatis,将数据库驱动的加载,连接的建立,数据的类对象封装这些改成了配置化文件中,我们也不用实现UserDao接口,我们获取User的实例只需要三步即可完成,省去了数据库驱动加载,数据库连接建立,数据封装。
而且当你需要其他的dao层时,只需在配置mybatis配置文件中加入映射文件的地址即可。其他只需要写dao层接口以及xml映射文件。