Mybatis框架(入门)
注:在此使用的是maven创建的Java项目
-
mybaties的环境搭建
- 创建maven工程并导入坐标
- 打开IDEA—>Create New Project —> Maven(在此处可以选择不勾选Create from archetype)—>写入必要信息—>finish
- 在pom.xml中导入依赖jar包
<groupId>zhi.itlearn</groupId>
<artifactId>java_mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <!-- 设定打包方式 -->
<!-- 导入依赖jar包。
其中:mybatis、mysql-connector-java是必须的依赖
log4j:日志和junit测试是非必须的-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 引入log4j.properties文件(附:具体配置代码。若文件丢失可直接自创建)
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=d:\axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
- 创建实体类和dao的接口(注意是接口,而不再需要接口实现类)
- 在main/java下创建包路径:itlearn.zhi.domain
- 创建实体类:User
package itlearn.zhi.domain; import java.io.Serializable; import java.util.Date; /* * 实体类应该实现Serializable接口 * */ public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; //get、set和toString方法省略 }
- 在itlearn.zhi下创建包dao
- 在dao包中创建dao层接口:IUserDao
package itlearn.zhi.dao; import itlearn.zhi.domain.User; import java.util.List; public interface IUserDao { //查询所有User public List<User> findAll(); }
- 在main/resources下创建Mybatis的主配置文件:SqlMapConfig.xml
- 引入SqlMapConfig.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="mysql"> <!-- 这里的default属性值不固定,建议与当前使用的数据库名称相同 -->
<!-- 配置mysql的环境 -->
<environment id="mysql"> <!-- 这里的id属性值必须和上面default值相同 -->
<!-- 配置事务的类型:JDBC -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接事务的四个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="itlearn/zhi/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
- 创建映射配置文件:IUserDao.xml
- 接口映射配置文件的路径必须和对应的接口路径相同,只不过是在resources包中
在main/resources下创建与映射接口相同包路径。
注:在resources中不能像java文件夹中创建package一样,而是要逐层创建文件夹。
- 引入接口映射配置文件的约束
<?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></mapper>中 -->
<mapper namespace="itlearn.zhi.dao.IUserDao"> <!-- namespace属性值必须是dao接口的全限定类名 -->
<select id="findAll" resultType="itlearn.zhi.domain.User"><!-- id属性必须对应接口中的方法 -->
SELECT * FROM USER; <!-- 具体的实现语句 -->
</select>
</mapper>
- 环境搭建的注意事项
1. mybatis的接口映射配置文件的位置必须和dao接口的包结构相同 2. 每个dao层接口都对应一个接口映射配置文件【重点】 3. 接口映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名 4. 映射配置文件的id属性取值必须是dao接口的方法名 5. 在开发中不需要再写dao接口的实现类【重点】
- 创建测试类MybatisTest,进行入门学习
- 调用接口方法的步骤:
1.读取配置文件 2.创建SqlSessionFactory工厂 3.使用工厂生产SqlSession对象 4.使用SqlSession创建Dao接口的代理对象 5.使用代理对象执行方法 6.释放资源 内部思路:通过读取SqlMapConfig配置文件,创建一个工厂,通过这个工厂生产一个SqlSession对象,这个对象用于创建dao的代理,实现之后可通过此代理对象调用dao的方法。
- 代码展示:
package itlearn.zhi.test; import itlearn.zhi.dao.IUserDao; import itlearn.zhi.domain.User; 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; import java.util.List; public class MybatisTest { public static void main(String[] args) throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 SqlSession session = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 IUserDao dao = session.getMapper(IUserDao.class); //5.使用代理对象执行方法 List<User> users = dao.findAll(); for (User user : users) { System.out.println(user); } //6.释放资源 session.close(); in.close(); } }
- 注意事项:
1. 读取核心配置文件:使用InputStream流,读取核心配置文件的代码为: Resources.getResourceAsStream("SqlMapConfig.xml"); 2. 创建SqlSessionFactory对象的时候,SqlSessionFactory是一个接口,不能直接new,只能通过实现类(SqlSessionFactoryBuilder)创建对象来接收。 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in);//传入输入流对象 3. 产生动态代理调用的方法为:getMapper(传入dao层接口的字节码对象),使用dao层接口接收 IUserDao dao = session.getMapper(IUserDao.class); 4. 创建工厂使用的是:构建者模式:将创建对象的具体细节隐藏,使使用者直接调用方法即可创建对象。
- 注解开发(简单入门)
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定sql语句。
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名
<mappers>
<mapper class="itlearn.zhi.dao.IUserDao"></mapper>
</mappers>
@Select("select * from user;")
public List<User> findAll();