143_Java_SpringMybatis_Mybatis参数处理 & CRUD

举报
alexsully 发表于 2021/08/22 18:20:14 2021/08/22
【摘要】 CRUD

Mybatis使用insert|update|delete|select完成CRUD

public class MybatisUtils {

    private  static SqlSessionFactory sqlSessionFactory ;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream is  = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//       * sqlSessionFactory.openSession();===》手动提交
//     * sqlSessionFactory.openSession(true);===》自动提交

    public static SqlSession getSqlSession (){
        return  sqlSessionFactory.openSession();
    }
}

1 普通CRUD

EmployeeMapper

public interface EmployeeMapper {   
 // 1 增
    public Long addEmp(Employee employee);
    // 2 删除
    public void deleteEmpById(Integer id);
    // 3 改
    public boolean updateEmp(Employee employee);
    // 4 查
    public Employee getEmpById(Integer id);

    // 5 多个参数的查询   @Param("属性名") 明确指定, 方便多个参数法封装成一个map
    public Employee getEmpByIdAndLastName(@Param("id")Integer id, @Param("lastName")String lastName);

}

EmployeeMapper.xml

   <mapper namespace="com.alex.dao.EmployeeMapper">
 

<!--    // 增 public Long addEmp(Employee employee);-->
<!--    // 删除 public void deleteEmpById(Integer id);-->
<!--    // 改 public boolean updateEmp(Employee employee);-->

    <!-- public void addEmp(Employee employee); -->
    <!-- parameterType:参数类型,可以省略,
    获取自增主键的值:
        mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys();
        useGeneratedKeys="true";使用自增主键获取主键值策略
        keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
    -->
    <insert id="addEmp"  parameterType="com.alex.bean.Employee" databaseId="mysql" useGeneratedKeys="true" keyProperty="id">
        insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
    </insert>

    <update id="updateEmp">
		update tbl_employee  set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}
	</update>

    <delete id="deleteEmpById" >
        delete from tbl_employee where id = #{id}
    </delete>
    
    
<!--  4    单个参数的查询-->

    <select id="getEmpById" resultType="com.alex.bean.Employee" databaseId="mysql">
		select *  from tbl_employee where id = #{idddddd}
	</select>
    
<!--   5  多个参数的查询 @Param-->
<!--    public Employee getEmpByIdAndLastName(@Param("id")Integer id, @Param("lastName")String lastName);-->
    <select id="getEmpByIdAndLastName" resultType="com.alex.bean.Employee" databaseId="mysql" >
        select  * from   tbl_employee where  id=#{id} and last_name =#{lastName}
    </select>
</mapper>

Test

@Test
    public void test_add(){
        //1、获取到的SqlSession不会自动提交数据
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        Employee alex = new Employee("alex", "alex@163.com", "1");
        Long resout = mapper.addEmp(alex);
        System.out.println(alex.getId()); //有返回值 4
        session.commit();
        session.close();
    }

    @Test
    public void test_update(){
        //1、获取到的SqlSession不会自动提交数据
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        Employee tom = new Employee(1,"tom", "tom@163.com", "1");
        mapper.updateEmp(tom);
        session.commit();
        session.close();
    }

    @Test
    public void test_delete(){
        //1、获取到的SqlSession不会自动提交数据
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
       mapper.deleteEmpById(1);
        session.commit();
        session.close();
    }

    // 单个参数查询
    @Test
    public void getEmpById() {
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        Employee employee = mapper.getEmpById(4);
        System.out.println(employee);
        session.close();
    }
    // 多个参数查询 @param
    @Test
    public void getEmpByIdAndLastName() {
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        Employee alex = mapper.getEmpByIdAndLastName(4, "alex");
        session.commit();
        System.out.println(alex);
        session.close();
    }

1 单个参数:mybatis不会做特殊处理,
	#{参数名/任意名}:取出参数值。
	select *  from tbl_employee where id = #{idddddd}
	
	
2 多个参数:mybatis会做特殊处理, 多个参数会被封装成map, #{}就是从map中获取指定的key的值;
	     封装map的规则:key:param1...paramN,或者参数的索引也可以 ,value:传入的参数值
		 如不指定参数 会报异常 org.apache.ibatis.binding.BindingException:
        Parameter 'id' not found.  Available parameters are [1, 0, param1, param2]		 

 解决办法 使用命名参数:明确指定封装参数时map的key;@Param("id")
	多个参数会被封装成一个map, key:使用@Param注解指定的值, value:参数值; #{指定的key}取出对应的参数值

