mybatis动态代理

代码文件结构

文件结构
在这里插入图片描述

使用规则

  • Mybatis动态代理开发,目的是简化开发,只需要写dao层的接口,不需要写实现类
  • 持久层包名dao改为mapper
  • mapper包下定义接口,!不用实现类,Mybatis框架自动生成接口的实现类对象
  • 定义接口UserMapper,查询所有数据的方法(抽象)
  • UserMapper.xml配置文件,配置user表的sql语句
  • 配置文件必须和接口在同一文件夹下
  • 配置文件中的namespace的属性值必须和接口的全类名相同
  • 接口中的方法名必须和配置xml中的SQL语句的标签id相同,参数resultType和方法返回值必须相同

资源类

  • 因为sql语句配置文件和接口代码一起放在了mapper包下,所以mapper的resource属性需要改

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">
<!--约束文件,位置在mybatis的jar包-->
<configuration>
<!--    别名配置-->
    <typeAliases>
<!--        配置别名,数据类型是pojo对象,简化为user-->
<!--        <typeAlias type="com.ahu.pojo.User" alias="user"></typeAlias>-->

<!--        定义别名也可以使用包扫描,在xml文件中直接使用类名小写即可-->
        <package name="com.ahu.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!--
                 transactionManager 事务管理配置
                 type="JDBC"  使用的是最原始的JDBC的事务处理机制
                 type="MANAGERED" 不管理事务
            -->
            <transactionManager type="JDBC" />
            <!--
                dataSource 配置数据源,连接池
                type="POOLED" 使用连接池
                MyBatis自带连接池  (type=""UNPOOLED)
            -->
            <dataSource type="POOLED">
<!--                使用自带的数据库连接池-->
                <!--配置的是,数据库连接四大信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3305/mybatis?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="ahulml005" />
            </dataSource>
        </environment>




    </environments>

    <!--
      配置的是映射关系  ORM Java对象和数据表
    -->
    <mappers>
        <!--
        配置文件不在同一个文件下,填写地址应该注意
        -->
<!--        <mapper resource="com/ahu/mapper/UserMapper.xml" />-->

        <!--
        可以使用自动扫描配置,自动扫描xml文件
        一个数据表对应一个xml

        mapper标签的属性 resource="xml路径"
        package标签的属性 name="包名"

        -->
        <package name="com.ahu.mapper"/>

    </mappers>
</configuration>    

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.ahu.mapper.UserMapper">

    <select id="queryUser" resultType="com.ahu.pojo.User">
        select * from user;
    </select>

