第三章:mybatis框架Dao代理

  1. 动态代理: 使用SqlSession.getMapper(dao接口.class) 获取这个dao接口的对象
  2. 传入参数: 从java代码中把数据传入到mapper文件的sql语句中。
parameterType : dao接口中方法参数的数据类型。
parameterType它的值是java的数据类型全限定名称或者是mybatis定义的别名
例如:parameterType="java.lang.Integer"parameterType="int"
注意:parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数类型。所以可以没有。 一般我们也不写。

使用#{}之后, mybatis执行sql是使用的jdbc中的PreparedStatement对象
由mybatis执行下面的代码:
  1. mybatis创建Connection , PreparedStatement对象
            String sql="select id,name, email,age from student where id=?";
            PreparedStatement pst = conn.preparedStatement(sql);
            pst.setInt(1,1001);
  2. 执行sql封装为resultType="com.bjpowernode.domain.Student"这个对象
            ResultSet rs = ps.executeQuery();
            Student student = null;
            while(rs.next()){
               //从数据库取表的一行数据, 存到一个java对象属性中
               student = new Student();
               student.setId(rs.getInt("id));
               student.setName(rs.getString("name"));
               student.setEmail(rs.getString("email"));
               student.setAge(rs.getInt("age"));
            }

           return student;  //给了dao方法调用的返回值

例如StudentDao接口
public Student  selectStudentById(Integer id)
1. parameterType : 写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。他的值是java中的数据类型全限定名称或者说是mybatis定义别名
2. 一个简单类型的参数:
 简单类型: mybatis把java的基本数据类型和String都叫简单类型。
 在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}

  接口:public Student  selectStudentById(Integer id) 
  mapper:select id,name, email,age from student where id=#{studentId}
  1. 多个参数,使用@Param命名参数

    接口 public List selectMulitParam(@Param(“myname”) String name, @Param(“myage”) Integer age)
    使用 @Param(“参数名”) String name
    mapper文件:

    select * from student where name=#{myname} or age=#{myage}

List<Student> selectMulitParam(@Param("myname")String name,@Param("myage")Integer age);

<select id="selectMulitParam" resultType="com.mybatis.study.domain.Student">

        select id, name, email, age from student where name=#{myname} or age=#{myage}
    </select>

public void selectMulitParam() {
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            StudentDao dao = sqlSession.getMapper(StudentDao.class);
            List<Student> students = dao.selectMulitParam("张飞", 25);
            for (Student stu: students
                 ) {
                System.out.println(stu);
            }
            sqlSession.close();

        }

  1. 多个参数,使用java对象
    语法 #{属性名}

    vo: value object , 放一些存储数据的类。比如说 提交请求参数, name ,age
    现在想把name ,age 传给一个service 类。

    vo: view object , 从servlet把数据返回给浏览器使用的类,表示显示结果的类。

    pojo: 普通的有set, get方法的java类。 普通的java对象

    Servlet — StudentService( addStudent( MyParam param) )

    entity(domain域): 实体类, 和数据库中的表对应的类,

List<Student> selectMulitObjet(QuaryParam param);

<select id="selectMulitObjet" resultType="com.mybatis.study.domain.Student">
        select id, name, email, age from student where 
        name=#{ParamName} or age=#{ParamAge}
    </select>

public void selectMulitObject(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
            QuaryParam param =  new QuaryParam();
                param.setParamName("张三");
            param.setParamAge("20");
            List<Student> students = dao.selectMulitObjet(param);
            for (Student stu: students
            ) {
                System.out.println(stu);
            }
            sqlSession.close();
            
        }

5.# 和 $

  select id,name, email,age from student where id=#{studentId}
  # 的结果: select id,name, email,age from student where id=? 


   select id,name, email,age from student where id=${studentId}
  $ 的结果:select id,name, email,age from student where id=1001

  String sql="select id,name, email,age from student where id=" + "1001";
  使用的Statement对象执行sql, 效率比PreparedStatement低。


  $:可以替换表名或者列名, 你能确定数据是安全的。可以使用$


  # 和 $区别(面试经常问)
  1. #使用 ?在sql语句中做占位的, 使用PreparedStatement执行sql,效率高
  2. #能够避免sql注入,更安全。
  3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
  4. $有sql注入的风险,缺乏安全性。
  5. $:可以替换表名或者列名
  1. mybatis的输出结果
    mybatis执行了sql语句,得到java对象。

1)resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。

resultType结果类型的它值 1. 类型的全限定名称 2. 类型的别名, 例如 java.lang.Integer别名是int

    处理方式:
	   1. mybatis执行sql语句, 然后mybatis调用类的无参数构造方法,创建对象。
		2. mybatis把ResultSet指定列值付给同名的属性。


		<select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
      select id,name, email,age from student
    </select>

	  对等的jdbc
	  ResultSet rs = executeQuery(" select id,name, email,age from student" )
	  while(rs.next()){
           Student  student = new Student();
				student.setId(rs.getInt("id"));
				student.setName(rs.getString("name"))
	  }
  1. 定义自定义类型的别名

    1)在mybatis主配置文件中定义,使定义别名。

    2)可以在resultType中使用自定义别名

<!--定义别名-->
	<typeAliases>
			<!--可以指定一个类型一个自定义别名
			type:自定义类型的全限定名称
			alias:别名(短小,容易记忆的)-->
		<typeAlias type="com.bjpowernode.domain.Student"alias="stu"/>
		<typeAlias type=”com.bjpowernode.vo.ViewStudent"alias="vstu"/>

<!--第二种方式
	<package> name是包名,这个包中的 所有类,类名就是别名(类名不区分大小写 )

	<package name="com.bjpowernode.dpmain" />


-->




	</typeAliases>

3)resultMap:结果映射, 指定列名和java对象的属性对应关系。
1)你自定义列值赋值给哪个属性
2)当你的列名和属性名不一样时,一定使用resultMap
resultMap和resultType不要一起用,二选一

<resultMap id="studentMap"type="com.bjpowernode.domain.student">
	<!--列名和java属性的关系-->
		<!--注解列,使用id标签
			column:列名
			property:java类型的属性名
		-->
	<id column="id"property="id"/>
		<!--非主键列,使用result-->
	<result column="name"property="name"/>
<result column="email"property="email"/>
<result column="age"property=”age"/>
</resultMap>
<select id="selectAllstudents"resul tMap="studentMap'
select id,name,email,age from student
</select>
</mapper>


列名与属性名不一样第二种方式

resultType的默认原则是 同名的列值赋值给同名的属性,使用列别名。


select id as stuid ,name as stuname, email as stuemail ,age stuage from student

模糊like

第一种:在java代码指定like的内容

第二种:在mapper文件拼接like的内容

select id, name, email ,age from student where name like "%" #{name} "%"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值