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/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
随机推荐
- 初始CSS3
初始CSS31.1.什么是CSSCSS全程为层叠样式表(Cascading Style Sheet),通常又称为风格样式表(Style Sheet)它是用来进行网页风格设计的.1.CSS在网页中的应用 ...
- C#,DataHelper,一个通用的帮助类,留个备份。
using System; using Newtonsoft.Json; using System.IO; using System.Text; namespace CarHailing.Base { ...
- MySQL_执行计划详细说明
1 简要说明 id 表格查询的顺序编号. 降序查看,id相同的从上到下查查看. id可以为null ,当table为( union ,m,n )类型的时候,id为null,这个时候,id的 ...
- Struts2学习笔记四 OGNL
OGNL,全称为Object-Graph Navigation Language(对象图表达语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,调用java对象的方法,同时能够自动 ...
- Beta开始前准备
Beta准备 1. 讨论组长是否重选的议题和结论. 经过讨论,我们认为,经过一段时间的磨合,现任组长是不需要更换的. 2. 下一阶段需要改进完善的功能. 增加关于征信的功能,贴近选题主题 美化界面,尽 ...
- 团队作业7——第二次项目冲刺(Beta版本12.05-12.07)
1.当天站立式会议照片 本次会议内容:1:每个人汇报自己完成的工作.2:组长分配各自要完成的任务. 2.每个人的工作 黄进勇:项目整合,后台代码. 李勇:前台界面优化. 何忠鹏:数据库模块. 郑希彬: ...
- nyoj 鸡兔同笼
鸡兔同笼 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知鸡和兔的总数量为n,总腿数为m.输入n和m,依次输出鸡和兔的数目,如果无解,则输出"No an ...
- JS 上传图片时实现预览
网页中一张图片可以这样显示: <img src="http://www.letuknowit.com/images/wg.png"/>也可以这样显示:<img s ...
- 从PRISM开始学WPF(九)交互(完结)
0x07交互 Notification xaml: <Window x:Class="UsingPopupWindowAction.Views.MainWindow" xml ...
- pygame事件之——控制物体(飞机)的移动
近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...