<!--    使用别名user-->
    <select id="queryUserById" parameterType="Integer" resultType="user">
        select * from user where id=#{id}
    </select>

    <insert id="saveUser" parameterType="com.ahu.pojo.User">
        insert into user values (null,#{username},#{sex},#{birthday},#{address})
    </insert>

    <delete id="deleteById" parameterType="Integer">
        delete from user where id=#{id}
    </delete>

<!--    注意使用的参数-->
    <select id="queryUserByName" parameterType="com.ahu.pojo.UserVO" resultType="user">
        select * from user where username like #{user.username}
    </select>
</mapper>

User表操作代码

User.java

package com.ahu.pojo;

import java.util.Date;

public class User {

    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

UserMapper.java

package com.ahu.mapper;

import com.ahu.pojo.User;

import java.util.List;

public interface UserMapper {
    /**
     * 查询所有数据
     * @return 返回User的集合
     */
    List<User> queryUser();
}

MybatisProxy.java

  • 参数是被代理接口的class文件,返回值是被代理接口的实现类对象,UserMapper userMapper = sqlSession.getMapper(UserMapper.class)实现代理
package com.ahu.mybatis;

import com.ahu.mapper.OrdersMapper;
import com.ahu.mapper.UserMapper;
import com.ahu.pojo.Orders;
import com.ahu.pojo.User;
import com.ahu.pojo.UserVO;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * Mybatis动态代理开发,目的是简化开发,只需要写dao层的接口,不需要写实现类
 * 持久层包名dao改为mapper
 * mapper包下定义接口,!不用实现类,Mybatis框架自动生成接口的实现类对象
 * 定义接口UserMapper,查询所有数据的方法(抽象)
 * UserMapper.xml配置文件,配置user表的sql语句
 * 配置文件必须和接口在同一文件夹下
 * 配置文件中的namespace的属性值必须和接口的全类名相同
 * 接口中的方法名必须和配置xml中的SQL语句的标签id相同,参数resultType和方法返回值必须相同
 */
public class MybatisProxy {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void before() throws IOException {
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    }

    /**
     * 动态代理方式,代理mapper下的接口
     * 查询所有用户
     */
    @Test
    public void testQueryUser(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        /*
        参数是被代理接口的class文件,返回值是被代理接口的实现类对象
         */

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.queryUser();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }

    /**
     * 根据id查询用户
     */
    @Test
    public void testQueryUserById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserById(9);
        System.out.println(user);
        sqlSession.close();
    }

    /**
     * 新增用户
     */
    @Test
    public void testSaveUser(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("rose");
        user.setSex("F");
        user.setBirthday(new Date());
        user.setAddress("England");
        userMapper.saveUser(user);
        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * 删除指定id的用户
     */
    @Test
    public void testDeleteById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int row = userMapper.deleteById(13);
        System.out.println("total delete:" + row);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testQueryByName(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = new User();
        user.setUsername("%刘%");

        UserVO userVO = new UserVO();
        userVO.setUser(user);

        List<User> users = userMapper.queryUserByName(userVO);
        for (User user1 : users) {
            System.out.println(user1);
        }
    }



xml别名配置

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
mapMap
  • 可以在xml使用前一列的数据类型,自动转为后一列的数据类型
  • 可以自定义添加别名,在SqlMapConfig.xml中的configuration标签内添加

命名别名可以使用包扫描

<typeAliases>
<!--        配置别名,数据类型是pojo对象,简化为user-->
<!--        <typeAlias type="com.ahu.pojo.User" alias="user"></typeAlias>-->

<!--        定义别名也可以使用包扫描-->
        <package name="com.ahu.pojo"/>
    </typeAliases>

pojo包装类对象

  • 一个pojo对象有属性是其他的pojo对象(使用UserVO.java包装User对象)
package com.ahu.pojo;

/**
 * Value Object值对象,存储常用的数据值
 */
public class UserVO {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "UserVO{" +
                "user=" + user +
                '}';
    }
}

数据库操作需要注意参数

<!--    注意使用的参数-->
    <select id="queryUserByName" parameterType="com.ahu.pojo.UserVO" resultType="user">
        select * from user where username like #{user.username}
    </select>

查询结果集手动映射

  • 设置数据库表列名和pojo属性不对应(查询的结果除了不对应的属性无法查出来其他都正常),需要手动映射,列名为user_id,pojo属性为userId

sql

-- ----------------------------
-- Table structure for `orders`
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
);

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('3', '3', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '3', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '4', '1000012', '2015-02-12 16:13:23', null);

pojo

package com.ahu.pojo;

import java.util.Date;

public class Orders{
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

	public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note == null ? null : note.trim();
    }
    
    @Override
   	public String toString() {
   		return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
   				+ ", note=" + note + "]";
   	}
    
}

OrdersMapper.java

package com.ahu.mapper;

import com.ahu.pojo.Orders;

import java.util.List;

public interface OrdersMapper {
    /**
     * 查询所有订单
     * @return
     */
    List<Orders> queryOrders();
}

MybatisProxy.java添加查询代码

    /**
     * 测试查询所有订单
     * pojo类的属性userId和列名user_id不对应,需要手动映射
     */
    @Test
    public void testQueryOrder(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        List<Orders> orders = ordersMapper.queryOrders();
        for (Orders order : orders) {
            System.out.println(order);
        }
        sqlSession.close();
    }

OrdersMapper.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.ahu.mapper.OrdersMapper">
        <select id="queryOrders" resultType="orders">
                select * from orders
        </select>
</mapper>

testQueryOrder执行结果
在这里插入图片描述

修改后的OrdersMapper.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.ahu.mapper.OrdersMapper">
        <!--
                配置使用自己的映射
                select的属性resultMap
        -->
        <select id="queryOrders" resultType="orders" resultMap="ordersResultMap">
                select * from orders
        </select>

<!--        查询的结果还是orders-->
        <resultMap id="ordersResultMap" type="orders">
        <!--
        配置数据表的列和pojo成 员变量的映射关系
        id配置的是主键
        columns列名
        property pojo属性名
        -->
                <!--                配置主键-->
                <id column="id" property="id"></id>

<!--                配置其他列映射关系-->
                <result column="user_id" property="userId"></result>
                <result column="number" property="number"></result>
                <result column="createtime" property="createtime"></result>
                <result column="note" property="note"></result>
        </resultMap>

</mapper>

手动映射后可以正确查询

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值