MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,半自动ORM(框架)。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
官网:http://www.mybatis.org/mybatis-3/
Github:https://github.com/mybatis/mybatis-3
mybatis的执行过程:
①首先加载核心xml文件
②通过xml文件,能得到sqlSessionFactory
③通过工厂产生sqlSeesion(这个对象不能操作数据库)
④sqlSeesion对象会产生一个解析器(excutor),进而得到一个 mappedSatement对象(Satement的子类)执行sql语句
名称 | 意义 |
---|---|
Configuration | 管理xml全局配置关系类 |
SqlSessionFactory | Session管理工厂接口 |
Session | SqlSession是一个面向用户(程序员)的接口,提供了很多操作数据库的方法 |
Executor | 执行器是一个接口(基本执行器、缓存执行器),SqlSession内部通过执行器操作数据库 |
MappedStatement | 底层封装对象, 对操作数据库存储封装,包括 sql语句、输入输出参数 |
StatementHandler | 具体操作数据库相关的handler接口 |
ResultSetHandler | 具体操作数据库返回结果的handler接口 |
属性名 | 作用 |
---|---|
属性(properties) | 系统属性占用配置 |
设置(settings) | 修改MyBatis在运行时的行为方式 |
类别名(typeAliases) | 为Java类型建立别名(简称) |
类型处理器(typeHandlers) | 将预编译语句(PreparedStatement)或结果集(ResultSet)中的JDBC类型转化成Java类型 |
对象工厂(objectFactory) | 提供默认构造器或者执行构造参数初始化目标类型的对象 |
插件(plugins) | MyBatis提供插件的方式来拦截映射 |
环境(environments) | MyBatis允许配置多个环境变量,可以包括mysql oracle等等 |
环境变量(environment) | 配置环境 |
事务管理器(transactionManager) | 事务管理 |
数据源(dataSource) | 数据源有两种:①jndi,由tomcat容器分配的数据源 ②pooled,mybatis自带数据源 |
数据库标识提供商(databaseIdProvider) | 数据库标识提供商 |
SQL映射器(mappers) | SQL映射文件 |
<?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">
<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
<!--引入配置文件-->
<properties resource="database.properties"></properties>
<typeAliases>
<!--给当前包下所有类配置别名,别名就是相应类的类名-->
<package name="com.offcn.entity"></package>
<!--给指定类配置别名
<typeAlias type="com.offcn.entity.User" alias="User"></typeAlias>
-->
</typeAliases>
<!--开始配置环境,可以配置多个环境,可以包括mysql oracle等等-->
<environments default="development">
<environment id="development">
<!--事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源-->
<!--数据源有两种:①jndi,由tomcat容器分配的数据源
②pooled,mybatis自带数据源-->
<dataSource type="POOLED">
<property name="url" value="${url}"/>
<property name="driver" value="${driver}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
封装一个得到Session的工具类
/**
* 得到Session的工具类
*/
public class SqlSessionUtil {
private static SqlSessionUtil sqlSessionUtil;
private SqlSession sqlSession;
private SqlSessionUtil(){
//读取核心配置文件
try {
String path = "mybatis-config.xml";
//得到一个输入流对象
InputStream in = Resources.getResourceAsStream(path);
//得到sqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//得到sqlSession,true代表默认提交事务
sqlSession = ssf.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
}
//提供一个对外的方法得到这个对象
public static synchronized SqlSessionUtil getSqlSessionUtil(){
if (sqlSessionUtil==null){
//锁类的原因:保证永远只有一个这样的类(在java jvm 实例化对象有四个步骤),
synchronized (SqlSessionUtil.class){
if (sqlSessionUtil==null){
sqlSessionUtil = new SqlSessionUtil();
}
}
}
return sqlSessionUtil;
}
public SqlSession getSqlSession() {
return sqlSession;
}
}
第一种:配置与数据库语句相关的xml文件实现数据的增删改查
首先配置与数据库语句相关的xml文件(我这里取名为UserMapper.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>
<!--查询总记录数-->
<select id="selectCount" resultType="int">
select count(1) from smbms_user
</select>
<!--全查-->
<select id="selectAllUser" resultType="User">
select * from smbms_user
</select>
<!--模糊查询-->
<select id="selectLikeUser" resultType="User" parameterType="String">
select * from smbms_user where userName like concat('%',#{userName},'%')
</select>
<select id="selectUserById" resultType="User" parameterType="int">
select * from smbms_user where id=#{id}
</select>
<!--修改 根据id修改名字-->
<update id="updateUserById" parameterType="User">
update smbms_user set userName=#{userName},userPassword=#{userPassword} where id=#{id}
</update>
<!--删除 根据id删除记录-->
<update id="deleteUserById" parameterType="int">
delete from smbms_user where id=#{id}
</update>
<!--增加-->
<update id="addUser" parameterType="User">
insert into smbms_user (userName,userPassword) values (#{userName},#{userPassword})
</update>
</mapper>
然后配置 Configuration
</environments>
<!--与数据库语句相关的xml文件相关联(可配置多个),resource代表路径 -->
<mappers>
<mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
</mappers>
最后测试
SqlSession sqlSession = SqlSessionUtil.getSqlSessionUtil().getSqlSession();
//返回一列
int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectCount");
System.out.println(num);
//返回多列
List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectAllUser");
for (User u:list) {
System.out.println(u.getUserName()+"\t"+u.getUserPassword());
//传参数
List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectLikeUser", "张");
for (User u : list) {
System.out.println(u.getUserName() + "\t" + u.getUserPassword());
}
int upd = sqlSession.update("com.offcn.dao.UserMapper.updateUserById", user);
if(upd>0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
第二种:用注解的方式实现数据的增删改查(这里不需要与数据库语句相关的xml文件)
创建一个java文件(我这里取名为UserMapper),与数据库语句相关的xml文件中的SQL语句按如下的格式写入UserMapper
@Mapper
public interface UserMapper {
//全查
@Select("select * from smbms_user")
public List<User> selectAllUser();
}
配置 Configuration
</environments>
<!-- @注解的方式 -->
<mappers>
<mapper class="com.offcn.dao.UserMapper" />
</mappers>
测试
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAllUser();
for (User u:users) {
System.out.println(u.getUserName()+"\t"+u.getUserPassword());
}
第三种:Java文件与数据库语句相关的xml文件相结合实现数据的增删改查
Configuration配置与第一种相同,测试方法与第二种相同,区别在于只需要在创建的java文件里(我这里是UserMapper接口),写与数据库语句相关的xml文件里所写的方法(方法名必须一致),如下:
public List<User> selectAllUser();
public List<User> selectLikeUser(String userName);
public User selectUserById(int id);
public int selectCount();
public User updateUserById(int id);
public int deleteUserById(int id);
public int addUser(User user);