【JavaWeb_Part05】JDBC?弱爆了,看看轻量级的 Mybatis FreeStyle

开篇

上篇文章我们已经讲了 Mybatis 的入门以及简单的对单表进行增删改查,那么今天我们就来讲一下使用 mybatis 开发dao的两种方式以及 mysql 比较厉害的动态 sql。

利用 mybatis 开发 DAO

1. 原始的方式开发DAO

主要完成功能

  1. 根据用户 id 查询用户信息

  2. 根据用户姓名查询用户列表

  3. 插入用户

  4. 新建一个接口 User1Dao.java 和一个实现类 User1DaoImpl.java,并在 User1Dao 中添加如下方法

User1Dao.java

public interface UserDao {

    //根据用户id 查询用户
    User findUserById(Integer id);
    //根据用户名称查询用户列表
    List<User> findUserByName(String name);
    //插入用户
    void insertUser(User user);
}

  1. 在实现类中实现如下方法
    User1DaoImpl.java
public class User1DaoImpl implements UserDao{
    private static SqlSessionFactory factory;

    static {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public User findUserById(Integer id) {
        SqlSession session = factory.openSession();
        User user= session.selectOne("test.findUserById", id);

        return user;
    }

    @Override
    public List<User> findUserByName(String name) {
        SqlSession session = factory.openSession();
        List<User> userList = session.selectList("test.findUserByName", name);
        return userList;
    }

    @Override
    public void insertUser(User user) {
        SqlSession session = factory.openSession();
        session.insert("test.insertUser", user);
        session.commit();
    }
}

注意

只有查询方法不用提交事务,其他的,比如增加,删除,更新等操作都要执行 session.close() 方法。

  1. 新建测试类 TestDao1.java
public class TestDao1 {

    @Test
    public void testFindUserById(){
        System.out.println(new User1DaoImpl().findUserById(6));
    }

    @Test
    public void testFindUserByName(){
        List<User> userList = new User1DaoImpl().findUserByName("二");
        for (User user :
                userList) {
            System.out.println(user);
        }
    }

    @Test
    public void testInsertUser(){
        User user = new User();
        user.setName("李二牛");
        user.setAddress("湖北武汉");
        user.setSex("1");
        new User1DaoImpl().insertUser(user);
    }
}

以上的结果就非常简单了,在这里我就不贴图了,相信小伙伴们都可以看得明白。这就是原生的 Dao 的开发方式,实际上还是有点麻烦的。这里省略了 service 层,这种原生的开发方式我们只要知道怎么写就可以了,在实际工作中我们并不会使用这种方式来开发。

2.使用 Mapper 的动态代理的方式开发 DAO

Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),由 mybatis 框架家根据接口定义创建接口的动态代理对象, 代理对象的方式同上边 Dao 接口实现类方法。这种方式简单的多,但是有一定的规则。具体规则如下:

Mapper.xml 文件中的 namespace 于 mapper 接口的类路径相同。
Mapper 接口方法名和 Mapper.xml 中定义的每个 Statement 的 id 相同。
Mapper 接口方法点的输入参数类型和 Mapper.xml 中定义的每个 sql 的 parameterType 的类型相同。
Mapper 接口方法的输出参数类型和 Mapper.xml 中定义的每个 sql 的 resultType 的类型相同。

有了上面的规则,我们就开始编写 Mapper.xml 映射文件

Mapper.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.student.mybatis.mapper.UserMapper">
    <select id="findUserById" parameterType="int" resultType="user">
        select * from user where uid = #{uid}
    </select>

    <select id="findUserByName" parameterType="string" resultType="user">
        select * from user where name LIKE '%${value}%'
    </select>

    <delete id="deleteUserById" parameterType="int">
        delete from user where uid = #{uid}
    </delete>

    <insert id="insertUser" parameterType="user">
        <selectKey keyProperty="uid" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user(name, sex, address) values (#{name}, #{sex}, #{address});
    </insert>

    <update id="updateUserById" parameterType="user">
        update user set name = #{name} where uid = #{id};
    </update>
</mapper>

注意:namespace 要改成 UserMapper 这个接口的全路径。

UserMapper.java

public interface UserMapper {

    User findUserById(Integer id);

    List<User> findUserByName(String name);

    void insertUser(User user);
}

切记:需要在 SqlMapConfig.xml 中引入 UserMapper.xml 文件,否则会报错。

<!--批量引入mapper文件 -->
<package name="com.student.mybatis.mapper"/>

测试类 TestMapper.java

public class TestMapper {
    private SqlSessionFactory factory;

    @Before
    public void setUP
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值