cgb2105-day17 傷城~ 2021-09-11 03:12 238阅读 0赞 ### 文章目录 ### * * 一,Mybatis * * \--1,概述 * \--2,入门案例 * * 项目结构 * 修改pom文件,添加mybatis的jar包依赖 * 创建核心配置文件,指定连接数据库的参数 * 创建映射文件,写SQL * 创建User类 * 修改核心配置文件,加入映射文件 * 创建测试类 * 测试 * \--3,练习 * * 修改映射文件 * 修改测试文件 * 三,其他知识点 * * \--1,别名 * \--2,xml的转义符号 * 四,动态SQL * * \--1,需求 * \--2,创建Dept类,用来完成ORM * \--3,创建DeptMapper.xml,用来写SQL * \--4,修改核心配置文件,引用新的映射文件 * \--5,创建测试文件 * \--6,修改成动态SQL * \--7,修改测试文件 ## 一,Mybatis ## ### –1,概述 ### 简化了JDBC操作数据库的过程,是一个优秀的ORM框架。 两个配置文件: 核心配置文件 – 用来配置数据库的连接的参数 映射文件 – 用来写SQL 两个核心的工具类: SqlSessionFactory – 会话工厂,用来产生会话 SqlSession – 会话,用来执行SQL ORM:对象关系映射 是指把表里字段的值 自动映射给 类里的属性 ### –2,入门案例 ### #### 项目结构 #### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70] #### 修改pom文件,添加mybatis的jar包依赖 #### <dependencies> <!--mybatis依赖包--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!--jdbc依赖包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> </dependencies> #### 创建核心配置文件,指定连接数据库的参数 #### <?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"> <!-- mybatis的核心配置文件 --> <configuration> <!--可以配置多个数据库连接的环境,使用default指定默认用哪个--> <environments default="test"> <!--配置了具体连接数据库的参数--> <environment id="test"> <!--使用的事务管理器--> <transactionManager type="JDBC"></transactionManager> <!--数据源:就是制定了数据库连接时的参数--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb2?characterEncoding=utf8&serverTimezone=Asia/Shanghai" /> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration> #### 创建映射文件,写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"> <!--这是映射文件,namespace用来作为文件的唯一标识 --> <mapper namespace="UserMapperNS"> <!--select标签表示要发起查询的SQL, id是SQL语句的唯一标识, resultType用来完成ORM,把表里的字段值 自动映射 类里的属性 --> <select id="getAll" resultType="cn.tedu.pojo.User"> select * from user </select> </mapper> #### 创建User类 #### package cn.tedu.pojo; //Mybatis自动完成ORM,把表里的字段的值 查到 封装给 类里的属性 //要求:属性名要和字段名一样 public class User { private Integer id; private String name; private String addr; private Integer age; //get set toString... 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 getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", addr='" + addr + '\'' + ", age=" + age + '}'; } } #### 修改核心配置文件,加入映射文件 #### <?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"> <!-- mybatis的核心配置文件 --> <configuration> <!--可以配置多个数据库连接的环境,使用default指定默认用哪个--> <environments default="test"> <!--配置了具体连接数据库的参数--> <environment id="test"> <!--使用的事务管理器--> <transactionManager type="JDBC"></transactionManager> <!--数据源:就是制定了数据库连接时的参数--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb2?characterEncoding=utf8&serverTimezone=Asia/Shanghai" /> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <mapper resource="UserMapper.xml"></mapper> </mappers> </configuration> #### 创建测试类 #### package cn.tedu.test; import cn.tedu.pojo.User; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; //测试 public class Test1 { @Test public void get() throws IOException { //1,读取核心配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2,创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3,创建会话 SqlSession session = factory.openSession(); //4,执行SQL // session.selectList("namespace的值.id的值");//唯一的定位了SQL List<User> list = session.selectList("UserMapperNS.getAll");//查询出多个结果 //5,处理结果 for(User u : list){ System.out.println(u); } } } #### 测试 #### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 1] ### –3,练习 ### #### 修改映射文件 #### <?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"> <!--这是映射文件,namespace用来作为文件的唯一标识 --> <mapper namespace="UserMapperNS"> <!--select标签表示要发起查询的SQL,id是SQL语句的唯一标识, resultType用来完成ORM,把表里的字段值 自动映射 类里的属性 --> <select id="getAll" resultType="cn.tedu.pojo.User"> select * from user </select> <!--查询id=1的user信息 select * from user where id=1 不要把参数1写死,太死板了 ${???} 动态获取执行SQL时传入的参数 --> <select id="getById" resultType="cn.tedu.pojo.User"> select * from user where id=${id} </select> <!--查询名字是xiongda的用户信息 select * from user where name=${name} 面试题:$ 和 #取值的区别? 都能获取参数的值,$只获取值本身不拼接单引号,#获取到值以后自动拼接单引号 $底层使用Statement不安全低效,#底层使用PreparedStatement高效安全SQL简单 --> <select id="getByName" resultType="cn.tedu.pojo.User"> select * from user where name=#{name} </select> <!--查询上海有几个员工 resultType是指查询的结果要交给谁处理, 结果可以是写一个类的路径,也可以写int string等 --> <select id="getByAddr" resultType="int"> select count(1) from user where addr=#{addr} </select> </mapper> #### 修改测试文件 #### package cn.tedu.test; import cn.tedu.pojo.User; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; //测试 public class Test1 { @Test public void get() throws IOException { //1,读取核心配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2,创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3,创建会话 SqlSession session = factory.openSession(); //4,执行SQL // session.selectList("namespace的值.id的值");//唯一的定位了SQL List<User> list = session.selectList("UserMapperNS.getAll");//查询出多个结果 //5,处理结果 for(User u : list){ System.out.println(u); } //测试 查询id=1的user信息 User u = session.selectOne("UserMapperNS.getById",2); System.out.println(u); //测试 查询名字是xiongda的用户信息 //selectList(1,2)--1是SQL定位的方式 2是SQL需要的参数 List<User> list2 = session.selectList("UserMapperNS.getByName","xiongda"); for (User uu : list2) { System.out.println(uu); } //测试 查询上海有几个员工 //selectOne(1,2)--1是SQL定位的方式 2是SQL需要的参数 int count = session.selectOne("UserMapperNS.getByAddr","上海"); System.out.println(count); } } ## 三,其他知识点 ## ### –1,别名 ### –设置别名:修改核心配置文件,加一个typeAliases标签 <!--用来设置别名 type是类的全路径 alias是以后要用的别名--> <typeAliases> <typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias> </typeAliases> –使用别名:在映射文件里,在resultType处直接使用别名 <select id="getAll" resultType="User"> select * from user </select> ### –2,xml的转义符号 ### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 2] ## 四,动态SQL ## ### –1,需求 ### 操作dept表 ### –2,创建Dept类,用来完成ORM ### package cn.tedu.pojo; //Mybatis自动完成ORM,把表里的字段的值 查到 封装给 类里的属性 //要求:属性名要和字段名一样 public class Dept { private Integer id; private String dname; private String loc; //get set tostring public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } @Override public String toString() { return "Dept{" + "id=" + id + ", dname='" + dname + '\'' + ", loc='" + loc + '\'' + '}'; } } ### –3,创建DeptMapper.xml,用来写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"> <!--这是映射文件,namespace用来作为文件的唯一标识--> <mapper namespace="DeptMapperNS"> <!--查询所有记录--> <select id="getAll" resultType="cn.tedu.pojo.Dept"> select * from dept </select> </mapper> ### –4,修改核心配置文件,引用新的映射文件 ### <!--引入映射文件--> <mappers> <mapper resource="UserMapper.xml"></mapper> <mapper resource="DeptMapper.xml"></mapper> </mappers> ### –5,创建测试文件 ### package cn.tedu.test; import cn.tedu.pojo.Dept; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class Test2 { @Test public void get() throws IOException { //1,读取核心配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2,创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3,创建会话 SqlSession session = factory.openSession(); //4,执行SQL List<Dept> list = session.selectList("DeptMapperNS.getAll"); for (Dept d : list) { System.out.println(d); } } } ### –6,修改成动态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"> <!--这是映射文件,namespace用来作为文件的唯一标识--> <mapper namespace="DeptMapperNS"> <!-- 1.提取SQL片段--> <sql id="names"> id,dname,loc </sql> <!--查询所有记录--> <select id="getAll" resultType="cn.tedu.pojo.Dept"> select /* 2.include引入SQL片段,refid指定SQL片段的id值*/ <include refid="names"></include> from dept </select> <!--查询id=1记录--> <select id="getById" resultType="cn.tedu.pojo.Dept"> select /* 2.include引入SQL片段,refid指定SQL片段的id值*/ <include refid="names"></include> from dept /* 使用if标签用来做判断,条件成立才执行SQL,不成里就不执行SQL*/ <if test="id != null"> where id = #{id} </if> </select> </mapper> ### –7,修改测试文件 ### package cn.tedu.test; import cn.tedu.pojo.Dept; 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.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class Test2 { @Test public void get() throws IOException { //1,读取核心配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2,创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3,创建会话 SqlSession session = factory.openSession(); //4,执行SQL List<Dept> list = session.selectList("DeptMapperNS.getAll"); for (Dept d : list) { System.out.println(d); } //selectOne(1,2)---1是SQL的定位2是SQL需要的参数 Dept d =session.selectOne("DeptMapperNS.getById",null); System.out.println(d); } } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70]: /images/20210911/9a39ed0bd3a14eafba498290d6519231.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 1]: /images/20210911/e600fa17df0c4c1f8a4ae067b252d488.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 2]: /images/20210911/e39a7633439f489ebd6db7922649c249.png
相关 cgb2105-day12 文章目录 一,Spring Boot \--1,创建Spring Boot项目 \--2,配置maven ╰半橙微兮°/ 2021年09月11日 03:10/ 0 赞/ 329 阅读
相关 cgb2105-day09 文章目录 一,js的语句 二,js的数组 三,js的函数 四,Maven \--1,创建Mave 心已赠人/ 2021年09月11日 03:04/ 0 赞/ 354 阅读
相关 cgb2105-day08 文章目录 一,模拟 服务器 解析浏览器发来的数据 二,CSS选择器 三,练习HTML和CSS \--1,创建c 谁践踏了优雅/ 2021年09月11日 03:04/ 0 赞/ 294 阅读
还没有评论,来说两句吧...