当方法参数较多时,使用对象,对象只要有属性,每个属性有set,get方法
属性名必须和表的列名相同,否则返回的对象的属性为空
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where
name =#{name,javaType=java.lang.String,jdbcType=VARCHAR}
or
age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}
</select>
这个方式不推荐使用,
:可读性不好,arg0和arg1不清晰是什么值
:List<Student> selectByPosition(String name,Integer age);
方添加了一个参数,结果错误
:select id,name ,email,age from student where name =#{arg0} or age=#{arg1}
当arg1和arg0换位置,会影响结果
不推荐使用,Map集合,
:List<Student> selectStudentByMap(Map<String,Object> map);
并不清楚Map的参数有几个,也不知道参数的类型
:select id,name ,email,age from student where name =#{myname} or age=#{myage}
通过key获取值,key值不具有统一性
StudentDao接口:
package com.bjpowernode.dao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.vo.QueryParama;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentDao {
//查询学生
Student selectById(Integer id);
//dao接口的方法是一个简单类型的 java基本数据类型 和字符串
Student selectByEmail(String email);
/* 多个简单类型参数,查询多条记录,使用@Param命名参数,注解是mybatis提供的
位置:在形参定义的前面
属性:value 自定义的参数名称 value可以省略
*/
List<Student> selectByNameOrAge(@Param(value="myname") String name,
@Param("myage") Integer age);
/*
一个java对象作为参数(对象有属性,每个属性有对应的set,get方法)
*/
List<Student> selectByObject(Student student);
//对象不局限于实体类,他可以是任意的一个实体类,有属性,有Sett Gett方法就能使用
List<Student> selectByQueryParama(QueryParama parama);
//使用位置获取参数
List<Student> selectByPosition(String name,Integer age);
/*
使用Map作为参数
*/
List<Student> selectStudentByMap(Map<String,Object> map);
//更新
int updateStudent(Student student);
//${}占位符的使用查询 ,使用@Param命名
List<Student> queryStudent(@Param("studentName") String name);
//按id排序
List<Student> queryStudentOrderById();
//按照name排序
List<Student> queryStudentOrderName();
//传入利用占位符特定参数查询
List<Student> queryStudentOrderByColName(@Param("myname") String name,@Param("colName") String colName,@Param("colName") String tableName);
}
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.bjpowernode.dao.StudentDao">
<!--使用insert,update,delete,select标签来写sql语句-->
<!--
parameterType:指定dao接口形参的类型:这个属性的值可以使用java类型的全限定名称或者 myBatis定义的别名
mybatis执行sql语句:select id,name ,email,age from student where id=?
?是占位符,使用jdbc中的PreparedStatement执行这样的语句
PreparedStatement pst=conn.preparedStatement("select id,name ,email,age from student where id=? ");
给 ? 位置赋值
如果:
参数是Integer,执行pst.setInt(1,1005)
参数是String ,执行pst.setString(1,"1005")
第一个用法:java是全限定类型名称 parameterType="java.lang.Integer"
第二个用法:mybatis定义的Java类型的别名 parameterType=“int”
parameterType:mybatis通过反射机制可以获取 dao接口方法参数的类型,可以不写
-->
<!--告诉MyBatis传入的参数是一个整数,dao接口方法的参数是一个整形-->
<select id="selectById" parameterType="java.lang.Integer" resultType="student">
select id,name ,email,age from student where id=#{studentid}
</select>
<!--
dao接口是一个简单的参数
mapper文件,获取这个参数值,使用#{任意字符}
-->
<select id="selectByEmail" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where email=#{studentEmail}
</select>
<!--
dao接口方法有多个简单类型的参数
当使用了@Param命名后,,例如@Param("myname")
在mapper文件中,使用#{命名的参数} 例如#{myname}
-->
<select id="selectByNameOrAge" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =#{myname} or age=#{myage}
</select>
<!--
一个java对象作为方法的参数,使用对象的属性作为参数值使用
简单语法:#{属性名} mybatis调用此属性的getXXX()方法获取属性值
-->
<select id="selectByObject" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =#{name} or age=#{age}
</select>
<!-- 一般不用这么写,太麻烦了-->
<!-- <select id="selectByObject" resultType="com.bjpowernode.domain.Student">-->
<!-- select id,name ,email,age from student where-->
<!-- name =#{name,javaType=java.lang.String,jdbcType=VARCHAR}-->
<!-- or-->
<!-- age=#{age,javaType=java.lang.Integer,jdbcType=INTEGER}-->
<!-- </select>-->
<!--另一个类的对象Sql语句-->
<select id="selectByQueryParama" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =#{p1} or age=#{p2}
</select>
<!-- 按位置获取参数值,dao接口方法是多个简单类型参数
语法:#{arg0},#{arg1}
arg0代表name
arg1代表age
-->
<select id="selectByPosition" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =#{arg0} or age=#{arg1}
</select>
<!--使用map传递参数
在mapper文件中,获取map的值,是通过key获取的,语法:#{key}
-->
<select id="selectStudentByMap" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =#{myname} or age=#{myage}
</select>
<!--更新-->
<update id="updateStudent">
update student set name=#{name},email=#{email} where id=#{id}
</update>
<!-- ${}占位符-->
<select id="queryStudent" resultType="com.bjpowernode.domain.Student">
select id,name ,email,age from student where name =${studentName}
</select>
<!-- id列排序-->
<select id="queryStudentOrderById" resultType="com.bjpowernode.domain.Student">
select * from student order by id
</select>
<!-- name列排序-->
<select id="queryStudentOrderName" resultType="com.bjpowernode.domain.Student">
select * from student order by name
</select>
<select id="queryStudentOrderByColName" resultType="com.bjpowernode.domain.Student">
select * from ${tableName} where name=#{myname} order by ${colName} desc
</select>
</mapper>
Student类:
package com.bjpowernode.domain;
public class Student {
//属性名和列明保持一致
private Integer id;
private String name;
private String email;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "学生实体信息{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
MyBatistUtil工具类:
package com.bjpowernode.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/*
工具类:用来创建SqlSession对象
*/
public class MybatisUtil {
private static SqlSessionFactory factory=null;
// 通过静态代码块,当MybatisUtil类被虚拟机加载的时候,就执行以下代码,把SqlSessionFactory factory创建一次
//读取主配置文件
static{
try{
String config="mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
factory=new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e){
e.printStackTrace();
}
}
//创建方法,获取SqlSession对象
public static SqlSession getSqlSession(){
SqlSession session=null;
if (factory!=null){
session=factory.openSession();//openSession(true)
}
return session;
}
}
QueryParama类:
package com.bjpowernode.vo;
public class QueryParama {
private Object p1;
private Object p2;
public Object getP1() {
return p1;
}
public void setP1(Object p1) {
this.p1 = p1;
}
public Object getP2() {
return p2;
}
public void setP2(Object p2) {
this.p2 = p2;
}
}
主配置文件MyBatis.xml:
<?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>
<!--设置日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--声明别名-->
<!--
第一种方式:
type:java类型的全限定名称
alias:自定义别名
优点:别名可以自定义
缺点:每个类型必须单独定义
第二种方式:
name:包名 mybatis会把这个包中的所有类名作为别名(不区分大小写)
优点:使用方便,一次可以给多个类定义别名
缺点:别名不能自定义,必须是类名
-->
<typeAliases>
<!-- 第一种方式-->
<!-- <typeAlias type="com.bjpowernode.domain.Student" alias="stu"></typeAlias>-->
<!-- <typeAlias type="com.bjpowernode.vo.QueryParama" alias="qp" />-->
<!-- 第二种方式-->
<package name="com.bjpowernode.domain"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源:创建Connection对象,连接数据库 -->
<dataSource type="POOLED">
<!--driver:驱动的内容-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url-->
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&charaterEcoding=utf-8"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 是指定其他mapper文件的位置:
其他mapper文件的目的是找到其他文件sql语句
-->
<mappers>
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
</mappers>
</configuration>
测试类MyTest:
package com.bjpowernode;
import com.bjpowernode.dao.StudentDao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.utils.MybatisUtil;
import com.bjpowernode.vo.QueryParama;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
MyBaits dao代理使用
*/
public class MyTest {
//查询测试
@Test
public void testSelectById(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//调用方法
Student student=dao.selectById(1005);
System.out.println("student="+student);
//4.关闭SqlSession对象
session.close();
}
//方法一个参数,查询测试
@Test
public void testOneParameterSelectEmail(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//调用方法
Student student=dao.selectByEmail("lifeng@qq.com");
System.out.println("email=="+student);
//4.关闭SqlSession对象
session.close();
}
//方法多个参数,查询测试
@Test
public void testSelectByNameOrAge(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//调用方法
List<Student> students=dao.selectByNameOrAge("李四",26);
students.forEach(stu-> System.out.println("stu"+stu));
//4.关闭SqlSession对象
session.close();
}
//方法参数传递一个对象Student,查询测试
@Test
public void testSelectByObject(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
Student student=new Student();
student.setName("李思思");
student.setAge(22);
//调用方法
List<Student> students=dao.selectByObject(student);
students.forEach(stu-> System.out.println("stu"+stu));
//4.关闭SqlSession对象
session.close();
}
//QueryParama类作为对象,查询测试
@Test
public void testSelectByObject2(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
QueryParama parama=new QueryParama();
parama.setP1("东皇");
parama.setP2(20);
//调用方法
List<Student> students=dao.selectByQueryParama(parama);
students.forEach(stu-> System.out.println("stu"+stu));
//4.关闭SqlSession对象
session.close();
}
//按位置进行传递参数查询,测试
@Test
public void testSelectByPosition(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//调用方法
List<Student> students=dao.selectByPosition("李四",20);
students.forEach(stu-> System.out.println("stu"+stu));
//4.关闭SqlSession对象
session.close();
}
//使用Map传递参数查询,测试
@Test
public void testSelectByMap(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//使用Map传递参数
Map<String,Object> data=new HashMap<>();
data.put("myname","李思思");
data.put("myage",20);
//调用方法
List<Student> students=dao.selectStudentByMap(data);
students.forEach(stu-> System.out.println("stu"+stu));
//4.关闭SqlSession对象
session.close();
}
//更新,测试
@Test
public void testUpdateStudent(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
Student student=new Student();
student.setId(1003);
student.setName("张峰");
student.setEmail("zhangfeng@qq.com");
student.setAge(20);
//调用方法
int rows=dao.updateStudent(student);
//提交
session.commit();
System.out.println("更新学生的rows="+rows);
//4.关闭SqlSession对象
session.close();
}
}
第一个测试结果:
2:
3.
4.
5.
6.
7.
8.