项目结构:
pom.xml依赖文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--项目坐标-->
<groupId>com.bjpowernode</groupId>
<artifactId>ch05-result</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
</dependencies>
<build>
<!--资源插件,处理src/main/java中的properties、xml-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
分页依赖:
<!--分页依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
resources下的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>
<!--声明别名-->
<typeAliases>
<!--第一种语法格式:
type:Java类型的全限定名称(自定义的类型)
alias:自定义的别名
优点:别名可以自定义
缺点:每个类型必须单独定义
-->
<typeAlias type="com.bjpowernode.domain.Student" alias="stu"/>
<!--第二种语法格式:
name:包名,mybatis会把这个包中的类名作为别名(不用区分大小写)
优点:使用方便,一次可以给多给类定义别名
缺点:不能自定义别名,别名必须是包中的类名,多个包中不能有同名的类,会报错
最后推荐不使用别名,就使用全限定名称
-->
<package name="com.bjpowernode.domain"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据源:创建Connection对象-->
<dataSource type="POOLED">
<!--driver:驱动的内容-->
<property name="driver" value="org.gjt.mm.mysql.Driver"/>
<!--连接数据库的url-->
<property name="url"
value="jdbc:mysql://localhost:3306/sql?useUnicode-ture&characterEncoding-utf-8"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置:其目的就是找到文件中的sql语句-->
<mappers>
<mapper resource="com\bjpowernode\dao\StudentDao.xml"/>
</mappers>
</configuration>
mapper文件:写sql语句的
<?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">
<!--使用select、insert、update、delete标签写sql语句-->
<!--parameterType="java.lang.Integer":表示参数类型,可以写全限定名称,也可以写别名-->
<select id="selectById" resultType="stu" parameterType="java.lang.Integer">
select id,name,email,age from student where id=#{studentId}
</select>
<!--使用resultMap定义列和属性的关系
定义resultMap标签:
id:给resultMap映射取名,唯一值
type:java类型的全限定名称
-->
<resultMap id="customMap" type="com.bjpowernode.vo.CustomObject">
<!--定义定义列名和属性名的对应关系
主键用id标签
-->
<id column="id" property="cid"/>
<!--非主键用result标签-->
<result column="name" property="cname"/>
<!--列名和属性名相同不用定义,想定义也行-->
</resultMap>
<!--resultMap标签指定映射关系
resultType标签和resultMap标签不能同时使用,二选一
使用更加灵活,推荐使用
-->
<select id="selectById2" resultMap="customMap">
select id,name,email,age from student where id=#{stuid}
</select>
<select id="countStudent" resultType="java.lang.Long">
select count(*) from student
</select>
<!--执行sql语句得到一个Map结构数据,mybatis执行sql,将resultSet转换成map
sql执行结果:key作为列名,value作为值
dao接口返回是一个map,最大一行结果,多一行便出错
-->
<select id="selectMap" resultType="java.util.Map">
select id,name from student where id=#{stuid}
</select>
<!--like的第一种方式-->
<select id="selectLikeOne" resultType="com.bjpowernode.domain.Student">
select * from student where name like #{name}
</select>
<!--like的第二种方式:格式:name like "%"空格#{}空格"%"-->
<select id="selectLikeTwo" resultType="com.bjpowernode.domain.Student">
select * from student where name like "%" #{name} "%"
</select>
</mapper>
自定义封装的mybatis工具:
package com.bjpowernode.utils;
import jdk.management.resource.ResourceContext;
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 javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
/*
* 工具类:创建SqlSession对象
* */
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
static {
String config = "mybatis.xml";
//Alt+Enter:快速try+catch
try {
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;
}
//ctrl+alt+l:调整代码格式
}
接口方法:定义所有操作数据库的方法名字
package com.bjpowernode.dao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.vo.CustomObject;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentDao {
Student selectById(Integer id);
CustomObject selectById2(@Param("stuid") Integer id);
long countStudent();
Map<Object,Object> selectMap(@Param("stuid") Integer id);
List<Student> selectLikeOne(@Param("name") String name);
List<Student> selectLikeTwo(@Param("name") String name);
}
需要操作的Java对象创建:需要属性对应的set和get方法,还有toString方法
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 +
'}';
}
}
测试单元:
package com.bjpowernode;
import com.bjpowernode.dao.StudentDao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.utils.MyBatisUtil;
import com.bjpowernode.vo.CustomObject;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
import java.util.Map;
public class MyTest {
@Test
public void testSelectById() {
SqlSession session = MyBatisUtil.getSqlSession();
//dao获取代理
StudentDao dao = session.getMapper(StudentDao.class);
Student student = dao.selectById(1001);
System.out.println("查询得到的结果为:" + student);
session.close();
}
@Test
public void testSelectById2() {
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
CustomObject customObject = dao.selectById2(1003);
System.out.println("查询得到的结果为:" + customObject);
session.close();
}
@Test
public void testCountStudent() {
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
long nums = dao.countStudent();
System.out.println("nums = " + nums);
session.close();
}
@Test
public void testSelectMap() {
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
Map<Object, Object> map = dao.selectMap(1005);
System.out.println("map==" + map);
session.close();
}
@Test
public void testSelectLikeOne() {
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
String name = "%李%";
List<Student> students = dao.selectLikeOne(name);
students.forEach(stu -> System.out.println("stu=" + stu));
session.close();
}
@Test
public void testSelectLikeTwo() {
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao dao = session.getMapper(StudentDao.class);
List<Student> students = dao.selectLikeTwo("李");
students.forEach(stu -> System.out.println("stu=" + stu));
session.close();
}
@Test
public void testPageHelper() {
SqlSession session = MyBatisUtil.getSqlSession();
//dao获取代理
StudentDao dao = session.getMapper(StudentDao.class);
//调用PageHelper方法
PageHelper.startPage(1,4);
List<Student> students = dao.selectAllStudents();
students.forEach(stu-> System.out.println("stu==="+stu));
session.close();
}
}