Mybatis 2 工具类的编写,常见的增删改查

节数

知识点

要求

第一节(封装MyBatis工具类)

工厂对象只需要一个, 借助静态代码块

了解

第二节(MyBatis中带条件的查询)

#{}占位符

掌握

#{}支持三种方式参数的传递

掌握

${}拼接符

掌握

${}尽量使用两种方式传参:map,对象

掌握

第三节(MyBatis中的CUD操作)

事务管理

掌握

cud操作的实现

掌握

分析源码, update

掌握

第四节(类型别名配置)

内建别名

掌握

自己配置类型别名<typeAliases>

掌握

<typeALias>, <package>

了解

  1. MyBatis简单工具类的封装   

         

package com.bjsxt.util;

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 java.io.InputStream;

public class MyBatisUtil {
    // 声明工厂对象
    private static SqlSessionFactory factory;

    // 通过静态代码块对工厂进行初始化, 只初始化一次
    static {
        try {
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("工厂无法初始化...");
        }
    }

    /**
     * 获取SqlSession对象
     *
     * @return
     */
    public static SqlSession getSession() {
        return factory.openSession();
    }
}

2. MyBatis中带条件的查询

   在MyBatis中, 提供了一些方法可以接收执行SQL语句时的参数. 但是, 不同形式的传参获取方式不同. 获取方式有两种:

  1. #{}占位符    (推荐)

              类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位, 后续由传进来的参数进行参         数的绑定. 当使用#{}接收参数时, 参数传递的方式有三种:

       

  • a简单类型参数的传递

简单类型指的是: 基本数据类型, 包装类型, String, java.sql.*

当参数是简单类型时, MyBatis会忽略SQL语句中参数的个数和占位符的名称, 然后将参数进行自动绑定. parameterType属性可以定义参数的类型, 如果定义, 传参时要求参数类型必须和指定的类型一致, 否则抛出ClassCastException.

<mapper namespace="com.bjsxt.mapper">
    <select id="selById" resultType="com.bjsxt.pojo.User">
        select * from tb_user where id=#{id}
    </select>
</mapper>
@Test
public void test1() {
    SqlSession session = MyBatisUtil.getSession();

    User user = session.selectOne("selById", "2");
    System.out.println(user);

    session.close();
}
  • bMap类型参数的传递   

Map是KV结构, 可以通过key定位value.

当参数是Map集合时, SQL语句中的#{}里应该写Map集合的key值, MyBatis会通过key只找到value然后进行参数绑定. 如果key不存在, 不会报错, 会使用null进行参数绑定.

<mapper namespace="com.bjsxt.mapper">
    <select id="sel4Login" resultType="com.bjsxt.pojo.User">
        select * from tb_user where username=#{username} and password=#{password}
    </select>
</mapper>
@Test
public void testLogin() {
    SqlSession session = MyBatisUtil.getSession();

    Map<String, String> params = new HashMap<>();
    params.put("username", "zhangsan");
    params.put("password", "123");

    User user = session.selectOne("sel4Login", params);
    System.out.println(user);

    session.close();
}
  • c对象类型参数的传递    

除了简单类型和Map类型以外的其他类型.

当参数是对象类型时, SQL语句中的#{}里应该写对象的getter方法对应的属性名. 当getter不存在时, 抛出异常:

<mapper namespace="com.bjsxt.mapper">
    <select id="sel4Login" resultType="com.bjsxt.pojo.User">
        select * from tb_user where username=#{username1} and password=#{password}
    </select>
</mapper>
@Test
public void testLogin2() {
    SqlSession session = MyBatisUtil.getSession();

    User params = new User();
    params.setUsername("lisi");
    params.setPassword("123");

    User user = session.selectOne("sel4Login", params);
    System.out.println(user);

    session.close();
}
  1. ${}占位符    (不推荐)

