Mybatis框架Dao代理(三)

1.使用动态代理的方式

你只需要提供接口,mybatis自动帮你创建实现类和对象。

public class TestMybatis3 {
    // 测试插入方法
    @Test
    public void testInsert() throws IOException {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        ProvinceDao dao = sqlSession.getMapper(ProvinceDao.class); // 1.动态代理:参数是接口名,作用:获取这个dao接口的对象
        Province pro1 = new Province(12,"海南","琼","海口");
        int num = dao.insertProvince(pro1); // 2.通过接口对象调用接口方法
        System.out.println("执行插入方法后的结果是:" + num); // 3.输出结果
        sqlSession.close();  // 4.关闭资源
    }
}

2.深入理解参数

从java代码中,把数据传入到Mapper文件的sql语句中

1.一个简单类型的参数:
    1.简单类型:mybatis把java的基本数据类型和String都叫做简单类型
    2.在Mapper文件获取简单类型的参数值:#{任意字符}    例如,#{studentId}

2.多个参数,使用@Param命名参数
接口:public List<Student> selectMulitParam(@Param("myname") String name,@Param("myage" Integer age))
方式:@Param("参数名") String name
示例:

1.接口中

// 多个参数
List<Province> selectMultiParam(@Param("myname") String name,@Param("myid")Integer id);

2.mapper文件

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

3.多个参数使用对象方式传参

完整示例

1.Student类

package com.dccomics.domain;

public class Student {
   private Integer id;
   private String name;
   private Integer age;
+ getter 和 setter方法
}

2.QueryParam类

public class QueryParam {
    private String paramName;
    private Integer paramAge;
+ 无参构造 + 有参构造 + getter方法 和setter方法
}

3.StudentDao接口

package com.dccomics.dao;

import com.dccomics.domain.QueryParam;
import com.dccomics.domain.Student;

import java.util.List;

public interface StudentDao {
    /**
     * 1.查询方法,使用java对象作为接口中方法的参数
     * 2.QueryParam param:参数名是自定义的,可以自己写,也可以用现成的。
     * 3.关键是用它的属性值
     */
    List<Student> selectMultiObject(QueryParam param);
}

4.SqlMapper映射文件(StudentDao.xml)

<?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.dccomics.dao.StudentDao">
    <!--
        1.多个参数 使用java对象的属性值作为参数的实际值
        2.使用对象语法:#{属性值}
        3.resultType:记得指定返回对象的类型
    -->
    <select id="selectMultiObject" resultType="com.dccomics.domain.Student">
        select id,name,age from t_student where #{paramName} or #{paramAge}
    </select>
</mapper>

5.主配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- 配置日志:可以在控制台输出执行的SQL语句和参数 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--
        环境配置:数据库的连接信息
            environment:数据库的信息配置
            default:和某个environment的id值必须一致,告诉mybatis要使用哪个数据库
    -->
    <environments default="myDev">
        <environment id="myDev"> <!-- id:环境的名称,具有唯一性 -->
            <!--
                transactionManager:mybatis的事务类型
                type:表示使用jdbc中的Connection对象的commit,rollback做事务处理
            -->
            <transactionManager type="JDBC"/>

            <!--
                dataSource:表示数据源,用来连接数据库
                type:数据源的类型,POOLED:表示使用连接池
             -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--
        mappers:sql映射文件的位置
        mapper:一个mapper标签指定一个文件的位置
            从类路径(target/classes)开始的路径信息
            注意:target/classes目录下要有ProvinceDao.xml文件存在
     -->
    <mappers>
        <mapper resource="com/dccomics/dao/StudentDao.xml"/>
    </mappers>
</configuration>

6.测试类

package com.dccomics;

import com.dccomics.dao.StudentDao;
import com.dccomics.domain.QueryParam;
import com.dccomics.domain.Student;
import com.dccomics.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {
    @Test
    public void testSelectMultiObject(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        QueryParam param = new QueryParam("john", 20);
        List<Student> students = dao.selectMultiObject(param);
        for(Student stu:students){
            System.out.println("学生是" + stu);
        }
        sqlSession.close();
    }
}

3.#和$
1.#占位符:告诉mybatis使用实际的参数值代替。并使用PrepareStatement对象执行sql语句,#{...}代替sql语句的?。这样做更安全,避免了sql注入的问题。
2.$字符串替换:告诉mybatis使用$包含的字符串替换所在的位置。使用Statement对象执行sql,效率PrepareStatement低,而且还存在sql注入的风险。$主要用在替换表名或者列表,只要你能确定数据是安全的,就可以使用$。

4.封装mybatis输出结果

 简单类型示例

<select id="selectMultiObject" resultType="java.lang.Integer">
    select count(*) from student
</select>

在主配置文件中,<settings>标签后面添加

 

 总结:推荐使用全限定名称,其他的方式都不可靠

返回map示例

 

 

 

 

 

 5.模糊查询

第一种方式:(推荐使用

1.接口中方法

// 第一种模糊查询方法 在java代码指定like的内容
List<Student> selectLikeOne(String name);

2.StudentDao.xml

<!-- 第一种like java代码中指定like内容 -->
<select id="selectLikeOne" resultType="com.dccomics.domain.Student">
    select id,name,age from t_student where name like #{name}
</select>

3.测试类

@Test
    public void testSelectLikeOne(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        String name="%jason%";
        List<Student> students = dao.selectLikeOne(name);
        for(Student stu:students){
            System.out.println("学生是" + stu);
        }
        sqlSession.close();
    }

第二种方式:

1.StudentDao.xml

 

 2.测试类

posted @ 2021-03-06 23:44  兵长砍猴  阅读(53)  评论(0)    收藏  举报