1、Mybatis的优势
轻量级、半自动化、开源
2、最佳实例
- 1、添加Mybatis坐标
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis?坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 2、创建user数据表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- 3、编写User实体类
public class User {
private Integer id;
private String username;
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
- 4、编写映射文件UserMapper.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.hdl.dao.UserDao">
<!--
namespace:命名空间 与id组成sql唯一标志
resultType: 表明返回值类型
-->
<!--抽取sql片段-->
<sql id="selectUser">
select * from user
</sql>
<!--查询所有用户-->
<select id="findAll" resultType="uSeR">
<include refid="selectUser"/>
</select>
</mapper>
- 5、编写核心配置文件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 resource="jdbc.properties"></properties>
<!--给实体的全限定类名给别名-->
<typeAliases>
<!--给单独的实体起别名-->
<!--<typeAlias type="com.hdl.pojo.User" alias="User"/>-->
<!--批量起别名:该包下所有的类的本身的类名,别名不区分大小写-->
<package name="com.hdl.pojo"/>
</typeAliases>
<!--运行环境-->
<environments default="development">
<environment id="development">
<!--当前事务交由jdbc管理-->
<transactionManager type="JDBC"/>
<!--表示使用mybatis连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--mapper映射-->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 6、编写测试类
@Test
public void test1() throws IOException {
//1.Resources工具类,配置文件加载,吧配置文件加载成字节输入流
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//2.解析配置文件,并创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3.生产SqlSession,默认开启一个事务,该事务不会自动提交;在进行增删改时,要手动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("user.findAll");
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
3、Mybatis的CRUD操作
- 注解方式
/**
* 查询所有用户
*/
@Select("select * from user")
List<User> findAll();
/**
* 新增用户
*/
@Insert("insert into user(id, username, password, birthday) values(#{id}, #{username}, #{password}, #{birthday})")
void insertUser(User user);
/**
* 修改用户
*/
@Update("update user set username = #{username} where id = #{id}")
void updateUser(User user);
/**
* 删除用户
*/
@Delete("delete from user where id = #{id}")
void deleteUser(Integer id);
- XML方式
跟注解里面的sql一样,改成UserMapper.xml方式即可
4、一对一查询
- 注解方式
/**
* 查询订单的同时还查询该订单所属用户
*/
@Results({
@Result(property = "id", column = "id"),
@Result(property = "orderTime", column = "orderTime"),
@Result(property = "total", column = "total"),
@Result(property = "user", column = "uid", javaType = User.class,
one = @One(select = "com.hdl.mapper.IUserMapper.findUserById"))
})
@Select("select * from orders")
List<Order> findOrderAndUser();
/**
* 根据id查询用户信息
*/
@Select("select * from user where id = #{id}")
User findUserById(Integer id);
- XML方式
<!--resultMap: 手动配置实体属性与表字段的映射关系-->
<resultMap id="orderMap" type="Order" >
<id property="id" column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="orderTime" column="orderTime" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result property="total" column="total" javaType="java.lang.Double" jdbcType="DOUBLE"/>
<!--关联查询-->
<association property="user" javaType="User">
<id property="id" column="uid" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="username" column="username" javaType="java.lang.String" jdbcType="VARCHAR"/>
</association>
</resultMap>
5、一对多/多对多查询
- 注解方式
/**
* 根据用户查询用户关联的订单(一对多查询)
*/
@Results({
@Result(property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "orders", column = "id",
many = @Many(select = "com.hdl.mapper.IOrderMapper.findOrderByUserId")),
})
@Select("select * from user where id = #{id}")
User findUserAndOrder(Integer id);
/**
* 根据用户查询角色,多对多查询
*/
/**
* 根据用户查询用户关联的订单(一对多查询)
*/
@Results({
@Result(property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "orders", column = "id",
many = @Many(select = "com.hdl.mapper.IOrderMapper.findOrderByUserId")),
@Result(property = "roles", column = "id",
many = @Many(select = "com.hdl.mapper.IRoleMapper.findRoleByUserId")),
})
@Select("select * from user where id = #{id}")
User findUserAndRole(Integer id);
=================================
@Select("select * from sys_role where id in (select roleid from sys_user_role where userid = #{#userId})")
List<Role> findRoleByUserId(Integer userId);
=================================
@Select("select * from orders where uid = #{userId}")
List<Order> findOrderByUserId(Integer userId);
- XML方式
<!--resultMap: 手动配置实体属性与表字段的映射关系-->
<resultMap id="userMap" type="User" >
<id property="id" column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="username" column="username" javaType="java.lang.String" jdbcType="VARCHAR"/>
<!--关联查询-->
<collection property="orders" ofType="com.hdl.pojo.Order">
<id property="id" column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="orderTime" column="orderTime" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result property="total" column="total" javaType="java.lang.Double" jdbcType="DOUBLE"/>
</collection>
</resultMap>
<!--resultMap: 手动配置实体属性与表字段的映射关系-->
<resultMap id="userRoleMap" type="User" >
<id property="id" column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="username" column="username" javaType="java.lang.String" jdbcType="VARCHAR"/>
<!--关联查询-->
<collection property="roles" ofType="com.hdl.pojo.Role">
<id property="id" column="roleid" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result property="rolename" column="rolename" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result property="roleDesc" column="roleDesc" javaType="java.lang.String" jdbcType="VARCHAR"/>
</collection>
</resultMap>
6、Mybatis传统Mapper和代理Mapper
- 传统方式
传统方式SqlSession直接使用statementId和参数查询
- 代理方式
mapper代理使用JDK动态代理生成代理类查询(主流)
7、Mybatis加载外部properties
在sqlMapConfig.xml中,可以配置外部properties加载
<!--加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
8、Mybatis配置别名typeAlias
在sqlMapConfig.xml中,可以配置实体类的别名
单个实体类配置
<!--给实体的全限定类名给别名-->
<typeAliases>
<!--给单独的实体起别名-->
<typeAlias type="com.hdl.pojo.User" alias="User"/>
</typeAliases>
某包下批量取别名
<!--给实体的全限定类名给别名-->
<typeAliases>
<!--批量起别名:该包下所有的类的本身的类名,别名不区分大小写-->
<package name="com.hdl.pojo"/>
</typeAliases>
9、Mybatis的Mapper映射方式
- 1、使用resource指定XML配置文件
- 2、使用class指定某个类
- 3、使用package指定某个包, 配置文件和mapper接口需要同包同名