MyBatis入门
1.创建maven工程
创建mybatis的工程,工程信息:
<groupId>com.itheima</groupId> <artifactId>day01_eesy_01mybatis</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
2.添加MyBatis3.4.5的坐标
在pom.xml文件中添加坐标(此处可以省略过)
<dependencies> <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.10</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.6</version> </dependency> </dependencies>
3.编写User实体类
注意实现序列化接口。序列化简单的说就是在不同时间或不同平台的JVM之间共享实例对象。
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 + '\'' + '}'; } }
3.编写持久层IUserDao接口
public interface IUserDao{ //可以省略public,返回类型List,查询所有功能 public List<USer> findAll(); }
4.编写持久层映射文件
注意:映射配置文件的位置必须和dao接口的包结构相同
<?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.itheima.dao.IUserDao">
<!–配置查询所有,这些代码为配置映射信息,有了执行sql语句,就可以获取PreparedStatement对象
有了PreparedStatement之后就可以进行参数的设置,之后就是返回结果集,遍历结果集。同上文
JDBC
–>
<select id="findAll" resultType="com.itheima.domain.User"> select * from user </select> </mapper>
解释说明:
# mapper:它是映射文件的根元素结点,注意是映射文件,他只有一个属性,那就是namespace
* namespace:用于区分不同的mapper,全局唯一,通常写持久层接口的地址。
# select:表示查询语句。
* id属性:该命名空间下唯一标识符,注意它只是一个标识符,可以写别的东西。
* resultType属性: 表示SQL语句返回值类型。即List<User>中的User类型。
5.编写SqlMapConfig.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuraion PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtdmybatis-3-config.dtd"> <configuration> <!--配置环境--> <environments default="mysql"> <environment id="mysql"> <!--配置事务类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisbd"/> <property name="username" value="root"/> <property name="password" value="200828"/> </dataSource> <environment> <environments> <!--告知mybatis映射配置文件的位置--> <mappers> <!--基于XML的配置方式--> <mapper resource="com/itheima/dao/IUserDao.xml"><mapper/> <mappers> </configuration>
解释说明:
# configuration:配置文件的根元素结点。
# environments:表示配置MyBatis的多套运行环境。将sql映射到多个不同得到数据库中,该元素节点下可以有多个environment子元素结点。可以呀开发环境和测试环境。但是必须指定其中一个为默认环境用default表示。
# environment:表示MyBatis的一套配置环境,需要指定运行环境ID,事务管理,数据源配置等相关信息(transactionManager,dataSource)。
# properties:该属性文件描述数据库连接的相关配置Driver,url,username,password.如果在<configuration>中引入了database.properties,该属性通过resource属性从外部指定的properties属性配置文件,value后面跟${},现在用yaml比较多
# mappers:告诉MyBatis去哪里找SQL映射文件。
# mapper:具体指定SQL映射文件的路径 resource:是通过XML来进行配置的,class:是通过注解来配置的.
6.编写测试类
public class MybatisTest{ public static void main(String[] args) throws Exception{ //此处用到了工厂模式,此后稍作讲解 //1.读取配置文件 InputStream in = Resource.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建SqlSessionFactory工厂 SqlSessionFactory factory = builder.build(in); //4.使用工厂创建SqlSession对象 SqlSession session = factory.openSession(); //5.使用session创建IUserDao代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //6.使用代理对象查询方法,返回List List<User> users = userDao.findAll(); for(User user : users){ System.out.println(user); } //7.释放资源 session.close(); in.close(); } }
需要牢记这七个步骤很重要!
7.MyBatis的核心控制对象
MyBatis的三个基本要素:核心接口和类,核心配置文件,SQL映射文件
SqlSessionFactoryBuilder—>build()—>SqlSessionFactory—>openSession()—>SqlSession
7.1SqlSessionFactory的构造者—-SqlSessionFactoryBuilder
作用:
负责创建SqlSessionFactory,并且提供了多个build()方法
特点:
用过即丢,一旦创建了SqlSessionFactory对象,SqlSessionFactoryBuilder就不需要存在了,因此它的最佳使用范围就是存在于方法体内,也就是局部变量。
7.2SqlSession的工厂—SqlSessionFactory
作用:
SqlSessionFactory就是创建SqlSession的工厂,有了它之后就可以通过.openSession()来创建SqlSession对象。
生命周期和作用域:
一旦创建,在整个应用运行过程中始终存在。,随着应用的声明周期一致存在。放在静态代码块中可进行优化
7.3使用SqlSession进行数据的持久化操作
作用:
用于持久化操作对象,类似于jdbc的connection,它提供了面向数据库执行sql命令的所有方法,增删改查等,可以通过SqlSessson实例直接运行已经映射的SQL语句。
作用域和生命周期:
SqlSession对应一次数据库会话。最佳作用域是request作用域或者方法体作用域。
使用方式:
通过代理对象进行方法查询
IUserDao userDao = session.getMapper(IUserDao.class);
List<User> users = userDao.findAll();
8.补充配置文件一些基本元素
8.1typeAliases元素:
作用是配置类型别名,通过于MyBatis的SQL映射文件相关联,减少冗余
<typeAliases> <typeAlias alias="user" type="com.itheima.domain.Usr"/> </typeAliases>
<!–此时resultType可以写成 User–>