MyBatisMybatis — 映射文件、参数处理、参数值的取得、select元素

炫耀文件:指点着MyBatis如何举办数据库增删改查,
有着异常关键之含义;

 

– cache   命名空间的二级缓存配置

– cache-ref   其他命名空间缓存配置的援。

– resultMap    自定义结果集映射

– parameterMap    已弃!老式风格的参数映射

– sql    抽取可选择语句块

– insert    映射插入语句

– update    映射更新语句

– delete    映射删除语句

– select    映射查询语句

 

1.先看增删改查标签

public interface EmployeeMapper {
      /*
       * 增删改查方法
       * */
      public Employee getEmployeeById(Integer id);
      public void insertEmp(Employee employee);
}

以那相应的sql映射文件被:      

useGeneratedKeys=”true”:默认使用主键自增的主键

keyProperty=”id”:将主键赋值给 id
属性

这样虽然可以在insert函数中得到新增长的用户之 id主键,否则获取不顶

<select id="getEmployeeById" resultType="employee" databaseId="mysql">
      select * from student where id = #{id}
</select>

<insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id">
      insert into student(name,password,email) values(#{name},#{password},#{email})
</insert>

编制测试单元:

private EmployeeMapper mapper = null;
private SqlSession session = null;
@Before
public void testBefore(){
      //1.获取sqlSessionFactory对象
      SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
      //2.利用sqlSessionFactory创建一个session对象,表示和数据库的一次会话
      session = sqlSessionFactory.openSession();
      //3.用session对象获取mapper接口的代理对象
      //因为sql映射文件给相应的接口创建了一个代理对象,所以mapper接口类不需要实现类
      mapper = session.getMapper(EmployeeMapper.class);
}

@Test
public void testSelect(){
      mapper = session.getMapper(EmployeeMapper.class);
      //4.通过mapper接口的代理对象就可以对数据库进行增删改查操作
      Employee employee = mapper.getEmployeeById(4);
      System.out.println(employee);
}
@Test
public void testInsert(){
      Employee emp = new Employee("zhangsan", "1234567", "zhangsan@q.com");
      mapper.insertEmp(emp);
      int id = emp.getId();
      System.out.println(id);
}
@After
public void testAfter(){
      //增删改需要提交事务
      session.commit();
      session.close();
}
//@Before、@After自动在@Test之前和之后运行
//查询不需要提交事务,增删改都需要提交事务

 

2.博自添主键值【当朝数据库中插入一条数的下,默认是用不交主键的值的,
需要安装如下两独属性才方可将到主键值!】

<!--设置userGeneratedKeys属性值为true:使用自动增长的主键。使用keyProperty设置把主键值设置给哪一个属性-->
<insert id="addEmp" parameterType="com.neuedu.mybatis.bean.Employee" useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
      insert into tbl_employee(last_name,email,gender) values(#{lastName},#{gender},#{email})
</insert>

 

3.SQL节点:

   1).可以用来存储于引用的SQL片段

   2).在sql映射文件被,具体选取办法如下:

<sql id="npe">
      name,password,email
