1、Mybatis是一个基于Java的持久层框架,并且将SQL语句和代码分离,是一种面向配置的编程,可以良好的支持复杂数据映射,用动态SQL替代了SQL拼装语句。
2、mybatis环境搭建:
- mybatis-3.2.8.jar
- mybatis依赖包(上面两个都可以到github上面直接下载)
mysql-connector-java-5.1.33.jar(项目使用的数据库为mysql)
包结构如下图所示:
3、mybatis工作流程
- 读取配置文件,读取连接数据库的基本信息。
- 这些信息可以生成SqlSessionFactory,这是一个SqlSession的工厂,用于建议跟数据库之间的会话。
- 建立SqlSession,
- 调用mybatis中的各种API函数来执行SQL语句。
- 查询MAP的配置
- 返回结果
- 关闭SQLsession
4、配置文件
<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/mytest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/book/mapper/UserMapper.xml" />
</mappers>
配置文件中有两个重要的模块,一个是environments,包含连接数据库的基本信息;另一个是mappers,存放map配置文件的路径。
map文件有三种引用方式:
- 使用相对路径引用:
<mappers>
<mapper resource = "test/book/map/user.xml" /><!--此时把map当做一个资源文件 -->
</mappers>
- 绝对路径引用:
<mapper url = "file:///test/book/map/user.xml" />
- 使用包路径引用
<package name="com.test.book.map" />
5、SqlSessionFactory和SqlSession
- SQLSessionFactory:代表着和数据库之间的一种连接。生命周期时程序级,随着程序的建立而建立,程序的结束而消亡。
- SQLSession:执行数据库中的各种各样的操作,SqlSession是由SqlSqssionFactory来建立的。SqlSession是过程级别的,当方法中需要连接数据库进行查询的时候建立,方法退出的时候关闭。
下面,就是两者的建立方法:
//reader为输入流,是配置文件生成的输入流
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
//可以通过session来做各种数据查询
session = sqlSessionFactory.openSession();
6、map文件
<select id="getById" resultType="com.book.model.User"
paramterType="com.book.model.User">
select * from user where id=#{user_id}
</select>
其中,id是这个SQL方法的唯一标识,resultType是该SQL返回值的数据类型,paramterType为参数类型,#{user_id} 其中user_id为传入的参数值。
7、了解这些之后,我们来看一个实例:
- 项目结构:
- mybatis配置文件:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<!--数据库用的MySQL,使用jdbc事物 下面为数据库的基本配置 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mytest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mybatis的map文件的路径,采用相对路径的配置-->
<mappers>
<mapper resource="com/book/mapper/UserMapper.xml" />
</mappers>
</configuration>
- map配置文件:
<!--namespace定义的为map配置文件的路径 -->
<mapper namespace="com.book.mapper.UserMapper">
<resultMap type="com.book.model.User" id="user" />
<select id="getById" resultMap="user">
select * from user
where id=#{user_id}
</select>
</mapper>
与数据库对应的基类:
package com.book.model;
//该基类的属性和数据库中的字段相对应
public class User {
private String id ;
private String user_name;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试类:
public class TestHello {
public static void main(String[] args) {
// TODO Auto-generated method stub
//mybatis的配置文件路径
String resource = "com/book/mapper/MybatisConfig.xml";
Reader reader = null;
SqlSession session;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获得SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//通过SqlSessionFactory获得SqlSession
session = sqlSessionFactory.openSession();
//selectOne为SqlSession执行查询的方法,其中"getById"为需要调用的SQL的名字,1为传入的参数值
User user = session.selectOne("getById",1);
System.out.println(user.getUser_name());
//使用完成后需要关闭session
session.close();
}
}
输出结果:
2015-12-24 20:26:58,778 DEBUG [BaseJdbcLogger.java:139] : ==> Preparing: select * from user where id=?
2015-12-24 20:26:58,829 DEBUG [BaseJdbcLogger.java:139] : ==> Parameters: 1(Integer)
2015-12-24 20:26:58,847 DEBUG [BaseJdbcLogger.java:139] : <== Total: 1
admin
其中admin为查出的user名字,上面的两条为打出的日志