使用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(); } }