1、什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决不同的问题。 使用框架的好处:框架封装了很多细节,使开发者可以使用极简的方式实现功能,大大提高开发效率。 2、三层架构: 表现层:用于展示数据 业务层:处理业务需求 持久层:与数据库交互的 3、持久层技术解决方案 JDBC技术: Connection PreparedStatement ResultSet Srping的JdbcTemplate:Spring对jdbc的简单封装 Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对jdbc的简单封装 以上都不是框架,JDBC是规范,Spring的JdbcTemplate和Apache的DBUtils都是工具类。 4、Mybatis环境搭建 1)创建maven工程并导入坐标; 2)创建实体类和dao的接口 3)创建Mybatis的主配置文件SqlMapConfig.xml 4)创建映射配置文件IUserDao.xml 注意事项: 1)mybatis的映射配置文件位置必须和dao接口的包结构相同 2)映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名 3)映射配置文件的操作配置(curd),id属性值的取值必须是dao接口的方法名 当我们遵从了以上3点之后,我们在开发中就无须再写dao的实现类。 5、mybatis 通过 xml 方式将要执行的各种 statement 配置起来 代码链接https://github.com/zrr52006/Mybatis01 1)导入坐标
<groupId>com.zz.george</groupId> <artifactId>Mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <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.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> </dependencies>View Code
2)实体类
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 + '\'' + '}'; } }View Code
3)dao接口
public interface IUserDao { /** * 查询所有操作 * @return */ List<User> findAll(); }View Code
4)创建Mybatis的主配置文件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"> <!-- mybatis的主配置文件 --> <configuration> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql的环境--> <environment id="mysql"> <!-- 配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="Aa123456"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 --> <mappers> <mapper resource="com/itheima/dao/IUserDao.xml"/> </mappers> </configuration>View Code
5)创建映射配置文件IUserMapper.xml
<?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.george.dao.IUserDao"> <!--配置查询所有--> <select id="findAll" resultType="com.george.domain.User"> select * from user </select> </mapper>View Code
6)main函数测试
package com.george.test; import com.george.dao.IUserDao; import com.george.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; /** * @author :zhangrr * @date :Created in 2023/5/27 22:11 * @description: * @modified By: * @version: */ 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 userDao = session.getMapper(IUserDao.class); //5.使用代理对象执行方法 List<User> users = userDao.findAll(); for(User user : users){ System.out.println(user); } //6.释放资源 session.close(); in.close(); } }View Code
7)log4j Code
1 # Set root category priority to INFO and its only appender to CONSOLE. 2 #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal 3 log4j.rootCategory=debug, CONSOLE, LOGFILE 4 5 # Set the enterprise logger category to FATAL and its only appender to CONSOLE. 6 log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE 7 8 # CONSOLE is set to be a ConsoleAppender using a PatternLayout. 9 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 10 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 11 log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n 12 13 # LOGFILE is set to be a File appender using a PatternLayout. 14 log4j.appender.LOGFILE=org.apache.log4j.FileAppender 15 log4j.appender.LOGFILE.File=d:\axis.log 16 log4j.appender.LOGFILE.Append=true 17 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout 18 log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\nView Code
6、mybatis 通过 注解方式将要执行的各种 statement 配置起来
同通过 xml 方式不同的是3)、4)、5)
1)dao接口修改为
@Select("select * from user")
List<User> findAll();
2)SqlMapConfig.xml修改
<mappers>
<mapper class="com.george.dao.IUserDao"/>
</mappers>
3)删除IUserMapper.xml
7、代码架构截图
8、分析
1)xml方式中的IUserMapper.xml
//namespace="com.george.dao.IUserDao" dao接口的全限定类名称,dao接口和Mapper.xml的映射关系主要体现
//resultType="com.george.domain.User" 结果返回的封装的实体类
2)test测试类分析
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
- 这里一般不用绝对路径(d:/xx/xx.xml)或者相对路径(src/java/xx.ml),
- 通常使用类加载器,但它只能读取类路径的配置文件
- 使用servletContext对象的getRealPath()