Mybatis学习
学习了Mybatis,觉得这个东西是真的方便,站在巨人的肩上都能感受到无穷的能量呀。
完整项目:http://oz1w76hwf.bkt.clouddn.com/java/mybatisMyBatis.7z
搭建项目
使用Maven搭建好项目
项目结构图
环境准备
安装mybatis
在pom.xml中加入maven依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
同时增加java连接数据库依赖
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
后面需要到的日志log4j依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
数据库表结构和数据
-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
`cid` int primary key auto_increment,
`cname` varchar(10)
)
-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES (1, '软件工程一班');
INSERT INTO `classes` VALUES (2, '软件工程二班');
INSERT INTO `classes` VALUES (3, '软件工程三班');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int primary key auto_increment,
`sname` varchar(10),
`spwd` varchar(50),
`cid` int
)
--增加外键约束
alter table student add constraint sc foreign key(cid) references classes(cid)
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '文章', 'a', 1);
INSERT INTO `student` VALUES (2, '沪旦铭', 'a', 1);
INSERT INTO `student` VALUES (3, '马伊琍', 'a', 1);
INSERT INTO `student` VALUES (7, '佟大为', 'a', 2);
INSERT INTO `student` VALUES (8, '谢娜', 'a', 2);
INSERT INTO `student` VALUES (9, '王力宏', 'a', 3);
JavaBean
Student类
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = 3626150075724553325L;
private Integer sid;
private String sname;
private String spwd;
private Integer cid; //班级编号
//省略get set方法
}
Classes类
import java.io.Serializable;
import java.util.List;
public class Classes implements Serializable{
private static final long serialVersionUID = 5527884450588186839L;
private Integer cid;
private String cname;
private List<Student> student;
//省略get set方法
}
配置Mybatis
使用框架,就是搭建一系列的配置文件
mybatis-config.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>
<!-- 配置执行顺序 -->
<!--
properties 属性
settings 设置
typeAliases 类型别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
-->
<properties resource="config.properties">
<!--
注意: 如果加上一下两句表示数据库的连接名称为root 密码为a 这个可以不填写则mybatis会去config.properties读取
<property name="username" value="root"/>
<property name="password" value="a"/>
-->
</properties>
<!-- 配置了properties则数据源连接可以用 ${username} 格式动态加载数据 -->
<settings>
<!-- 设置缓存等相关 -->
<setting name="cacheEnabled" value="true"/>
<!-- 设置日志 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 类的别名 同时也支持包扫描 -->
<typeAliases>
<!-- 一个一个类指明 <typeAlias alias="Author" type="domain.blog.Author"/> -->
<!-- 使用包扫描 -->
<package name="com.wy.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 数据库连接信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 有三种方式 xml.文件,类,file: -->
<mappers>
<mapper resource="com/wy/bean/StudentMapper.xml"/>
<mapper resource="com/wy/bean/ClassesMapper.xml"/>
</mappers>
</configuration>
config.properties
数据库配置文件
#dateSource propertie
url =jdbc:mysql://localhost:3306/mybatis
driver =com.mysql.jdbc.Driver
username =root
password =
log4j.properties
日志配置
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
# MyBatis logging configuration...
log4j.logger.com.wy.bean.StudentMapper=TRACE
log4j.logger.com.wy.bean.ClassesMapper=TRACE
Mapper XML 映射文件
StudentMapper.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.wy.bean.StudentMapper">
<!-- 根据名字查找学生 -->
<!-- 注意:在mybatis-config.xml没有配置类别名的时候需要写上类的全路径 com.wy.bean.Student-->
<select id="selectStudentBySname" resultType="Student" parameterType="Student">
select * from student where sname = #{sname}
</select>
<!-- 查找所有学生 返回的是一个list集合 -->
<select id="selectAllStudent" resultType="Student">
select * from student
</select>
</mapper>
ClassesMapper.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.wy.bean.ClassesMapper">
<!-- 开启缓存 -->
<cache/>
<!-- 查找所有班级 -->
<select id="selectAllClasses" resultType="Classes">
select * from classes
</select>
<resultMap id="studentResultMap" type="Classes">
<id property="cid" column="cid" />
<result property="cname" column="cname"/>
<!-- 如果是一对多关系则用collection 一个班级对应对个学生-->
<collection property="student" ofType="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap>
<!-- 根据班级名查找所有学生 -->
<!--
因为查到的结果集并不是只有班级,还有多个学生,因此需要在classes类中写上学生
-->
<select id="selectStudentByClassesCName" parameterType="Classes" resultMap="studentResultMap">
select classes.cid as cid,cname,sid,sname from student
left join classes on student.cid = classes.cid
where cname = #{cname}
</select>
<!--
<association property="student" javaType="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</association>
-->
</mapper>
使用Junit测试
package com.wy.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.junit.Test;
import com.wy.bean.Classes;
import com.wy.bean.Student;
/**
* 测试sqlsession是否创建成果
* @author 沪旦铭
*
*/
public class MyTest {
static SqlSession sqlSession ;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立Sqlsession
sqlSession = sqlSessionFactory.openSession();
}
@Test
public void selectStudentBySname() throws IOException {
//通过sqlSession去执行sqlQurey
//参数说明: xml配置文件.执行的id
Student s = new Student();
s.setSname("沪旦铭");
Student stu = sqlSession.selectOne("com.wy.bean.StudentMapper.selectStudentBySname",s);
System.out.println( stu.getSname() );
/*
DEBUG [main] - ==> Preparing: select * from student where sname = ?
DEBUG [main] - ==> Parameters: 沪旦铭(String)
TRACE [main] - <== Columns: sid, sname, spwd, cid
TRACE [main] - <== Row: 2, 沪旦铭, a, 1
DEBUG [main] - <== Total: 1
沪旦铭
*/
}
//查找所有学生信息
@Test
public void selectAllStudent() {
List<Student> list = sqlSession.selectList("com.wy.bean.StudentMapper.selectAllStudent");
for(Student stu:list) {
System.out.println( stu.getSname() );
}
/*
DEBUG [main] - ==> Preparing: select * from student
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Columns: sid, sname, spwd, cid
TRACE [main] - <== Row: 1, 文章, a, 1
TRACE [main] - <== Row: 2, 沪旦铭, a, 1
TRACE [main] - <== Row: 3, 马伊琍, a, 1
TRACE [main] - <== Row: 7, 佟大为, a, 2
TRACE [main] - <== Row: 8, 谢娜, a, 2
TRACE [main] - <== Row: 9, 王力宏, a, 3
DEBUG [main] - <== Total: 6
文章
沪旦铭
马伊琍
佟大为
谢娜
王力宏
*/
}
//查询所有的班级
@Test
public void selectAllClasses() {
List<Classes> list = sqlSession.selectList("com.wy.bean.ClassesMapper.selectAllClasses");
for(Classes c:list) {
System.out.println( c.getCname() );
}
/*
DEBUG [main] - Cache Hit Ratio [com.wy.bean.ClassesMapper]: 0.0
DEBUG [main] - ==> Preparing: select * from classes
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Columns: cid, cname
TRACE [main] - <== Row: 1, 软件工程一班
TRACE [main] - <== Row: 2, 软件工程二班
TRACE [main] - <== Row: 3, 软件工程三班
DEBUG [main] - <== Total: 3
软件工程一班
软件工程二班
软件工程三班
*/
}
//根据班级名查找所有的学生
@Test
public void selectStudentByClassesCName() {
Classes c = new Classes();
c.setCname("软件工程一班");
Classes cla = sqlSession.selectOne("com.wy.bean.ClassesMapper.selectStudentByClassesCName",c);
System.out.println( cla.getCname() );
List<Student> stus = cla.getStudent();
for(Student s:stus) {
System.out.println( s.getSid()+"\t"+s.getSname() );
}
/*
DEBUG [main] - Cache Hit Ratio [com.wy.bean.ClassesMapper]: 0.0
DEBUG [main] - ==> Preparing: select classes.cid as cid,cname,sid,sname from student left join classes on student.cid = classes.cid where cname = ?
DEBUG [main] - ==> Parameters: 软件工程一班(String)
TRACE [main] - <== Columns: cid, cname, sid, sname
TRACE [main] - <== Row: 1, 软件工程一班, 1, 文章
TRACE [main] - <== Row: 1, 软件工程一班, 2, 沪旦铭
TRACE [main] - <== Row: 1, 软件工程一班, 3, 马伊琍
DEBUG [main] - <== Total: 3
软件工程一班
1 文章
2 沪旦铭
3 马伊琍
*/
}
}
更详细的学习参考官方文档即可!
MyBatis官方中文网站