mybatis学习成长之路(一)
从小白开始学习,希望自己学习的过程可以帮助更多需要的人,参考网址:https://www.cnblogs.com/ysocean/p/7237499.html
1、mybatis的jar包下载地址:https://github.com/mybatis/mybatis-3/releases
2、浅谈mybatis # $区别:https://www.cnblogs.com/dato/p/7027949.html
一、mybatis项目讲解
1、项目架构:
2、主配置文件: mybatis-configuration.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 resource="properties/db.properties"></properties>
<!--类型命名 -->
<typeAliases>
<!--
<typeAlias alias="person" type="com.ys.bean.Person"></typeAlias>
-->
<package name="com.ys.bean"/>
</typeAliases> <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境
一、development:开发模式
二、work:工作模式-->
<environments default="development">
<!--id属性必须和上面的default一样 -->
<environment id="development">
<!--事务管理器
一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
-->
<transactionManager type="JDBC"/> <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 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> <mappers>
<!-- 注册personMapper.xml文件,
personMapper.xml位于com.ys.bean这个包下,所以resource写成com/ys/bean/personMapper.xml-->
<mapper resource="com/ys/bean/personMapper.xml"/>
</mappers>
</configuration>
3、数据库配置信息:db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo
username=root
password=ROOT
4、数据库实体类映射文件:personMapper.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.ys.bean.personMapper">
<!-- 根据 pid 查询 person 表中的数据
id:唯一标识符,此文件中的id值不能重复
resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
parameterType:参数类型,也就是查询条件的类型
-->
<select id="selectPersonById"
resultType="person" parameterType="int">
<!-- 这里和普通的sql 查询语句差不多,对于只有一个查询条件后面的 #{pid}表示占位符,里面不一定要写pid,写啥都可以,但是不要空着;如果有多个查询条件,则要写pojo类里面的属性 -->
select * from person where pid = #{pid}
</select> <!-- 查询person 表所有数据 -->
<select id="getAllPerson" resultType="person">
select * from person
</select> <!-- 根据id更新数据 -->
<update id="updatePersonById" parameterType="person">
update person set pname=#{pname},page=#{page} where pid = #{pid}
</update> <!-- 向 person 表插入一条数据 -->
<insert id="addPerson" parameterType="person" useGeneratedKeys="true" keyProperty="pid">
insert into person(pname,page) values(#{pname},#{page})
</insert> <!-- 根据 pid 删除数据 -->
<delete id="deletePersonById" parameterType="int">
delete from person where pid=#{pid}
</delete> <!-- 多表关联查询 -->
<!-- 1、映射学生对象的resultMap -->
<resultMap type="student" id="studentResultMap" >
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<!-- 关联映射 -->
<association property="clazz" column="class_id" javaType="com.ys.bean.Clazz" select="selectClazzWithId"></association>
</resultMap> <!-- 根据班级id查询班级 -->
<select id="selectClazzWithId" resultType="com.ys.bean.Clazz">
select * from tb_clazz where id =#{id}
</select> <!-- 查询所有学生信息 -->
<select id="selectStudent" resultMap="studentResultMap">
select * from tb_STUDENT;
</select> <!-- 2、映射班级对象的resultMap -->
<resultMap id="clazzresultMap" type="com.ys.bean.Clazz" >
<id property="id" column="id" />
<result property="code" column="code" />
<collection property="students" javaType="ArrayList" column="id" ofType="com.ys.bean.Student" select="selectStudentWithId"></collection>
</resultMap> <!-- 根据班级id查询学生 -->
<select id="selectStudentWithId" resultType="com.ys.bean.Student">
select * from tb_STUDENT where class_id = #{id}
</select> <!-- 查询所有班级信息 -->
<select id="selectClazz" resultMap="clazzresultMap">
select * from tb_clazz
</select> </mapper>
5、实体类
(1)、Clazz
package com.ys.bean; import java.util.List; public class Clazz {
private Integer id;
private String code;
private List<Student> students; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
} @Override
public String toString() {
return "Clazz [code=" + code + ", id=" + id + "]";
}
}
(2)、Person
package com.ys.bean; public class Person {
private int pid;
private String pname;
private int page; public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
+ "]";
}
}
(3)、Student
package com.ys.bean; public class Student {
private Integer id;
private String name;
private String sex;
private Integer age;
private Clazz clazz; 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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
} @Override
public String toString() {
return "Student [age=" + age + ", clazz=" + clazz.toString() + ", id=" + id
+ ", name=" + name + ", sex=" + sex + "]";
} }
6、测试代码
package com.ys.test; import java.io.InputStream;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import com.ys.bean.Clazz;
import com.ys.bean.Person;
import com.ys.bean.Student; public class MyBatisTest {
SqlSession session; @Before
public void beforeLoadXML(){
//加载 mybatis 配置文件
InputStream inputStream = MyBatisTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml");
//构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//根据 sqlSessionFactory 产生 session
session = sqlSessionFactory.openSession();
} //根据 pid 查询 person 表中的数据
@Test
public void testSelectById(){
//这个字符串有 personMapper.xml 文件中 两个部分构成
//<mapper namespace="com.ys.bean.personMapper"> 的 namespace 的值
//<select id="selectPersonById" > id 值
String statement = "com.ys.bean.personMapper"+".selectPersonById";
Person p = session.selectOne(statement, 1);
System.out.println(p);
session.close();
} //查询person 表所有数据
@Test
public void testGetAllPerson(){
String statement = "com.ys.bean.personMapper"+".getAllPerson";
List<Person> listPerson = session.selectList(statement);
System.out.println(listPerson);
session.close();
} //根据id更新数据
@Test
public void updateById(){
String statement = "com.ys.bean.personMapper.updatePersonById";
Person p = new Person();
p.setPid(1);
p.setPname("aaa");
p.setPage(11);
session.update(statement, p);
session.commit();
session.close();
} //向 person 表插入一条数据
@Test
public void addPerson(){
String statement = "com.ys.bean.personMapper.addPerson";
Person p = new Person();
//由于我们设置了主键的自增长机制,故这里不需要手动设置 pid 的值
//p.setPid(1);
p.setPname("addd");
p.setPage(22);
session.insert(statement, p);
session.commit();
session.close();
} //根据 pid 删除person 表中的数据
@Test
public void deletePersonById(){
String statement = "com.ys.bean.personMapper.deletePersonById";
session.delete(statement, 6);
session.commit();
session.close();
} @Test
public void selectStudent(){
String statement = "com.ys.bean.personMapper.selectStudent";
List<Student> student_list = session.selectList(statement);
for(Student stu:student_list){
System.out.println(stu.toString());
}
session.commit();
session.close();
} @Test
public void selectClazz(){
String statement = "com.ys.bean.personMapper.selectClazz";
List<Clazz> student_list = session.selectList(statement);
for(Clazz clazz:student_list){
System.out.println(clazz.toString());
List<Student> students = clazz.getStudents();
for(Student stu:students){
System.out.println(stu.getId()+" "+stu.getName()+" "+stu.getSex());
}
}
session.commit();
session.close();
} }
7、数据库表的设计以及插入语句
/**
CREATE table tb_clazz(
id int PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(18)
);
INSERT INTO tb_clazz(code) VALUES('J1601');
INSERT INTO tb_clazz(code) VALUES('J1602');
**/
SELECT * FROM tb_clazz /**
CREATE table tb_STUDENT(
id int PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18),
sex CHAR(3),
age INT,
class_id INT,
FOREIGN KEY(class_id) REFERENCES tb_clazz(id)
);
INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('jack','男',22,1);
INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('rose','女',18,1);
INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('tom','男',25,2);
INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('mary','女',20,2);
*/
SELECT * FROM tb_STUDENT
mybatis学习成长之路(一)的更多相关文章
- [转载]AxureRP学习成长之路
[编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...
- go 学习成长之路
一.go的搭建 二.初识go 三.混个脸熟--go 四.go的语言结构 五.go的常量与变量 六.go基础数据类型 七.go 条件语句 八.go 运算符 九.go条件语句switch 十.go循环语句 ...
- SringCloud学习成长之路 八 消息总线
Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...
- SpringCloud学习成长之路七 高可用配置中心
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...
- SpringCloud学习成长之路 六 cloud配置中心
一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...
- SpringCloud学习成长之路 五 路由器网关
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...
- SpringCloud学习成长之路三 服务消费者(Feign)
一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解. 它具有可插拔的注解特性,可使用Feign 注解和JAX-RS ...
- SpringCloud学习成长之路二 服务客户端(rest+ribbon)
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的. Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是f ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
随机推荐
- python全栈学习--day10(函数进阶)
一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...
- 有序的map LinkedHashMap
HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方.所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺 ...
- JavaWeb学习笔记七 事务
什么是事务?一件事情有n个组成单元 ,要么这n个组成单元同时成功,要么n个单元就同时失败.就是将n个组成单元放到一个事务中. mysql的事务 默认的事务:一条sql语句就是一个事务,默认就开启事务并 ...
- 《高级软件测试》web测试实践--12月30日记录
考完数学,我们正式开始web测试实践的作业,今天,我们主要进行了方案的选择和人员的分工.任务计划和安排如上图所示. 任务进展:完成题目选择和人员分工: 遇到问题:暂无: 下一步任务:完成软件评测.用户 ...
- cord-in-a-box 2.0 安装指南
[TOC] 这篇文章简要介绍了 Ciab2.0 的安装. 包括硬件, 软件环境的选择, Ciab2.0的实际部署架构, 安装过程等. 下面就先对 Ciab2.0 部署环境做简要介绍. 1. 概述 这一 ...
- 可空类型 Nullable<T>
Nullable<T> 内部实现了显示和隐式转换 显示转换: public static explicit operator T(T? value) { return value.Valu ...
- ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...
- Pyhon之Django中的Form组件
Pyhon之Django中的Form组件 新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面 ...
- 使用TortoiseSVN打Tag
参考了 https://blog.csdn.net/liuzx32/article/details/9123401. 值得注意的点是: 选择路径的时候,不要先点进去自己建好叶子节点路径再选择该路径,会 ...
- ios8新的api
self.navigationController.hidesBarsOnSwipe=YES; 滚动时隐藏导航栏