本帖最后由 职业规划-王雪老师 于 2018-4-4 15:38 编辑
MyBatis作为一个轻量级的半ORM框架,由于其上手快、开发快捷,在企业中的中小型项目应用较广泛,下面我们来演示一下如何使用mybatis的注解开发方式来进行代码编写。
【开发环境介绍】:
数据库使用MYSQL,mybatis使用3.4.1(没有使用spring整合),mysql驱动5.1.36。
【POJO+表】
提供两个POJO类:User(用户)和Orders(订单),分别对应的数据库表下图:
User类:
[Java] 纯文本查看 复制代码 /**
* 用户表(id,name,birthday)对应POJO
*/
public class User {
private int id;
private String name;
private Date birthday;
//一个用户下多个订单 一对多
private Set<Orders> orderSet;
//...省略get set方法
}
用户数据库表
Orders类
[Java] 纯文本查看 复制代码 /**
* 订单表(id,user_id,number,createtime,price)对应POJO
*
*/
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private BigDecimal price;
//一个order输入一个用户(一对一)
private User user;
//...省略getter setter方法
}
Orders表
数据以及对应关系如下:
【功能点】
1)根据用户ID查询用户
2)新增用户,并获得用户的ID
3)查询所有订单信息,并能够查询该订单属于哪个用户
4)查询所有用户信息,如果用户有订单,则将用户的订单信息一并查出
【实现代码】
【步骤一】准备mybatis主配置文件
[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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/crms"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 在配置文件中 关联包下的 接口类-->
<mappers>
<mapper class="com.itheima.ssm.mapper.UserMapper"/>
<mapper class="com.itheima.ssm.mapper.OrdersMapper"/>
</mappers>
</configuration>
【步骤二】实现具体功能(在代码调用时,省略SqlSessionFactory的提供代码)
1)根据用户ID查询用户
接口:
[Java] 纯文本查看 复制代码 @Select(value="select id,name,birthday from user where id = #{id}")
public User getUserAccordSQL(Integer userId);
调用测试:
[Java] 纯文本查看 复制代码 //1。根据用户ID查询用户(sql语句返回的字段和User类的属性相对应)
@Test
public void selectUserAccordSQL() {
try {
SqlSession openSession = sqlSessionFactory.openSession();
User user = openSession.selectOne("getUserAccordSQL", 1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
}
打印结果:
[Java] 纯文本查看 复制代码 DEBUG [main] - ==> Preparing: select id,name,birthday from user where id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, name=张三, birthday=Sun Jun 18 14:14:51 CST 2017, orderSet=null]
2)新增用户,并获得用户的ID(id为自增字段)
接口:
[Java] 纯文本查看 复制代码 @Insert("insert into user(name,birthday) values(#{name},#{birthday})")
//表中id字段为自增字段。在插入之后执行MYSQL的select last_insert_id()函数查询本次事务中插入的该条记录id,并将值赋予到传入的user对象中
@SelectKey(before=false,keyProperty="id",statement="select last_insert_id()",
resultType = Integer.class)
public void insertUser(User user);
调用测试:
[Java] 纯文本查看 复制代码 //2.保存用户并且将用户的ID赋值
@Test
public void insertUser() {
SqlSession openSession = sqlSessionFactory.openSession();
User user = new User();
user.setName("黑马");
user.setBirthday(new Date());
openSession.insert("insertUser", user);
System.out.println(user.getId());
openSession.commit();
openSession.close();
}
打印结果(id为26,新增到了数据库表中):
[Java] 纯文本查看 复制代码 DEBUG [main] - ==> Preparing: insert into user(name,birthday) values(?,?)
DEBUG [main] - ==> Parameters: 黑马(String), 2018-03-27 18:42:23.601(Timestamp)
DEBUG [main] - <== Updates: 1
DEBUG [main] - ==> Preparing: select last_insert_id()
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 1
26
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@68a70c74]
3)查询所有订单信息,并能够查询该订单属于哪个用户
接口:
[Java] 纯文本查看 复制代码 @Select("select o.*,u.id as userid,u.name,u.birthday from orders o inner join user u on o.user_id = u.id")
@Results(value= {
@Result(id=true,column="id",property="id"),
@Result(column="user_id",property="userId"),
@Result(column="number",property="number"),
@Result(column="birthday",property="user.birthday"),//注意,此处使用的是user.xxx(xxx为user对象的属性)
@Result(column="name",property="user.name"),
@Result(column="userid",property="user.id"),
})
public List<Orders> getOrdersUserMy();
调用测试:
[Java] 纯文本查看 复制代码 @Test
public void selectOrdersUserMy() {
SqlSession openSession = sqlSessionFactory.openSession();
List<Orders> orders = openSession.selectList("getOrdersUserMy");
System.out.println(orders);
}
打印结果(可以看到有三个订单,1和2订单属于用户张三,3订单属于李四):
[Java] 纯文本查看 复制代码 DEBUG [main] - ==> Preparing: select o.*,u.id as userid,u.name,u.birthday from orders o inner join user u on o.user_id = u.id
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
[Orders [id=1, userId=1, number=10086, createtime=Tue Mar 06 14:51:36 CST 2018, price=100.50, user=User [id=1, name=张三, birthday=Sun Jun 18 14:14:51 CST 2017, orderSet=null]],
Orders [id=2, userId=1, number=10087, createtime=Tue Mar 06 14:51:55 CST 2018, price=365.00, user=User [id=1, name=张三, birthday=Sun Jun 18 14:14:51 CST 2017, orderSet=null]],
Orders [id=3, userId=2, number=10088, createtime=Sun Mar 04 14:51:55 CST 2018, price=1004.00, user=User [id=2, name=李四, birthday=Mon Jun 05 14:41:56 CST 2017, orderSet=null]]]
4)查询所有用户信息,如果用户有订单,则将用户的订单信息一并查出(如果只能使用注解,那么需要编写两个查询注解)
接口:
[Java] 纯文本查看 复制代码 @Select(value="select * from user")
@Results({@Result(column="id",property="orderSet",
many=@Many(fetchType=FetchType.EAGER,select="com.itheima.ssm.mapper.OrdersMapper.getOrderByUserId"))})
public List<User> getUsersOrders();
[Java] 纯文本查看 复制代码 @Select("select o.* from orders o where o.user_id = #{id}")
public List<Orders> getOrderByUserId(Integer id);
调用测试:
[Java] 纯文本查看 复制代码 @Test
public void selectUsersOrders() {
SqlSession openSession = sqlSessionFactory.openSession();
List<User> users = openSession.selectList("getUsersOrders");
System.out.println(users);
}
打印结果(从结果来看,打印了7条SQL语句,效率肯定受影响,在附件中,我提供了另外的查询方式,不过,需要使用mybatis的映射文件节点<resultMap>来配置一对多):
[Java] 纯文本查看 复制代码 DEBUG [main] - ==> Preparing: select * from user
DEBUG [main] - ==> Parameters:
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 2
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 2(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 3(Integer)
DEBUG [main] - <==== Total: 0
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 4(Integer)
DEBUG [main] - <==== Total: 0
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 25(Integer)
DEBUG [main] - <==== Total: 0
DEBUG [main] - ====> Preparing: select o.* from orders o where o.user_id = ?
DEBUG [main] - ====> Parameters: 26(Integer)
DEBUG [main] - <==== Total: 0
DEBUG [main] - <== Total: 6
[User [id=0, name=张三, birthday=Sun Jun 18 14:14:51 CST 2017, orderSet=[Orders [id=2, userId=null, number=10087, createtime=Tue Mar 06 14:51:55 CST 2018, price=365.00, user=null], Orders [id=1, userId=null, number=10086, createtime=Tue Mar 06 14:51:36 CST 2018, price=100.50, user=null]]],
User [id=0, name=李四, birthday=Mon Jun 05 14:41:56 CST 2017, orderSet=[Orders [id=3, userId=null, number=10088, createtime=Sun Mar 04 14:51:55 CST 2018, price=1004.00, user=null]]],
User [id=0, name=王五, birthday=Thu Jun 01 14:42:14 CST 2017, orderSet=[]],
User [id=0, name=赵六, birthday=Sat Jun 03 14:42:28 CST 2017, orderSet=[]],
User [id=0, name=黑马, birthday=Tue Mar 06 14:57:54 CST 2018, orderSet=[]],
User [id=0, name=黑马, birthday=Tue Mar 27 18:42:24 CST 2018, orderSet=[]]]
具体代码参见附件。里面提供了除本文说的功能之外的其他方法,尤其是对于一对一一对多的使用。
mybatis-anno.zip
(25 KB, 下载次数: 96)
|