</sql>
<insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id">
      insert into student(<include refid="npe"></include>) values(#{name},#{password},#{email})
</insert>

 


参数处理

 

– 单个参数:Mybatis 不会面异常处理

  #{参数称}: 取出参数值,参数曰自由写

– 四只参数:Mybatis会做特别处理,多独参数会受封装成一个map 

  key:param1…paramN,或者参数的目录也堪(0,1,2,3…..)

       value:传入的参数值

       #{ }就是由map中获取指定的key的值

       命名参数:明确指定封装参数时map的key:@param(“id”)

                 多单参数会被封装成一个map,

                   key:使用@Param表明指定的价

                   value:参数值

                   #{指定的key}取出对应之参数值

public void updateEmp(@Param("id")Integer id,
                      @Param("name")String name,
                      @Param("password")String password,
                      @Param("email")String email);

 

<update id="updateEmp">
      update student set name=#{name},password=#{password},email=#{email} where id=#{id}
</update>

 –
POJO参数:即使四个参数正好是我们工作逻辑的数据模型,我们虽然好一贯传入POJO

  #{属性名}:取出传入的POJO的属于性值

public void insertEmp(Employee employee);

 

<sql id="npe">
        name,password,email
</sql>
<insert id="insertEmp" parameterType="com.neuedu.entity.Employee" useGeneratedKeys="true" keyProperty="id">
    insert into student(<include refid="npe"></include>) values(#{name},#{password},#{email})
</insert>

 

@Test
public void testReturnVal(){
    Employee employee = mapper.getEmployeeById(30);
    System.out.println(employee);
}

 –
Map:假诺多独参数不是业务模型中的数量,没有对号入座之pojo,不常下,为了好,大家啊堪流传Map

  #{key}:遵照 key 取出map中对应之价

public void updateName(Map<String, Object> map);

 

<update id="updateName">
      update student set name=#{name} where id=#{id}
</update>

 

@Test
public void testMap(){
      Map<String, Object> map = new HashMap<>();
      map.put("id", 33);
      map.put("name", "刘德华");
      mapper.updateName(map);
}

 

#至于参数的题材:

    ①.使用#{}来传递参数

   
②.若目的措施的参数类型也目标类型,则调整用该相应的getter方法,如getEmail()

    ③.若目标措施的参数类型也Map类型,则调整用这get(key)

    ④.若参数是单科的,或者列表,需要运用@param注脚来举办标记

    ⑤.专注:若只来一个参数,则可省略@param表明

                   若有多独参数,必须要描绘@param注脚

  

 


参数值的取得

#{}:可以获取map中的值或者pojo对象属性之价值
${}: 可以获map中之值获取pojo对象属性的价值

 

所以例子简单区分一下:

select * from tbl_employee where id = ${id} and last_name =
#{lastName}
preparing:select * from tbl_employee where id = 2 and last_name = ?

否即便是说:对于${} 在日记中可见见你输入的价值,不安全;

     对于#{} 在日记中凡是?,所以相对安全

 

切切实实分:

#{}:是以预编译的花样,将参数设置到sql语句被,十分给PreparedStatement;制止sql注入

 

<update id="updateEmp">
      update student set name=#{name},password=#{password},email=#{email} where id=#{id}
</update>

MyBatis 1

${}:取出的值直接拼装在sql语句被,会生出安全问题

<update id="updateEmp">
      update student set name='${name}',password='${password}',email='${email}' where id='${id}'
</update>

MyBatis 2

 

差不多情形下,大家沾参数的价值都应去行使#{}

但原生JDBC不补助占位符的地点我们就是可用${}举行取值

按部就班取表名、分表、排序;遵照年度分表拆分

– select * from ${year}_salary where xxx;[表名不辅助预编译]

– select * from tbl_employee order by ${f_name} ${order}
:排序是免协理预编译的!

 

 


select 元素

select元一贯定义查询操作。

  Id:唯一标识符。

             用来引用那漫漫语句,需要与接口的办法名相同

  parameterType:参数类型。

             能够不传染,MyBatis会依照TypeHandler自动推测

  resultType:重返值类型。

            
别名或者全类名,固然回到的是会聚,定义集合中元素的品类。不可能跟resultMap同时使用 

 

1.归路也一个List

public List<Employee> getEmps();

 

<select id="getEmps" resultType="com.neuedu.entity.Employee">
      select * from student
</select>

 

@Test
public void testReturnList(){
      List<Employee> emps = mapper.getEmps();
      for (Employee employee : emps) {
            System.out.println(employee);
      }
}

 

2.赶回记录为一个Map

   只可以查询单条数据,尽管多漫长之言语,多独key 值,找不交

public Map<String, Object> getEmpInfoById(Integer id);

 resultType 是 Map 的全类名

<select id="getEmpInfoById" ="java.util.Map">
      select * from student where id = #{id}
</select>

 key:列名;value:值

@Test
public void testReturnMap(){
      Map<String, Object> emp = mapper.getEmpInfoById(30);
      Set<Entry<String,Object>> entrySet = emp.entrySet();

      for (Entry<String, Object> entry : entrySet) {
            System.out.println(entry.getKey()+":"+entry.getValue());
      }
}

 


 

 

数据库列名与实体类的性质名不对应的景色下爆发两种处理格局:

1.sql 语句 用 as 换名

2.生划线转换成驼峰式命名

   以大局配置文件中

 

<settings>
    <!-- setting标签负责每一个属性的设置 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

3.利用ResultMap:

public Employee getEmpInfoById(Integer id);

 

<resultMap type="com.neuedu.entity.Employee" id="getEmployByIdMap">
      <!-- 主键映射可以用 id 字段,mybatis在底层会做优化,主键有索引,加快查询速度 -->
      <id column="id" property="id"/>
      <!-- 普通列的映射使用result -->
      <result column="name" property="name"/>
      <result column="password" property="password"/>//相同的也可以不写,但因为规范建议写
      <result column="email" property="email"/>
</resultMap>
<select id="getEmpInfoById" resultMap="getEmployByIdMap">
      select * from student where id = #{id}
</select>

 

@Test
public void testReturnMap(){
      Employee emp = mapper.getEmpInfoById(30);
      System.out.println(emp);
}

 

网站地图xml地图