1.mybatis概述
- mybatis是一个持久层框架,用Java写的
- 它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。
- 它使用了ORM三层架构
- mybatis依赖
<packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> </dependencies>
mysql依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>
日志依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
单元测试
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
mybatis配置文件约束
<?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">
mapper配置文件约束
<?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">
2.项目创建(入门案例)
方法一:通过配置文件
- 创建maven工程,并添加依赖
<packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
2.创建实体类和dao接口
实体类User
package damain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
UserDao接口(dao和mapper是一样的)
public interface UserDao { List<User> findAll(); }
3.创建mybatis配置文件
<?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"> <!--mybatis的主配置文件--> <configuration> <!--配置环境--> <environments default="default"> <!--环境变量--> <environment id="default"> <!--事务管理器--> <transactionManager type="jdbc"/> <!--数据源(连接池)--> <dataSource type="pooled"> <!--配置连接数据库的四个基本信息--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_study"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--指定映射配置文件的位置,映射配置文件指的是每个单独的dao配置文件--> <mappers> <mapper resource="dao/UserDao.xml"></mapper> </mappers> </configuration>
4.创建映射配置文件
- id:对应namespace中的方法名
- resultType:SQL语句返回值类型
- parameterType:方法里的参数类型
<?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 namespace="dao.UserDao"> <!--配置查询所有--> <!--id对应的是dao层的方法名,resultType对应的实体类,--> <select id="findAll" resultType="domain.User"> select * from user </select> </mapper>
5.创建工具类
MybatisUtil.java
public class MybatisUtil { private static SqlSessionFactory factory; static{ try { //1.读取配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml"); //2.创建SqlsessionFactory工厂 factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ //3.使用工厂生产sqlsession对象 SqlSession session = factory.openSession(); return session; } }
方法二:通过注解
1,2,3相同。
mybatis_config.xml
<!--指定映射配置文件的位置,resource属性映射配置文件指的是每个单独的dao配置文件 如果是注解来配置的话,此处应该用class属性指定被注解的dao全限定类名 --> <mappers> <mapper class="dao.UserDao"></mapper> </mappers>
UserDao接口
public interface UserDao { @Select("select * from user") List<User> findAll(); }
测试类
查询所有
SqlSession session = MybatisUtil.getSqlSession(); UserDao userDao = session.getMapper(UserDao.class); List<User> list = userDao.findAll(); for (User user : list) { System.out.println(user); } //释放资源 session.close();
错误解决ExceptionInInitializerError
在pom.xml加入
<!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
3.环境配置
mybatis可以配置多种环境
尽管可以配置多种环境,但每个SqlSessionFactory实例只能选择一种环境
mybatis默认的事务管理器是jdbc,连接池POOLED
编写配置文件
db.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis_study?serverTimezome=UTC username=root password=123456
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"> <!--mybatis的主配置文件--> <configuration> <!--导入外部配置文件,properties必须放在最上边--> <properties resource="db.properties"> <!--里面可以继续写属性,但是没外部文件的优先级高--> <property name="username" value="root"/> </properties> <!--配置环境--> <environments default="development"> <!--环境变量--> <environment id="development"> <!--事务管理器--> <transactionManager type="jdbc"/> <!--数据源(连接池)--> <dataSource type="pooled"> <!--配置连接数据库的四个基本信息--> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--指定映射配置文件的位置,映射配置文件指的是每个单独的dao配置文件--> <mappers> <mapper resource="mapper/UserMapper.xml"></mapper> </mappers> </configuration>