Mybatis快速入门
1.需求
使用MyBatis查询所有的用户, 封装到List集合
2.分析
- 创建maven工程(jar),添加坐标
- 创建pojo
- 创建UserDao接口
- 创建UserDao映射文件
- 创建Mybatis核心配置文件SqlMapConfig.xml
- 编写java代码测试
3.实现
准备工作:
• 数据库
CREATE TABLE t_user(
uid int PRIMARY KEY auto_increment,
username varchar(40),
sex varchar(10),
birthday date,
address varchar(40)
);
INSERT INTO t_user
VALUES (null, ‘zs’, ‘男’, ‘2018-08-08’, ‘北京’);
INSERT INTO t_user
VALUES (null, ‘ls’, ‘女’, ‘2018-08-30’, ‘武汉’);
INSERT INTO t_user
VALUES (null, ‘ww’, ‘男’, ‘2018-08-08’, ‘北京’);
MyBatis快速入门
命名普遍规则:
类,接口名:两个大写字母。如:UserDao
方法名:中间的大写字母。如:findAll
Dao接口的名字:pojo+Dao。比如:UserDao
1. 创建Maven工程,添加坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--引入lombok的依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
2. 创建pojo
class User implements Serializable {
private Integer uid; //用户id
private String username; //用户姓名
private String sex; //用户性别
private Date birthday; //用户生日
private String address; //用户地址
}
public
3. 创建UserDao接口
UserDao接口就是我们持久层接口(也可以写成UserMapper)
public interface UserDao {
/**
* 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
* @return
*/
public List<User> findAll();
}
4. 创建UserDao.xml映射文件
注意:
- 映射配置文件的路径在resources里面,要和对应的Dao接口的路径保持一致
- 映射配置文件的文件名必须和Dao接口名保持一致
- 一定要引入约束文件
- Sql语句不要有;号结尾。
注意在rosource下用/,用.的话不会分隔,会全部成一个包名。
<?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,一个映射配置文件,对应一个dao接口
根标签的namespace属性的值就对应dao接口的权限定名
-->
<mapper namespace="com.gavin.dao.UserDao">
<!--
根标签的每一个子标签就对应dao接口的每一个方法:
select标签对应了查询方法
标签的id值对应方法的名字
标签的resultType的值就对应封装结果类型,如果封装结果类型是List就对应其泛型的类型
标签体的内容就是要执行的SQL语句
-->
<select id="findAll" resultType="com.gavin.pojo.User">
select * from t_user//!!不要有;了!
</select>
</mapper>
5. 创建mybatis核心配置文件SqlMapConfig.xml
注意:
- 存放的路径必须是resources的根路径
- 配置文件的名字,随便写
- 一定要引入约束文件
<?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
-->
<configuration>
<!--
配置数据库的环境信息:
environments:表示里面可以配置多个环境,default使用哪个环境
environment:每一个environment表示一种环境
为什么要配置多个环境:因为我们有多个环境(开发环境、生产环境(真正项目之后运行的环境)、测试环境)
-->
<environments default="dev">
<!--开发环境-->
<environment id="dev">
<!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
<dataSource type="POOLED">
<!--连接池的配置信息-->
<property name="username" value="root"/>
<property name="password" value="asd"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"/>
<!—两个斜杠后面localhost:3306/但是三个斜杠就可省略了这个,直接写数据库名。-->
</dataSource>
</environment>
<!--生产环境-->
<environment id="pro">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
<!--测试环境-->
<environment id="test">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
<!--
指定加载哪些映射配置文件:mappers
mapper标签:每一个mapper标签负责加载一个配置文件;resource指定要加载的映射配置文件的路径
-->
<mappers>
<mapper resource="com/gavin/dao/UserDao.xml"></mapper>//注意是斜线!
</mappers>
</configuration>
6. java代码测试
测试包里面绿色java包里面,建个和上面一样的包结构,com.gavin里面一个测试类名即可。
然后运行,点方法旁边的绿色箭头运行即可。
package com.gavin;
import com.gavin.dao.UserDao;
import com.gavin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.apache.ibatis.io.Resources;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
public void testFindAll() throws IOException {
//1.让mybatis框架去加载主配置文件
//1.1 将主配置文件SqlMapConfig.xml转换成字节输入流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//1.2创建一个SqlSessionFactoryBuilder
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//1.3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);
//1.4使用sqlSessionFactory对象创建处SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();//使用了工厂模式
最终目标://2.使用sqlSession对象创建出UserDao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);//使用了动态代理
//3.调用userDao代理对象的findAll()方法进行查询
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
//4.关闭资源
sqlSession.close();
is.close();
}
}
看错误日志
出错时从第一行看,发现告诉了错误位置,和提示可能,都在最前面几行。
就开头这些###的内容都是提示,看这个找就行。
Mapper动态代理方式规范
入门案例回顾
Mapper.xml(映射文件)
- 映射配置文件存储的路径在resources里面,要和对应的Dao接口的路径保持一致
- 映射配置文件的文件名必须和Dao接口名保持一致
- 一定要引入约束文件
- namespace属性的值和对应Dao接口的全限定名一致
- 每一个子标签,就对应Dao接口中的一个方法
查询方法就对应select标签
添加方法就对应insert标签
删除方法就对应delete标签
修改方法就对应update标签
标签的id就对应方法的名字
标签的parameterType就对应方法的参数类型
标签的resultType(只有select标签才有)就对应方法的返回值类型,如果返回值类型是List,那么resultType就是List的泛型类型
标签体中的内容就是要执行的sql语句
<?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.gavin.dao.UserDao">
<select id="findAll" resultType="com.gavin.pojo.User">
select * from t_user
</select>
</mapper>
Mapper.java(dao接口)
public interface UserDao {
/**
* 执行一个查询所有用户的sql语句,并且将查询到的结果封装到List<User>
* @return
*/
public List<User> findAll();
}
规范
Mapper接口开发需要遵循一下规范:
- 存储路径建议和对应的Dao接口保持一致
- 文件名建议和对应的Dao接口的名字保持一致
- 配置文件的根标签的namespace属性必须和对应的Dao接口的全限定名保持一致
- 接口中的每一个方法,就对应映射配置文件中的一个标签
a) 查询方法,对应select标签
b) 添加方法,对应insert标签
c) 删除方法,对应delete标签
d) 修改方法,对应update标签 - 映射配置文件中的标签的id属性,就必须和对应的方法的方法名保持一致
- 映射配置文件中的标签的parameterType属性,就必须和对应的方法的参数类型(全限定名)保持一致
- 映射配置文件中的标签的resultType属性,就必须和对应的方法的返回值类型(全限定名)保持一致,但是如果返回值是list则和其泛型保持一致
3、核心配置文件详解
核心配置文件的顺序
标签顺序如图
properties(引入外部的properties文件)
.properties文件同样放在在根目录下。
jdbc.properties配置文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.user=root
jdbc.password=asd
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>
<!--
使用properties标签引入外部的properties文件
目的:也是为了配置文件解耦,专门的信息就放到专门的配置文件中
-->
<properties resource="jdbc.properties"></properties>
<environments default="dev">
<!--开发环境-->
<environment id="dev">
<!--事务管理者,type为JDBC表示使用JDBC的事务管理者(了解)-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource表示数据源,1.POOLED表示使用自带的连接池,2.UNPOOLED表示不使用连接池,3.JNDI表示使用JNDI连接池-->
<dataSource type="POOLED">
<!--连接池的配置信息-->
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
</dataSource>
</environment>
</environments>
……
</configuration>
typeAliases(类型别名)
定义单个别名
• 核心配置文件
<typeAliases>
<typeAlias type="com.gavin.pojo.User" alias="user"></typeAlias>
还可以写很多个。<typeAlias>,一个<typeAlias>代表一个。
</typeAliases>
• 修改UserDao.xml:
<select id="findAll" resultType="user">//直接用自定义的别名
select * from t_user
</select>
批量定义别名
因为有的时候pojo里面的类过多,一个一个写很麻烦。
因为所有要配置别名的类都写在一个包当中,所以我们可以使用包扫描去配置别名,通过package标签扫描整个包,就能给该包中所有类都配置别名,别名就是该类的类名,不区分大小写。
使用package定义的别名:就是pojo的类名,不区分大小写。
<typeAliases>
<package name="com.gavin.pojo"/>//这里没有类名
</typeAliases>
修改UserDao.xml
<select id="findAll" resultType="User">//直接类名就可以
select * from t_user
</select>
Mapper
方式一:引入映射文件路径
<mappers>
<mapper resource="com/gavin/dao/UserDao.xml"></mapper>
</mappers>
方式二:扫描接口
• 配置单个接口
<mappers>
<mapper resource="com.gavin.dao.UserDao "></mapper>
</mappers>
• 批量配置
当配置文件太多了,还有别的很多dao,还挨个配置很麻烦。
<mappers>
<package name="com.gavin.dao"/>
</mappers>
注意!!!!
核心配置文件的顺序不能错