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.测试类