​​​​​​​       类似于jdbc中通过Statement进行操作的方式, 会直接将传递的参数和SQL语句进行字符串的拼接. 一般当SQL语句结构不确定时使用.

<select id="sel2" resultType="com.bjsxt.pojo.User">
    select * from ${tableName} where ${columnName}=${columnValue} order by ${order}
</select>
@Test
public void testSel2() {
    SqlSession session = MyBatisUtil.getSession();

    Map<String, Object> params = new HashMap<>();
    params.put("tableName", "tb_user");
    params.put("columnName", "age");
    params.put("columnValue", 18);
    params.put("order", "birthday desc");

    List<User> list = session.selectList("sel2", params);
    System.out.println(list);

    session.close();
}

3.MyBatis实现增删改(CUD)操作

CUD操作会破坏数据库中原有的数据, 所以必须进行事务管理. 事务的四大特性: ACID(原子性, 一致性, 隔离性, 持久性). 

JDBC中, 通过Connection对象对事务进行管理:

  1. 开启手动事务管理: Connection.setAutoCommit(false);
  2. 事务提交: Connection.commit();
  3. 事务回滚: Connection.rollback();

MyBatis中, 事务管理通过SqlSession对象进行.

  1. 新增  
<insert id="insUser">
    insert into tb_user values (default, #{username}, #{password}, #{realname}, #{age}, #{birthday}, #{regTime})
</insert>
@Test
public void testAdd() {
    SqlSession session = MyBatisUtil.getSession();

    User user = new User();
    user.setUsername("zhaomin");
    user.setPassword("123");
    user.setRealname("赵敏");
    user.setAge(20);
    user.setRegTime(new Date());

    try {
        session.insert("insUser", user);
        session.commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.rollback();
    }

    session.close();
}

 2.修改

<update id="updUser">
    update tb_user set age=#{age} where id=#{id}
</update>
@Test
public void testUpd() {
    SqlSession session = MyBatisUtil.getSession();

    Map<String, Object> map = new HashMap<>();
    map.put("age", 25);
    map.put("id", 6);

    try {
        session.update("updUser", map);
        session.commit();
    } catch (Exception e) {
        session.rollback();
        e.printStackTrace();
    }

    session.close();
}

 3.删除

<delete id="delUser">
    delete from tb_user where id=#{id}
</delete>
@Test
public void testDel() {
    SqlSession session = MyBatisUtil.getSession();

    try {
        session.delete("delUser", 5);
        session.commit();
    } catch (Exception e) {
        session.rollback();
        e.printStackTrace();
    }

    session.close();
}

4.别名设置

<typeAliases>
    <!--<typeAlias type="com.bjsxt.pojo.User" alias="u" />-->
    <package name="com.bjsxt.pojo" />
</typeAliases>

5.密码加密 

package com.bjsxt.util;

import java.security.MessageDigest;

public class Md5Util {
    /**
     * 接收一个明文密码, 返回加密以后的密文
     *
     * @param pwd
     * @return
     */
    public static String md5(String pwd) throws Exception {
        // 创建MessageDigest对象
        MessageDigest digest = MessageDigest.getInstance("MD5");
        // 对明文进行加密
        byte[] temp = digest.digest(pwd.getBytes());
        // 准备StringBuilder用于保存结果
        StringBuilder builder = new StringBuilder();
        // 遍历字节数组, 一个字节转换为长度为2的字符串
        for (byte b : temp) {
            // 去除负数
            String s = Integer.toHexString(b & 0xff);
            // 补零
            if(s.length() == 1) {
                builder.append(0);
            }
            builder.append(s);
        }
        return builder.toString();
    }

}

需要解决问题和获取学习资料可以加群 272112643 :我经常在群里面解决问题 分享学习视频和资料 共同成长!!。 


 

发布了320 篇原创文章 · 获赞 152 · 访问量 64万+

猜你喜欢

转载自blog.csdn.net/hello_word2/article/details/104766494