Mybatis入门教程(一)
Mybatis入门
Mybatis简介
Mybatis是一个持久层(Dao)框架,是一套完整的与数据库交互的解决方案,提供了简单的开发方式。让开发人员更专注于SQL语句上,而非数据库的连接等繁琐的操作。
Mybatis环境搭建
搭建环境的步骤:
- 编写主配置文件
- 编写Dao层接口
- 编写映射文件
- 调试测试
1. 编写主配置文件
Mybatis的主配置文件中包含了两个部分:数据库环境和连接映射文件,主配置文件名由自己随便定义即可。
例:MybatisConfiguration.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="">
</environments>
<mappers>
</mappers>
</configuration>
1.1 数据库环境configuration
主要配置数据库的相关参数,例如:连接数据库的驱动、数据库URL、用户名和密码等。
<environments default="mybatis">
<environment id="mybatis">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
可以同时配置多个数据库环境,每个环境由id属性区分。但是必须设置一个默认环境,如上述代码的default属性
transactionManager:事物管理器类型,会在第三部分详细介绍,这里先用POOLED
dataSource:数据库连接池
driver属性:数据库驱动,这里用的com.mysql.jdbc.Driver,高版本的需要用com.mysql.cj.jdbc.Driver
url属性:数据库连接地址
username属性:数据库用户名
password属性:数据库密码
1.2 连接映射文件mappers
用于连接所编写的映射文件
XML映射文件
<mappers>
<mapper resource="com/doublefloat/dao/mapper/IUserDaoMapper.XML"/>
</mappers>
如果是用XML编写的映射文件,需填写属性resource,其值为mapper文件的路径。
注:在Maven项目中mapper文件一般存放在Resource文件夹下,且目录需和相应的dao层接口的文件路径一致,若放在其他文件目录下,则需要在web.xml文件中添加相应的配置。
注解开发
<mappers>
<mapper class="com.doublefloat.dao.IUserDao"/>
</mappers>
在使用注解开发时,一般没有XML映射文件,因此需要设置接口的路径
2. 编写Dao层接口
作为三层架构中的数据持久层,在Dao层里编写与数据库的CRUD操作。在实际开发中我们为了提高开发效率,一般只编写接口文件而不需要为其编写相应的实现类,但是Mybatis也提供了编写实现类的功能,详见Mybatis自定义部分。
示例代码(IUserDao.java文件):
package com.doublefloat.dao;
import com.doublefloat.entity.User;
import java.util.List;
public interface IUserDao {
/**
* 查找所有用户
* @return
*/
public List<User> findAllUsers();
/**
* 根据ID查找用户
* @param id
* @return
*/
public User findUserById(Integer id);
/**
* 根据用户名查找用户
* @param username
* @return
*/
public List<User> findUsersByName(String username);
/**
* 添加用户
* @param user
*/
public void addUser(User user);
/**
* 更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 根据ID删除用户
* @param id
*/
public void deleteUserById(Integer id);
}
3. 编写映射文件
3.1 基于XML映射文件
在基于XML配置文件开发的项目中,需要根据相应的Dao层接口编写对应的映射文件。
<?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.doublefloat.dao.IUserDao">
<select id="findAllUsers" resultType="com.doublefloat.entity.User">
select * from users;
</select>
<select id="findUsersByName" resultType="com.doublefloat.entity.User">
select * from users where username = #{username};
</select>
<select id="findUserById" resultType="com.doublefloat.entity.User">
select * from users where id = #{id};
</select>
</mapper>
上述代码中的三个<select>标签分别对应着Dao层的三个查询方法,其中标签属性id必须和方法名一致。
<mapper>标签的namespace属性:同其他语言一样,这里的namespace属性也是为了区分多个文件中同名的映射方法。如在多个配置文件中都含有id为findUserById映射语句的情况下,namespace便是区分这些映射的唯一方法。
其他参数详解将会在Mybatis入门教程的的第二部分。
3.2 基于注解开发
在使用注解时,就不需要编写映射文件,在主配置文件连接映射文件时只需要作出相应的更改即可(详见上方“连接映射文件”)。
同时也需要在Dao层接口添加相应的注解
示例代码(IUserDao.java):
package com.doublefloat.dao;
import com.doublefloat.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
/**
* 查找所有用户
* @return
*/
@Select("select * from users;")
public List<User> findAllUsers();
/**
* 根据ID查找用户
* @param id
* @return
*/
@Select("select * from users where id = #{id};")
public User findUserById(Integer id);
/**
* 根据用户名查找用户
* @param username
* @return
*/
@Select("select * from users where username = #{username};")
public List<User> findUsersByName(String username);
}
4. 调试测试
测试步骤:
- 引用主配置文件
- 创建SqlSessionFactory工厂类
- 创建SqlSession对象
- 创建Dao层接口代理对象
- 执行Dao层代理对象的方法
- 释放资源
package com.doublefloat.dao;
import com.doublefloat.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class IUserDaoTest {
public static void main(String[] args) {
// 读取配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("MybatisConfig.XML");
} catch (IOException e) {
e.printStackTrace();
}
// 创建Session工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
// 获取Session对象
SqlSession sqlSession = factory.openSession();
// 获取接口代理
IUserDao iUserDao = sqlSession.getMapper(IUserDao.class);
// 使用代理对象执行方法
List<User> users = iUserDao.findAllUsers();
for (User user : users) {
System.out.println(user);
}
// 释放资源
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
sqlSession.close();
}
}
Mybatis自定义Dao层实现类
在编写Dao层接口之后我们并没有去编写其对应的实现类,而是直接编写其对应的映射文件。Mybatis会自动帮我们创建实现类。
1. 创建接口实现类
package com.doublefloat.dao;
import com.doublefloat.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory = null;
public UserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
}
@Override
public List<User> findAllUsers() {
// 创建sqlSession对象
SqlSession session = factory.openSession();
//
List<User> users = session.selectList("com.doublefloat.dao.IUserDao.findAllUsers");
// 释放资源
session.close();
return users;
}
}
2. 更改测试文件
package com.doublefloat.dao;
import com.doublefloat.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class IUserDaoTest {
public static void main(String[] args) {
// 读取配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("MybatisConfig.XML");
} catch (IOException e) {
e.printStackTrace();
}
// 创建Session工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
// 获取Session对象
SqlSession sqlSession = factory.openSession();
// 创建接口实现类
IUserDao iUserDao = new UserDaoImpl(factory);
// 执行实现类方法
List<User> users = iUserDao.findAllUsers();
for (User user : users) {
System.out.println(user);
}
// 释放资源
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
sqlSession.close();
}
}