6 多个参数的查询 Map    
7 返回集合
8 返回一条记录的map;key就是列名,值就是对应的值
9 多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的javaBean

3 POJO:
如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;
	#{属性名}:取出传入的pojo的属性值	

4 Map:
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map
	#{key}:取出map中对应的值


5 TO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象
Page{
	int index;
	int size;
}

6 #{} 大多情况下,我们去参数的值都应该去使用#{};
select * from tbl_employee where id=${id} and last_name=#{lastName}

#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
		
${} 原生jdbc不支持占位符的地方我们就可以使用${}进行取值 , 比如分表、排序。。。;按照年份分表拆分
			select * from ${year}_salary where xxx;
			select * from tbl_employee order by ${f_name} ${order}
#{}:更丰富的用法: 规定参数的一些规则:
	javaType、 jdbcType、 mode(存储过程)、 numericScale、
	resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

	jdbcType通常需要在某种特定的条件下被设置:
		在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
		JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
		由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
		1、#{email,jdbcType=OTHER};
		2、jdbcTypeForNull=NULL
			<setting name="jdbcTypeForNull" value="NULL"/>
public interface EmployeeMapper {
    // 6 多个参数的查询 Map
    public Employee getEmpByMap(Map<String, Object> map);

    // 7 返回集合
    public List<Employee> getEmpsByLastNameLike(String lastName);


    //8 返回一条记录的map;key就是列名,值就是对应的值
    public Map<String, Object> getEmpByIdReturnMap(Integer id);


    //9 多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的javaBean
    //@MapKey:告诉mybatis封装这个map的时候使用哪个属性作为map的key
    @MapKey("lastName")
    public Map<String, Employee> getEmpByLastNameLikeReturnMap(String lastName);
    
}

<?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.alex.dao.EmployeeMapper">
 
    <!--6  多个参数的查询 map-->
   <!-- public Employee getEmpByMap(Map<String, Object> map);-->
<!--    测试 ${ tableName}  原生JDBC 或者 不能预编译的 可以使用-->

    <select id="getEmpByMap" resultType="com.alex.bean.Employee" databaseId="mysql">
        <!--    select *  from tbl_employee where id = #{id} and last_name =#{lastName}-->
		select *  from  ${tableName} where id = #{id} and last_name =#{lastName}
	</select>


    <!-- public List<Employee> getEmpsByLastNameLike(String lastName); -->
    <!--7 resultType:如果返回的是一个集合,要写集合中元素的类型 Employee -->
    <select id="getEmpsByLastNameLike" resultType="com.alex.bean.Employee" databaseId="mysql">
            select *  from tbl_employee where last_name like  #{lastName}
    </select>


<!--  8  返回值封装成一个map-->
    <!--public Map<String, Object> getEmpByIdReturnMap(Integer id);  -->
    <select id="getEmpByIdReturnMap" resultType="map" databaseId="mysql">
 		select *  from tbl_employee where id= #{id}
 	</select>

    <!--9 resultType:如果返回的是一个集合,要写集合中元素的类型  -->
    <!--public Map<Integer, Employee> getEmpByLastNameLikeReturnMap(String lastName);  -->
    <select id="getEmpByLastNameLikeReturnMap" resultType="com.alex.bean.Employee">
 		select * from tbl_employee where last_name like #{lastName}
 	</select>
    
</mapper>

 // 多个参数查询 map
    @Test
    public void getEmpByMap() {
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

        HashMap<String, Object> map = new HashMap<>();
        map.put("id" ,4 );
        map.put("lastName" ,"alex" );
        map.put("tableName" ,"tbl_employee");
        Employee employee = mapper.getEmpByMap(map);
        session.commit();
        System.out.println(employee);
        session.close();
    }


    // 返回 List  like
    @Test
    public void getEmpsByLastNameLike() {
        SqlSession session = MybatisUtils.getSqlSession();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        List<Employee> list_emp = mapper.getEmpsByLastNameLike("%e%");
        session.commit();

        for (Employee employee : list_emp) {
//            System.out.println(employee);
        }
        session.close();

others
public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id==>#{id/param1}   lastName==>#{param2}

public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id==>#{param1}    lastName===>#{param2.lastName/e.lastName}

##特别注意:如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。
			key:Collection(collection),如果是List还可以使用这个key(list),数组(array)
public Employee getEmpById(List<Integer> ids); 取值:取出第一个id的值: #{list[0]}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。