MyBatis
使用MyBatis的意义
作为一个半自动的持久层框架,MyBatis将sql语句交给开发者去完成,使开发者可以优化自己的SQL语句,自身则完成剩余的部分。
第一个案例
创建项目
在maven中添加如下的依赖:
这两个分别是MyBatis和jdbc的驱动
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
创建数据库
这是建表的代码:
CREATE TABLE user(
id INT(10) NOT NULL auto_increment PRIMARY KEY,
userName VARCHAR(6) NOT NULl,
sex CHAR(1) DEFAULT("男"),
address VARCHAR(30)
)
创建配置文件
这个配置文件在官方的说明文档中给的有,想看的点下面的传送门。
官方的文档中也有所有的配置的说明,想学的话直接看文档也行。
这个是全局的配置文件,在这个里面配置了连接池、事务、以及sql映射文件的链接。
如果是使用配置文件的形式实现,在mappers里面写上对应的配置文件的地址,如果是使用注解实现了,那么写的就换成对应的类。
<?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="mysql">
<environment id="mysql">
<!-- 配置事务-->
<transactionManager type="JDBC"/>
<!-- 配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件位置-->
<mappers>
<!-- <mapper class="com.modevil.dao.UserDao"/>-->
<mapper resource="com/modevil/dao/UserDao.xml"/>
</mappers>
</configuration>
以下sql映射文件的代码,这个部分可以使用注解来代替。
一般情况这个文件中
namespace和对应类的全类名是相同的
每一个id对应类中的一个方法
<?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.modevil.dao.UserDao">
<select id="findAll" resultType="com.modevil.domain.User">
SELECT * FROM user
</select>
</mapper>
对应的类
然后就是对应的Dao接口了,这个接口不是必要的,但是推荐使用这种方法
如果是使用配置文件的形式,在这个类中写方法,然后在配置文件中写对应的sql语句。
如果是使用注解的形式,只需要在方法名上面添加一个注解@Select()在这个里面写上sql语句即可。
package com.modevil.dao;
import com.modevil.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author modev
* @date 2020/9/8 16:49
*/
public interface UserDao {
/**
* 查询所有用户
* @return 返回用户列表
*/
// @Select("SELECT * FROM user;")
List<User> findAll();
}
测试
一般有以下的几步:
- 通过映射文件创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 使用SqlSession获取对应的代理类
- 通过代理类进行各种操作
其中
- 创建SqlSessionFactory也可以通过对应的Class类来创建,具体的方法可以看官方的文档。
- SqlSession不止可以获取代理类,也可以直接执行配置文件中的sql语句,然后返回查询结果
- SqlSession在使用完之后要进行关闭,一般都放在finally中,保证一定会执行。
这个是一个简单的示例:
@Test
public void test2() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
List<Object> list = sqlSession.selectList("com.modevil.dao.UserDao.findAll");
System.out.println(list);
}finally {
sqlSession.close();
inputStream.close();
}
}
在这个示例中,没有获取代理类,直接通过配置文件的全类名加id执行,获取返回的数据。
@Test
public void test1() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserDao userDao = sqlSession.getMapper(UserDao.class);
System.out.println(userDao.getAllUser());
}finally {
sqlSession.close();
inputStream.close();
}
}
参考
- 官方的说明文档
- 黑马程序员的MyBatis教程
- 尚硅谷的MyBatis教程