目录
一.先配置Mybatis主配置文件
<?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>
<properties resource="db.properties"></properties>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 控制全局缓存(二级缓存),默认 true-->
<setting name="cacheEnabled" value="false"/>
<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
<!--<setting name="proxyFactory" value="CGLIB" />-->
<!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
<!--
<setting name="localCacheScope" value="STATEMENT"/>
-->
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
<typeAliases>
<typeAlias alias="student" type="com.ws.vo.Student" />
</typeAliases>
<!-- <typeHandlers>
<typeHandler handler="com.ws.type.MyTypeHandler"></typeHandler>
</typeHandlers>-->
<!-- 对象工厂 -->
<!-- <objectFactory type="com.ws.objectfactory.MyObjectFactory">
<property name="gupao" value="666"/>
</objectFactory>-->
<!-- <plugins>
<plugin interceptor="com.ws.interceptor.SQLInterceptor">
<property name="gupao" value="betterme" />
</plugin>
<plugin interceptor="com.ws.interceptor.MyPageInterceptor">
</plugin>
</plugins>-->
<!-- <plugins>-->
<!-- <plugin interceptor="com.github.pagehelper.PageInterceptor">-->
<!-- <!– 4.0.0以后版本可以不设置该参数 ,可以自动识别-->
<!-- <property name="dialect" value="mysql"/> –>-->
<!-- <!– 该参数默认为false –>-->
<!-- <!– 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 –>-->
<!-- <!– 和startPage中的pageNum效果一样–>-->
<!-- <property name="offsetAsPageNum" value="true"/>-->
<!-- <!– 该参数默认为false –>-->
<!-- <!– 设置为true时,使用RowBounds分页会进行count查询 –>-->
<!-- <property name="rowBoundsWithCount" value="true"/>-->
<!-- <!– 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 –>-->
<!-- <!– (相当于没有执行分页查询,但是返回结果仍然是Page类型)–>-->
<!-- <property name="pageSizeZero" value="true"/>-->
<!-- <!– 3.3.0版本可用 - 分页参数合理化,默认false禁用 –>-->
<!-- <!– 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 –>-->
<!-- <!– 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 –>-->
<!-- <property name="reasonable" value="true"/>-->
<!-- <!– 3.5.0版本可用 - 为了支持startPage(Object params)方法 –>-->
<!-- <!– 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 –>-->
<!-- <!– 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 –>-->
<!-- <!– 不理解该含义的前提下,不要随便复制该配置 –>-->
<!-- <property name="params" value="pageNum=start;pageSize=limit;"/>-->
<!-- <!– 支持通过Mapper接口参数来传递分页参数 –>-->
<!-- <property name="supportMethodsArguments" value="true"/>-->
<!-- <!– always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page –>-->
<!-- <property name="returnPageInfo" value="check"/>-->
<!-- </plugin>-->
<!-- </plugins>-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
<dataSource type="POOLED" >
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- <databaseIdProvider type="DB_VENDOR">-->
<!-- <property name="MySQL" value="mysql"/>-->
<!-- </databaseIdProvider>-->
<mappers>
<!--一个mapper标签指定 一个文件的位置。
从类路径开始的路径信息。target/clasess(类路径 )
-->
<mapper resource="com/ws/mapper/StudentDao.xml"/>
</mappers>
</configuration>
二.实体类
对应数据库中的一个表
Student
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private Integer clazzNo;
public Student(Integer id, String name, Integer age, Integer clazzNo) {
this.id = id;
this.name = name;
this.age = age;
this.clazzNo = clazzNo;
}
}
三.Dao层(mapper)
public interface StudentDao {
/**
* 查询所有学生信息
* @return
*/
List<Student> queryAllStudents();
/**
* 根据ID查学生信息
* @return
*/
Student querySyudentById(Integer id);
/**
* 添加学生
* @return
*/
int addStudent(Student student);
/**
* 修改学生信息
* @return
*/
int updateStudentById(Student student);
/**
* 删除学生
* @return
*/
int deletStudentById(Integer id);
/**
*连表查询
* 查询学生和班级
* @return
*/
StudentAndClazz queryStudentAndeClazzById(Integer id);
}
对应一个mapper.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.ws.mapper.StudentDao">
<select id="queryAllStudents" resultType="student">
select id, name, age, clazz_no from student
</select>
<select id="querySyudentById" parameterType="int" resultType="student">
select id, name, age, clazz_no from student where id=#{id}
</select>
<insert id="addStudent">
insert into student (id,name,age,clazz_no)values (#{id},#{name},#{age},#{clazzNo})
</insert>
<update id="updateStudentById" parameterType="student">
update student set name=#{name}, age=#{age}, clazz_no=#{clazzNo} where id=#{id}
</update>
<delete id="deletStudentById" parameterType="int">
delete from student where id = #{id}
</delete>
<!-- 根据clazz_no查询clazz信息, -->
<resultMap id="studentAndClazz" type="com.ws.vo.StudentAndClazz">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<result column="clazz_no" property="clazzNo" jdbcType="INTEGER"/>
<result column="clazz_name" property="clazzName"/>
</resultMap>
<select id="queryStudentAndeClazzById" parameterType="int" resultMap="studentAndClazz">
select s.id, s.name, s.age, s.clazz_no, c.clazz_name from student s join clazz c on s.clazz_no=c.id where s.id = #{id}
</select>
</mapper>
四.CRUD
先加载Mybatis主配置文件 -> 根据SqlSessionFactory工厂创建SqlSession -> 传入我们的Dao接口去获取相应的mapper映射器。
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//单例的工厂
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
//获取mapper
StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);
查询所有学生信息
//查询所有学生
List<Student> studentList = studentMapper.queryAllStudents();
System.out.println(Arrays.toString(studentList.toArray())
.replaceAll("\\[|\\]","")
.replaceAll("\\)\\,","\\)\n"));
根据ID查学生信息
Student student = studentMapper.querySyudentById(1);
System.out.println(student);
添加学生
//添加学生
Student student = new Student(3,"ws",18,100);
int nums = 0;
nums = studentMapper.addStudent(student);
System.out.println(nums);
sqlSession.commit();
修改学生信息
//修改学生信息
Student student = new Student(3,"王硕",18,100);
nums = studentMapper.updateStudentById(student);
System.out.println(nums);
sqlSession.commit();
删除学生
//删除学生信息
nums = studentMapper.deletStudentById(3);
System.out.println(nums);
sqlSession.commit();
连表查询学生和班级
//连表查询学生和班级的信息
StudentAndClazz studentAndClazz = studentMapper.queryStudentAndeClazzById(1);
System.out.println(studentAndClazz);
五.分页查询(PageHelper插件)
1.先加入PageHelper依赖
<!-- pagehelper依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency>
2.主配置文件中配置插件
<!--配置插件--> <plugins> <!--配置pagehelper插件--> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins>
3代码中直接使用
@Test
public void Test4() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//单例的工厂 解析配置文件获的SqlSessionFactory工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
//获取mapper
StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);
//查询所有学生
/**
* limit n, m n代表从第n+1个数据开始查,m代表查几个
* pageNum:2 pageSize:2 -> limit (pageNumm-1)*pageSize ,pageSize
*
*/
PageHelper.startPage(2,2); //pageNum:第几页 pageSize:每页几条数据
List<Student> studentList = studentMapper.queryAllStudents();
System.out.println(Arrays.toString(studentList.toArray())
.replaceAll("\\[|\\]","")
.replaceAll("\\)\\,","\\)\n"));
}
分页就是再查询sql语句上加入limit(mysql)
limit n, m: n代表从第n+1个数据开始查,m代表查几个 *
pageNum:第几页 pageSize:每页几个数据 -> limit (pageNumm-1)*pageSize ,pageSize
所以我们使用PageHelper.startPage(2,2); 也就是在我们的原来的语句上加上了limet 2,2
所以如果是PageHelper.startPage(3,10) ->limet 20,10