框架
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
三层架构
表现层:是用于展示数据的
业务层:是处理业务需求
持久层:是和数据库交互的
持久层技术解决方案
- JDBC技术:
Connection
PreparedStatement
ResultSet
- Spring的JdbcTemplate:
Spring中对jdbc的简单封装
- Apache的DBUtils:
它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
以上这些都不是框架,JDBC是规范,Spring的JdbcTemplate和Apache的DBUtils都只是工具类。
MyBatis
mybatis
是一个持久层框架,用java
编写的。它封装了jdbc
操作的很多细节,使开发者只需要关注sql
语句本身,而无需关注注册驱动,创建连接等繁杂过程。它使用了ORM
思想实现了结果集的封装。
ORM
Object Relational Mappging
对象关系映射
简单的说就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
创建Maven工程
填写配置文件pom
导入jar包的坐标:mybatis
/ mysql
/ log4j
/ junit
等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>zhu.hong</groupId> <artifactId>maven_mybatis</artifactId> <version>1.0-SNAPSHOT</version>
<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>LATEST</version> </dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
</dependencies>
</project>
|
创建DAO接口
在对应的包下创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package zhu.hong.dao;
import zhu.hong.entity.User;
import java.util.List;
public interface UserDAO {
List<User> findAll(); }
|
添加sqlMapConfig.xml文件
在main
下的resources
下创建sqlMapConfig.xml
文件, 对数据库的连接进行配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?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"></transactionManager>
<dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource>
</environment> </environments>
<mappers> <mapper resource="zhu/hong/dao/UserDAO.xml"></mapper> </mappers>
</configuration>
|
添加UserDAO.xml配置文件
在resources
下面创建和main
下的相同的目录结构, 添加UserDAO.xml
文件。在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
,所以:UserDao
和 UserMapper
是一样的
注意里面填写的配置信息:映射配置
映射配置文件的mapper
标签的namespace
属性的取值必须是dao
接口的全限定类。
映射配置文件的操作配置(select
),id
属性的取值必须是dao
接口的方法名
1 2 3 4 5 6 7 8 9 10 11 12
| <?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="zhu.hong.dao.UserDAO">
<select id="findAll" resultType="zhu.hong.entity.User"> select * from users </select>
</mapper>
|
resultType=”zhu.hong.entity.User”:
因为需要对结果集封装,所以要指定封装到哪里。
这样配置之后就无需再写DAO接口的实现类了。
测试
注意下面的步骤:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package zhu.hong.test; 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 zhu.hong.dao.UserDAO; import zhu.hong.entity.User; import java.io.InputStream; import java.util.List;
public class MyBatisTest {
public static void main(String[] args) throws Exception { InputStream in = Resources.getResourceAsStream("SQLMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
List<User> users = userDAO.findAll(); for (User user: users){ System.out.println(user); } sqlSession.close(); in.close();
}
}
|
使用 注解配置
使用了注解配置后,UserDAO.xml就没啥用了,可以直接删除,不删除会报错…
在DAO接口方法中使用注解声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package zhu.hong.dao; import org.apache.ibatis.annotations.Select; import zhu.hong.entity.User; import java.util.List;
public interface UserDAO {
@Select("select * from users") List<User> findAll(); }
|
然后在sqlMapConfig.xml中修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?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"></transactionManager>
<dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource>
</environment> </environments>
<mappers>
<mapper class="zhu.hong.dao.UserDAO"></mapper> </mappers>
</configuration>
|
在实际开发中,都是越简便越好,所以都是采用不写dao
实现类的方式。不管使用XML还是注解配置。但是Mybatis
它是支持写dao
实现类的。