MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
是一个半自动化的ORM(对象关系映射)框架。
Maven
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
Compile Dependencies (8)
来源: http://mvnrepository.com/artifact/org.mybatis/mybatis/3.4.1
MyBatis使用基本流程
1、导入相关jar包
2、编写mybatis核心配置文件(mybatis-config.xml)
3、创建SqlSessionFactory,以及获取SqlSession对象
4、创建与数据表对应的实体类
5、SQL语句映射文件,并将映射文件在核心配置文件中配置
6、编写Dao
7、测试
举例说明:
2:核心文件(名字可任意eg: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>
<!-- 数据库连接的基本配置信息 -->
<environments default="development">
<environment id="development">
<!-- JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接, closeConnection 属性设置为 false 来阻止它默认的关闭行为。 -->
<transactionManager type="JDBC" />
<!--UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI– 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/dbtest?serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="asd123asd" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/hgs/ssm/UserMapper.xml" />
</mappers>
</configuration>
NOTE:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
映射文件配置方式:
<!-- Using classpath relative resources -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- Using url fully qualified paths -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- Using mapper interface classes -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- Register all interfaces in a package as mappers -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
来源: http://www.mybatis.org/mybatis-3/zh/configuration.html
3:创建SqlSessionFactory,以及获取SqlSession对象
public class MyBatisUtils {
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
public static SqlSession getSession() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
5:SQL语句映射文件(名字随便起但要与配置文件中的一致)
eg:下面是配置文件中的映射配置
<mappers>
<mapper resource="com/hgs/ssm/UserMapper.xml" />
</mappers>
sql语句的映射文件内容:
<?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.hgs.ssm.UserMap">
<select id="selectUser" resultType="com.hgs.ssm.User">
select * from User where id = #{id}
</select>
<select id="selectAllUser" resultType="com.hgs.ssm.User">
select * from User
</select>
<insert id="insertUser" parameterType="com.hgs.ssm.User">
insert into User(nickname,password) values(#{nickname},#{password})
</insert>
<delete id="deleteUser" parameterType="com.hgs.ssm.User">
delete from User where id = #{id}
</delete>
</mapper>
namespace命名空间防止sql语句的id重名
namespace 命名规则 包名+类名/包名+mapper文件名
parameterType 指sql语句参数类型
resultType 返回结果类型
useGeneratedKeys = “true” 使用自增主键
6:编写Dao
package com.hgs.ssm;
import java.io.IOException;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.hgs.ssm.mybatis.MyBatisUtils;
public class UserDao {
public List<User> getAllUser() throws IOException {
SqlSession session = MyBatisUtils.getSession();
//现在的方式,通过接口
UserMap userMap = session.getMapper(UserMap.class);
List<User> list = userMap.selectAllUser();
session.close();
return list;
}
public User getUser(String id) throws IOException{
SqlSession session = MyBatisUtils.getSession();
//以前的方式
User user = session.selectOne("com.hgs.ssm.UserMap.selectUser",id);
session.close();
return user;
}
public void delete(String id) throws IOException{
SqlSession session = MyBatisUtils.getSession();
UserMap userMap = session.getMapper(UserMap.class);
userMap.deleteUser(id);
session.commit();
session.close();
}
public void insert(String nickname,String password) throws IOException{
SqlSession session = MyBatisUtils.getSession();
UserMap userMap = session.getMapper(UserMap.class);
userMap.insertUser(nickname, password);
session.commit();
session.close();
}
}
UserMap接口:
package com.hgs.ssm;
import java.util.List;
/**
*
* @author Administrator UserMap名字一定要与namespace的一致,否则报is not known to the
* MapperRegistry 其方法也要与id一致 这接口相当于UerMapper映射器的接口版
*/
public interface UserMap {
User selectUser(int id);
List<User> selectAllUser();
void deleteUser(String id);
void insertUser(String nickname,String password);
}
分页查询
select o.* from (sql) o limit firstIndex,pageSize
方式一:RowBounds实现分页
方式二:在映射文件中sql语句配置实现分页
*Spring整合MyBatis时,不需要再自己去封装得到sqlSession了,在MyBatis-spring包中封装了SqlSessionTemplate类,可以直接得到sqlSession。
测试
public class Test {
public static void main(String[] arg) throws IOException {
// SqlSession session = MyBatisUtils.getSession();
// User user = session.selectOne("com.hgs.ssm.UserMap.selectUser",2);
// System.out.println(user);
// UserMap userMapper = session.getMapper(UserMap.class);
// User u = userMapper.selectUser(1);
// System.out.println(u);
// session.close();
UserDao uDao = new UserDao();
// User user = uDao.getUser("8");
// System.out.println(user);
//query
// List<User> uList = uDao.getAllUser();
// for (User u : uList) {
// System.out.println(u);
// }
// uDao.insert("hgs", "asd123asd");
//
// SqlSession session = MyBatisUtils.getSession();
// UserDaoImpl userDaoImpl= session.getMapper(UserDaoImpl.class);
// User mUser = new User();
// mUser.setNickname("lvan");
// mUser.setPassword("admin");
// userDaoImpl.insertUser(mUser);
// List<User> uList = userDaoImpl.getAllUser();
// for (User u : uList) {
// System.out.println(u);
// }
// session.commit();
// session.close();
Map<String,String> map = new HashMap<String, String>();
map.put("nickname", "hgs");
//map.put("id","1");
List<User> user = uDao.getUserList(map);
for (User uu : user) {
System.out.println(uu);
}
}
}