MyBatis--04CRUD操作

以下操作在MyBatis–01入门案例的基础上修改。

在MyBatisTest中删除public static void main()方法。

PS:添加,更新和删除数据库中的数据需要手动调用commit()。

保存用户

在持久层接口中添加方法

/**
 * 保存用户
 * @param user
 */
void saveUser(User user);

在映射配置文件中添加配置

<!--保存用户-->
<insert id="saveUser" parameterType="com.cncs.domain.User">
    insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address});
</insert>

在测试类中添加测试方法执行前的前置方法和后置方法。

public class MyBatisTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before //在测试方法之前执行
    public void init() throws IOException {
        //1.读取mybatis核心配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建工厂对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = builder.build(in);
        //3.通过工厂对象构建SqlSession对象
        sqlSession = sessionFactory.openSession();
        //4.通过SqlSession对象创建代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }
        
    @After //在测试方法之后执行
    public void destory() throws IOException {
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }
}

在测试类中添加测试方法

    @Test
    public void saveUser() {
        User user = new User();
        user.setUsername("枯木逢春");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("海西省三亚市");
        System.out.println("保存之前"+user);
        userDao.saveUser(user);
        System.out.println("保存之后"+user);
        //需要手动提交
    }

查询新增用户的id

在映射配置文件中保存用户的操作中添加标签selectKey

<!-- 在保存用户后查询id -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
    select last_insert_id();
</selectKey>

通过在测试方法中调用saveUser(user),然后分别打印调用方法之前和之后的user对象,发现保存之后user对象的id有了值。

更新用户

在持久层接口中添加方法

/**
 * 更新用户
 * @param user
 */
void updateUser(User user);

在映射配置文件中添加配置

<!--    更新用户-->
<update id="updateUser" parameterType="com.cncs.domain.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
</update>

在测试类中添加测试方法

@Test
public void updateUser() {
    User user = new User();
    user.setUsername("aaa");
    user.setBirthday(new Date());
    user.setSex("女");
    user.setAddress("海西省三亚市");
    user.setId(58);
    userDao.updateUser(user);
    //需要手动提交
}

删除用户

在持久层接口中添加方法

/**
 * 删除用户
 * @param userId
 */
void deleteUser(int userId);

在映射配置文件中添加配置

<!--    删除用户-->
<delete id="deleteUser" parameterType="int">
    delete from user where id=#{userId};
</delete>

在测试类中添加测试方法

@Test
public void deleteUser() {
    userDao.deleteUser(58);
    //需要手动提交
}

查询一个

在持久层接口中添加方法

/**
 * 查询一个
 * @param userId
 * @return
 */
User findOne(int userId);

在映射配置文件中添加配置

<!--    查询一个-->
<select id="findOne" parameterType="int" resultType="com.cncs.domain.User">
    select * from user where id=#{userId};
</select>

在测试类中添加测试方法

@Test
public void findOne() {
    User one = userDao.findOne(57);
    System.out.println(one);
}

根据名称模糊查询

在持久层接口中添加方法

/**
 * 根据名字模糊查询
 * @param username
 * @return
 */
List<User> findByUsername(String username);

在映射配置文件中添加配置

<!--    根据名字模糊查询-->
<select id="findByUsername" parameterType="string" resultType="com.cncs.domain.User">
    select * from user where username like #{name}
</select>

在测试类中添加测试方法

    @Test
    public void findByUsername() {
        List<User> list = userDao.findByUsername("%王%");
        for (User user : list) {
            System.out.println(user);
        }
    }

#{}与${}的区别

#{}表示一个占位符号

通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

${}表示拼接 sql 串

通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, pojoparameterType{}括号中只能是 value。

模糊查询的另一种写法

在映射配置文件中修改配置

<!--    根据名字模糊查询-->
<select id="findByUsername" parameterType="string" resultType="com.cncs.domain.User">
    select * from user where username like '%${value}%'
</select>

在测试类中添加测试方法

    @Test
    public void findByUsername() {
        List<User> list = userDao.findByUsername("王");
        for (User user : list) {
            System.out.println(user);
        }
    }

使用聚合函数

在持久层接口中添加方法

/**
 * 查询总记录条数
 * @return
 */
int findCountUser();

在映射配置文件中添加配置

<!--    查询总记录条数-->
<select id="findCountUser" resultType="int">
    select count(*) from user;
</select>

在测试类中添加测试方法

@Test
public void findCountUser() {
    int countUser = userDao.findCountUser();
    System.out.println(countUser);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值