Mybatis注解开发
目录
一、创建数据库
- 连接数据库:在命令窗口输入mysql -u root -p回车然后输入密码回车
- 创建数据库:create database mybatis;
- 创建表和插入数据
use mybatis; create table tb_user( id int(10) primary key auto_increment, username varchar(32) not null, address varchar(32) not null); insert into tb_user values(1,'张三','广州'),(2,'王五','东莞'),(3,'李四','上海'); create table tb_orders( id int(10) primary key auto_increment, number varchar(32) not null, user_id int(10) not null, foreign key(user_id) references tb_user(id)); insert into tb_orders values(1,'1000001',1),(2,'1000002',1),(3,'1000003',2);
二、导入相关依
pom.xml代码如下:
<?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>org.example</groupId> <artifactId>Mybatis的关系映射</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
三、创建POJO实体
在src/main/java目录下创建一个com.itheima.pojo包,在包下分别创建Users.java、Orders.java实体类,代码如下:
Users.java
package com.itheima.pojo; import java.util.List; public class Users { private Integer id; // 用户编号 private String username; // 用户姓名 private String address; // 用户地址 private List<Orders> ordersList; //用户关联的订单 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 String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List<Orders> getOrdersList() { return ordersList; } public void setOrdersList(List<Orders> ordersList) { this.ordersList = ordersList; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", address=" + address + ", ordersList=" + ordersList + "]"; } }
Orders.java
package com.itheima.pojo; import java.io.Serializable; public class Orders implements Serializable { private Integer id;//订单id private String number;//订单编号 private Users users; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Users getUsers() { return users; } public void setUsers(Users users) { this.users = users; } @Override public String toString() { return "Orders{" + "id=" + id + ", number='" + number + '\'' + ", users=" + users + '}'; } }
四、创建数据库连接信息配置文件
在项目的src/main/resources目录下创建数据库连接信息配置文件,其命名为:db.properties代码如下:
mysql.driver=com.mysql.cj.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&\ characterEncoding=utf-8&useUnicode=true&useSSL=false mysql.username=root mysql.password=123456
五、创建映射文件
在项目的src/main/com/itheima目录下创建一个dao包,在该文件夹下创建UserMapper.java、OrdersMapper.java接口类,该文件主要用于配置注解SQL语句和Java对象之间的映射。其中property属性用于指定关联的实体类属性,column属性用于指定关联的数据库表中的字段,one属性用于指定数据表之间属于那种关联关系,@One注解表明数据表之间是一对一的关联关系;many属性和@Many表示一对多的关联关系。
UserMapper.java:
package com.itheima.dao;
import com.itheima.pojo.Users;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
//一对一
@Select("select * from tb_user where id=#{id}")
Users UserMapper(int id);//Users是返回信息的类型,UserMapper是调用的方法,int id是传入的参数值
//一对多
@Select("select * from tb_user where id=#{id}")
@Results({@Result(id=true,column = "id",property = "id")
,@Result(column = "username",property = "username")
,@Result(column = "address",property = "address")
,@Result(column = "id",property = "ordersList",many=@Many(select ="com.itheima.dao.OrdersMapper.OrdersMappers")
)})
Users UserMappers(int id);
}
OrdersMapper.java:
package com.itheima.dao;
import com.itheima.pojo.Orders;
import com.itheima.pojo.Users;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface OrdersMapper {
//一对一
@Select("select * from tb_orders where id=#{id}")
@Results({@Result(column="user_id",property = "users",one = @One(select = "com.itheima.dao.UserMapper.UserMapper"))})
//这里是将查询到的column的user_id值传给select = "com.itheima.dao.UserMapper.UserMapper"的查询语句中,然后将结果的返回值类型
//值以property = "users"的形式打印出,其中users是Users实体类中设置的类型。
Orders OrdersMapper(int id);
//一对多
@Select("select id,number from tb_orders where user_id=#{id}")
@Results({@Result(id=true,column = "id",property = "id"),
@Result(column = "number",property = "number")})
List<Orders> OrdersMappers(int user_id);
}
六、创建MyBatis的核心配置文件
在项目的src/main/resources目录下创建Mybatis的核心配置文件,其命名为:mybatis-config.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 resource="db.properties" />
<settings>
<!--设置打印信息 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--开启二级缓存的全局配置-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--使用扫描包的形式定义别名 -->
<typeAliases>
<package name="com.itheima.pojo"/>
</typeAliases>
<!--配置运行环境,可以选择事务管理器和数据源,environments有两个子元素:分别为事务管理transactionManager元素和数据源dataSource元素-->
<!--事务管理transactionManager元素有两种类型,分别为JDBC和MANAGED,JDBC配置直接提交和回滚设置-->
<!--数据源dataSource元素配置不提交或回滚一个连接,而是让容器管理事务的整个生命周期,有无连接池UNPOOLED、连接池POOLED和JNDI-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库驱动-->
<property name="driver" value="${mysql.driver}"/>
<!--连接数据库的url-->
<property name="url" value="${mysql.url}"/>
<!-- 连接数据库的用户名-->
<property name="username" value="${mysql.username}"/>
<!-- 连接数据库的密码-->
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!--mapper的映射文件有4种,分别为类路径引入、本地路径引入、接口类引入、包名引入-->
<mappers>
<mapper class="com.itheima.dao.UserMapper"/>
<mapper class="com.itheima.dao.OrdersMapper"/>
</mappers>
</configuration>
七、创建MyBatis的工具类
在src/main/java目录下创建一个com.itheima.utils包,在包下创建一个MyBatisUtils.java工具类,代码如下:
package com.itheima.utils;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 工具类
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化SqlSessionFactory对象
static {
try {
// 使用MyBatis提供的Resources类加载MyBatis的配置文件
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
// 构建SqlSessionFactory工厂
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
八、创建测试类
在src/main/java目录下创建一个com.itheima.test包,在包下创建一个MybatisTest.java测试类,代码如下:
package com.itheima.test;
import com.itheima.dao.OrdersMapper;
import com.itheima.dao.UserMapper;
import com.itheima.pojo.Orders;
import com.itheima.pojo.Users;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class mybatisTest {
@Test
public void findByIdTest1() {
// 通过工具类生成SqlSession对象
SqlSession session = MyBatisUtils.getSession();
//getMapper()用于获取接口类对象,并通过调用接口类对象调用相应的方法查询相应的信息
//一对一
OrdersMapper ordersMapper =
session.getMapper(OrdersMapper.class);
Orders orders =ordersMapper.OrdersMapper(3);
System.out.println("一对一");
System.out.println(orders.toString());
//一对多
UserMapper userMapper =
session.getMapper(UserMapper.class);
Users users =userMapper.UserMappers(1);
System.out.println("一对多");
System.out.println(users.toString());
session.commit();
// 关闭SqlSession
session.close();
}
}
九、运行结果
总结
多练多看代码