mybatis
1、第一个mybatis项目
①、创建数据库
②、创建maven项目(删掉src做父工程)
③、pom文件导入maven依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</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.11</version>
<scope>test</scope>
</dependency>
</dependencies>
④、创建一个模块,编写mybatis核心配置文件、工具类
模块下的src – main – resource 文件夹下面创建一个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"/> <!--事务管理,默认是JDBC事务管理-->
<dataSource type="POOLED"> <!--数据来源,连接数据库-->
<property name="driver" value="${driver}"/><!--com.mysql.jdbc.Driver
<property name="url" value="${url}"/> <!--jdbc:mysql://localhost:3306/blog(这个是数据库的名字)?-->useSSL=true&useUnicode=true&characterEncoding=utf8
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
src – main – java – com – fu – dao + utils , 这个utils就是工具类,编写工具类
获取sqlSessionFactory对象的三步 (这三句是死的,可以直接拷)
String resource = "org/mybatis/example/mybatis-config.xml"; //加载mybatis资源
InputStream inputStream = Resources.getResourceAsStream(resource); //通过流来获取资源
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取对象
具体代码
package com.fu.utils;
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;
public class mybatisUtils {
static {
String resource = "org/mybatis/example/mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后写一个获取SqlSession的方法getSqlSession
因为sqlSessionFactory是在static,所以getSqlSession不能直接获取,所以需要提升作用域,再去获取SqlSession,最终工具类的目的就是为了获取SqlSession对象。
最终代码:
package com.fu.utils;
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;
public class mybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "org/mybatis/example/mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
⑤、写代码 ---- 实体类、Dao接口、接口实现类
实体类(com.fu.pojo下建一个User类)
alt + insert : 定义属性,无参,有参,get/set方法,toString方法
接口(com.fu.dao下建一个UserDao接口)
package com.fu.dao;
import com.fu.pojo.User;
import java.util.List;
public interface UserDao {
List<User> selectUser();
}
然后写接口的实现类,也就是接口的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 namespace="com.fu.dao.UserDao"> //绑定接口
<select id="selectUser" resultType="com.fu.pojo.User"> //
select * from user;
</select>
</mapper>
最后编写测试类
package com.fu.dao;
import com.fu.pojo.User;
import com.fu.utils.mybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
// 第一步:获取sqlsession对象 死的
SqlSession sqlSession = mybatisUtils.getSession();
//执行sql
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> user = userDao.selectUser(); //方法名修改正确,参数填写需要查询的,因为查询的是所有用户信息,所以返回的是一个User类型的List
for(User users : user){
System.out.println(users);
}//输出
sqlSession.close(); //关闭sqlsession 死的
}
会遇到的问题
1、没有注册
Type interface com.fu.dao.UserDao is not known to the MapperRegistry.
解决办法:核心配置文件中要有mapper标签,然后用/分隔,不是.
2、资源过滤,测试无法提取文件,需要手动资源过滤,再pom.xml中填上
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</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.11</version>
<scope>test</scope>
</dependency>
</dependencies>