Mybatis
- 第一个myabtis程序:
思路: 搭建环境 -----> 导入mybatis ------>编写代码 ------>测试代码
1.1 搭建环境
步骤:
-
搭建数据库
-
新建maven项目
2.1 删除src目录
2.2 导入需要的maven 依赖
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</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.12</version>
</dependency>
</dependencies>
-
在项目里面创建一个模块
点击 项目 , 在新建一个Module
-
编写mybatis的核心配置文件
在resources文件夹中 ,创建一个 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"> <transactionManager type="JDBC"/> <!--事务--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration> -
编写mybatis的工具类
package com.lsq.utills; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //mybatis 工具类 /* sqlSessionFactory ---生产--> sqlSession */ public class MybatisUtils { /* sqlSessionFactoryBuilder(构造器) ,会根据,代码或配置 ,生产 sqlSessionFactory */ static { //mybatis 的第一步, 获取 sqlSessionFactory 对象 try { String resource ="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //通过sqlSessionFactoryBuilder类(构造器), 生成一个sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } } 5.1 这是myabtis 的第一步, 获取 sqlSessionFactory 对象
5.2 由 sqlSessionFactory 获取 sqlSession sqlSession 完全包含了面向数据库执行SQL命令所需的需所有方法
``` javapackage com.lsq.utills;
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;//mybatis 工具类
/*
sqlSessionFactory ---生产--> sqlSession*/
public class MybatisUtils {/* sqlSessionFactoryBuilder(构造器) ,会根据,代码或配置 ,生产 sqlSessionFactory */ private static SqlSessionFactory sqlSessionFactory; //提升作用域 static { //mybatis 的第一步, 获取 sqlSessionFactory 对象 try { String resource ="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //通过sqlSessionFactoryBuilder类(构造器), 生成一个sqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //获取 从sqlSessionFactory 中获取sqlSession public static SqlSession getsqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; }}
pojo 实体类
package com.lsq.pojo; public class User { private int id; private String name; private String pwd; public User(){ } public User(int id,String name ,String pwd){ this.id=id; this.name=name; this.pwd=pwd; } 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 getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
-
定义接口
package com.lsq.dao; import com.lsq.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); } -
mybatis 不在需要接口实现类 , 由 配置文件代替 ,这里我要UserMapper.xml , mybatis使用动态代理技术使得这个接口执行,
mybatis会为这个接口生成一个代理对象
<?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"> <!-- 根据namespace = 绑定一个对应的Dao接口 /或Mapper接口 --> <mapper namespace="com.lsq.dao.UserDao"> <!--相当于接口实现类--> <select id="getUserList" resultType="com.lsq.pojo.User"> <!--id 对应dao接口的方法名--> select * from mybatis.user </select> </mapper> -
测试代码
最好建立测试的结构和 正常代码的位置一样
``` javapackage com.lsq.dao;
import com.lsq.pojo.User;
import com.lsq.utills.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;
public class UserDaoTest {
@Test public void test(){ //1. 获取sqlsession SqlSession sqlSession = MybatisUtils.getsqlSession(); //映射器的接口实例 是从 sqlSession中获取的 UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> userList = mapper.getUserList(); //执行接口中定义的方法 for (User u: userList) { System.out.println(u); } sqlSession.close(); }}
```
执行这个测试类 会出现异常, org.apache.ibatis.binding.BindingException: Type interface com.lsq.dao.UserDao is not known to the MapperRegistry.
异常解析:类型接口 (指定的某接口) , 是未知的 mapperRegistry(未知的mapper注册中心)
问题是: mapper 没有在mybatis的核心配置文件中 配置该mapper
<!--mappers 注册中心 每一个mapper.xml 都需要在mybatis核心配置文件中心 注册 -->
<mappers>
<!--注册 UserDao接口 的配置文件 UserMapper.xml 的mapper -->
<mapper resource="UserMapper.xml"/>
</mappers>
maven 项目 打包文件过滤问题, 一些 在java 中的定义的文件,有时候读取不到
解决方案 在maven 项目的 pom.xml 下
<!-- 解决maven打包时候, 在src/main/java目录下的xml文件没有打包进来的问题 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
-
Mybatis 的 组成元素的 生命周期
-
sqlSessionFacatoryBuilde : 这个类可以被实例化, 一旦创建出了 sqlSessionFactory 就不需要 它了
-
sqlSessionFactory : 一旦被创建就应该在运行期间一直存在,
-
sqlSession 则相当于一个connnection 连接对象 ------》 sqlsession几乎包含所有的数据库语句
-
Mapper : 这是一个接口 , 由sqlSession 创建, 用来处理一些业务, 作用范围最好和sqlSession 一样
-