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/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
随机推荐
- Android中文API (109) —— SimpleCursorTreeAdapter
前言 本章内容是android.widget.SimpleCursorTreeAdapter,版本为Android 3.0 r1,翻译来自"深夜未眠",含示例代码,欢迎访问它的博客 ...
- IDEA2017注册码
1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...
- 转发—Android开发常用的插件及工具
作者:蓝之风 出处:http://www.cnblogs.com/vaiyanzi/ Android开发常用的插件及工具 1.GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没 ...
- Notepad++使用vs2015主题教程
前言: 最近几天都在用Notepad++,所以想换个看得舒服点的主题. 发现vs2015的主题颜色特别好看.所以就查了一下有没有大佬做了这样的Notepad++主题. 结果是有的. 正文: notep ...
- 201621123040《Java程序设计》第八周学习总结
1.本周学习总结 2.书面作业 2.1ArrayList代码分析 2.1.1解释ArrayList的contains源代码 ArrayList.contain()方法通过调用indexOf()来判断元 ...
- centos7下搭建sentry错误日志服务器
1. docker 安装(方法一) 1.确保yum packages 是最新的 $ sudo yum update 2.添加yum repo $ sudo tee /etc/yum.repos.d/d ...
- git中级技能
中级技能(上) 一.实验说明 从本节开始,我们会介绍一些中级和高级的用法,这些用法很少用到,前面三节的内容已经满足了日常工作需要,从本节开始的内容可以简单了解,需要的时候再 ...
- RadioButton的图标改变大小(TextView也适用)
RadioButton的图标大小并没有相应的布局参数,本文通过自定义属性的方式自定义RadioButton,实现控制图片大小. 本文要点: 自定义属性的使用. 解决RadioButton文字上.下.左 ...
- Linq 巧用 Max,Sum
IList<, , , , , }; var sum1 = intList.Sum(s => { == ) { return s; } ; }); Console.WriteLine(&q ...
- JAVA 中的 反射
CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...