Mybatis环境搭建与配置
-
搭建数据库
-
构建Maven项目
<dependency> <groupId>org.mybatis</groupId> <!--Mybatis--> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <!--数据库连接--> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>junit</groupId> <!--单元测试--> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
-
配置Mybatis核心配置文件
XML 配置文件中包含了对 MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
<?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"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/> <!--后面条件必写,否则会中文乱码--> <property name="username" value="root"/> <property name="password" value="180018ly"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
-
构建Mybatis工具类
从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个SqlSessionFactory的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。
但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或file:// URL 构造的输入流。MyBatis 包含一个名叫Resources的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
public class MybatisUtil { private static SqlSessionFactory sqlSessionFactory ; //在static静态代码块中 , 可以在类初始化的时候就执行 static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } }
不使用 XML 构建 SqlSessionFactory
如果你更愿意直接从 Java 代码而不是 XML 文件中创建配置,或者想要创建你自己的配置建造器,MyBatis 也提供了完整的配置类,提供了所有与 XML 文件等价的配置项。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(BlogMapper.class); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
-
使用SqlSessionFactory获得sqlSession实例
从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过SqlSession 实例来直接执行已映射的 SQL 语句。例如:
public class MybatisUtil { private static SqlSessionFactory sqlSessionFactory ; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); // return sqlSessionFactory.openSession(true); 可以自动commit ,不用进行手动设置了 } }
测试代码
-
创建与数据库表对应的pojo类
public class User { private int id ; private String name; private String password; public User(){}; public User(int id, String name, String password) { this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
-
编写实现接口
在传统JavaWeb开发中,持久层Dao的一般流程为 :
-
BaseDao基类提供数据库资源的连接、释放操作与具体数据库操作
-
就各个业务编写响应的dao接口
-
对每个接口编写Impl实现类 ,实现接口 完成具体的操作 来连接 Dao层与Service层
在MyBatis开发中,舍弃了BaseDao与Impl实现类 , 使用dao接口与Mapper.xml配置文件来进行具体操作
//UserDao 接口 public interface UserDao { public List<User> getUserList(); }
<!--UserMapper映射文件--> <?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"> <!-xml配置文件头--> <mapper namespace="com.liu.dao.UserDao"> <!--xml与dao接口的映射,namespace直接映射相应dao接口,相当于传统JavaWeb开发中Impl实现类对dao的implements--> <!--查询语句--><!--mapper.xml配置文件中真正的 持久层操作内容--> <select id="getUserList" resultType="com.liu.pojo.User"> <!--id为映射接口dao的相应方法名 resultType需要使用 全限定名 集合使用内部泛型类--> select * from mybatis.user <!--获取数据库mybatis表user中所有信息,以pojo类的形式返回--> </select> </mapper>
mybatis-config.xml核心配置文件中配置刚刚的mapper.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"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="180018ly"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/liu/dao/UserMapper.xml"/> <!--配置mapper映射文件--> </mappers> </configuration>
-
-
测试Junit
public class userDaoTest { @Test public void Test() { //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); //2.执行SQL UserDao userDao = sqlSession.getMapper(UserDao.class); //通过namespace映射,通过UserDao.class 读取对应的映射文件 UserMapper.xml List<User> list = userDao.getUserList(); //直接使用方法 for(User u : list) { System.out.println(u.toString()); } sqlSession.close(); } }
MyBatis三个作用域(核心接口)
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory 被视为一种代码“坏习惯”。因此==SqlSessionFactory 的最佳作用域是应用作用域。==有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。下面的示例就是一个确保 SqlSession 关闭的标准模式:
try (SqlSession session = sqlSessionFactory.openSession()) {
// 你的应用逻辑代码
}
public class userDaoTest {
@Test
public void Test() {
//1.获取SqlSession对象
SqlSession sqlSession = null;
//2.执行SQL
try{
sqlSession = MybatisUtil.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> list = userDao.getUserList();
for(User u : list)
{
System.out.println(u.toString());
}
}catch(Exception e)
{
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}
问题点
- 配置文件注册问题
- 接口绑定 namespace
- 映射方法名
- resultType 返回类型
- Maven资源过滤问题