A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 职业规划-王雪老师 于 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)

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马