cgb2106-day18 港控/mmm° 2021-09-11 03:28 231阅读 0赞 ### 文章目录 ### * * 一,Mybatis入门案例 * * \--0,导入mybatis的jar包 * \--1,核心配置文件 * \--2,映射文件 * \--3,创建User类 * \--4,测试类 * 5,总结 * 二,Mybatis的练习 * * \--1,修改映射文件UserMapper.xml * \--2,修改测试类 * \--3,总结 * 三,优化配置 * * \--1,别名 * * 修改核心配置文件,加别名的代码 * 修改映射文件,使用别名 * 四,接口开发 * * \--1,概述 * \--2,使用 * * 需求:查询id=1的部门信息 * 创建Dept类 * 创建DeptMapper.xml * 修改核心配置文件,加了别名和引入Mapper * 测试 * \--3,改造 * * 创建接口 * 改造映射文件 * 改造测试类 * 总结 * 五,练习接口开发 * * \--1,修改 接口文件 * \--2,修改 映射文件 * \--3,修改 测试文件 * 六,动态SQL * * \--1,概述 * \--2,修改映射文件,实现动态SQL ## 一,Mybatis入门案例 ## ### –0,导入mybatis的jar包 ### <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cgb2106boot03</artifactId> <groupId>cn.tedu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>day17</artifactId> <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> </project> ### –1,核心配置文件 ### <?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> <!--environments可以配置多个数据库的连接信息,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/mybatisdb?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> ### –2,映射文件 ### <?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"> <!--这个文件是映射文件,写SQL的 namespace用来作为一个mapper.xml文件的唯一标识 --> <mapper namespace="userMapper"> <!-- 查id=1的用户信息 id是这条SQL的唯一标识 resultType的值用来封装查到的结果,ORM --> <select id="getById" resultType="cn.tedu.pojo.User"> select * from user where id=1 </select> </mapper> ### –3,创建User类 ### package cn.tedu.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; //注意:::属性的名 和 表里的字段名 必须一致,否则无法ORM @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class User { private Integer id; private String name; private String addr; private Integer age; } ### –4,测试类 ### package cn.tedu.test; 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; public class Test1 { @Test public void get() throws IOException { InputStream in = Resources.getResourceAsStream( "mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(in); SqlSession session = factory.openSession(); Object o = session.selectOne("userMapper.getById"); //User(id=1, name=hanmeimei, addr=北京, age=28) System.out.println(o); } } ### 5,总结 ### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70] ## 二,Mybatis的练习 ## ### –1,修改映射文件UserMapper.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"> <!--这个文件是映射文件,写SQL的 namespace用来作为一个mapper.xml文件的唯一标识 --> <mapper namespace="userMapper"> <!-- 面试题:SQL动态获取参数时,可以用#或者$ $ 底层用了低级传输器,可能发生SQL注入攻击,低效,不拼串,可能发生SQL语法错误 # 底层用了高级传输器,安全,高效,会自动拼接字符串 'xiongda' --> <!-- 查id=1的用户信息 id是这条SQL的唯一标识 resultType的值用来封装查到的结果,ORM --> <select id="getById" resultType="cn.tedu.pojo.User"> select * from user where id=${id} </select> <!-- 查询所有user --> <select id="getAll" resultType="cn.tedu.pojo.User"> select * from user </select> <!-- 查询hanmeimei的,固定语法#{??}用来解析SQL的参数--> <select id="getByName" resultType="cn.tedu.pojo.User"> select * from user where name=#{name} </select> </mapper> ### –2,修改测试类 ### 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 { //读取配置文件 InputStream in = Resources.getResourceAsStream( "mybatis-config.xml"); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(in); //开启会话,准备执行SQL SqlSession session = factory.openSession(); //定位SQL(namespace的值.id的值),并执行 //selectOne执行查询的SQL,并只会返回一个结果 Object o = session.selectOne("userMapper.getById",2); //User(id=1, name=hanmeimei, addr=北京, age=28) System.out.println(o); //定位SQL(namespace的值.id的值),并执行 //selectList执行查询的SQL,并返回多个结果 List<User> list = session.selectList("userMapper.getAll"); for(User u : list){ System.out.println(u); } //定位SQL(namespace的值.id的值),并执行,并给SQL传入参数 User u = session.selectOne( "userMapper.getByName","xiongda"); System.out.println(u); } } ### –3,总结 ### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 2] ## 三,优化配置 ## ### –1,别名 ### #### 修改核心配置文件,加别名的代码 #### <?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> <!--配置别名,给指定类起一个指定的别名--> <typeAliases> <typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias> </typeAliases> <!--environments可以配置多个数据库的连接信息,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> #### 修改映射文件,使用别名 #### <?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"> <!--这个文件是映射文件,写SQL的 namespace用来作为一个mapper.xml文件的唯一标识 --> <mapper namespace="userMapper"> <!-- 面试题:SQL动态获取参数时,可以用#或者$ $ 底层用了低级传输器,可能发生SQL注入攻击,低效,不拼串,可能发生SQL语法错误 # 底层用了高级传输器,安全,高效,会自动拼接字符串 'xiongda' --> <!-- 查id=1的用户信息 id是这条SQL的唯一标识 resultType的值用来封装查到的结果,ORM --> <select id="getById" resultType="User"> select * from user where id=${id} </select> <!-- 查询所有user --> <select id="getAll" resultType="User"> select * from user </select> <!-- 查询hanmeimei的,固定语法#{??}用来解析SQL的参数--> <select id="getByName" resultType="User"> select * from user where name=#{name} </select> </mapper> ## 四,接口开发 ## ### –1,概述 ### 为了优化定位SQL的字符串拼接过程, namespace的值.id的值 步骤: 0, 创建接口 创建方法 1, namespace的值 是接口的全路径 2, id的值 是接口里的方法名 ### –2,使用 ### #### 需求:查询id=1的部门信息 #### #### 创建Dept类 #### package cn.tedu.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; //完成ORM,属性名 必须和字段名 一致 @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class Dept { private Integer id ; private String dname ; private String loc ; } #### 创建DeptMapper.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="deptMapper"> <select id="getById" resultType="Dept"> select * from dept where id=1 </select> </mapper> #### 修改核心配置文件,加了别名和引入Mapper #### <?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> <!--配置别名,给指定类起一个指定的别名--> <typeAliases> <typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias> <typeAlias type="cn.tedu.pojo.Dept" alias="Dept"></typeAlias> </typeAliases> <!--environments可以配置多个数据库的连接信息,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> <mapper resource="DeptMapper.xml"></mapper> </mappers> </configuration> #### 测试 #### package cn.tedu.test; import cn.tedu.pojo.Dept; 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 { //读取配置文件 InputStream in = Resources.getResourceAsStream( "mybatis-config.xml"); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(in); //开启会话,准备执行SQL SqlSession session = factory.openSession(); //定位SQL(namespace的值.id的值),并执行 //selectOne执行查询的SQL,并只会返回一个结果 Object o = session.selectOne("userMapper.getById",2); //User(id=1, name=hanmeimei, addr=北京, age=28) System.out.println(o); //定位SQL(namespace的值.id的值),并执行 //selectList执行查询的SQL,并返回多个结果 List<User> list = session.selectList("userMapper.getAll"); for(User u : list){ System.out.println(u); } //定位SQL(namespace的值.id的值),并执行,并给SQL传入参数 User u = session.selectOne( "userMapper.getByName","xiongda"); System.out.println(u); //定位SQL(namespace的值.id的值) Dept d = session.selectOne("deptMapper.getById"); System.out.println(d); } } ### –3,改造 ### #### 创建接口 #### package cn.tedu.dao; import cn.tedu.pojo.Dept; //接口的全路径=映射文件中namespace的值 //接口的方法名=映射文件中id的值 public interface DeptMapper { Dept getById(); } #### 改造映射文件 #### <?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="cn.tedu.dao.DeptMapper"> <!--id=接口里的方法名--> <select id="getById" resultType="Dept"> select * from dept where id=1 </select> </mapper> #### 改造测试类 #### package cn.tedu.test; import cn.tedu.dao.DeptMapper; import cn.tedu.pojo.Dept; 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 { //读取配置文件 InputStream in = Resources.getResourceAsStream( "mybatis-config.xml"); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(in); //开启会话,准备执行SQL SqlSession session = factory.openSession(); //定位SQL(namespace的值.id的值),并执行 //selectOne执行查询的SQL,并只会返回一个结果 Object o = session.selectOne("userMapper.getById",2); //User(id=1, name=hanmeimei, addr=北京, age=28) System.out.println(o); //定位SQL(namespace的值.id的值),并执行 //selectList执行查询的SQL,并返回多个结果 List<User> list = session.selectList("userMapper.getAll"); for(User u : list){ System.out.println(u); } //定位SQL(namespace的值.id的值),并执行,并给SQL传入参数 User u = session.selectOne( "userMapper.getByName","xiongda"); System.out.println(u); //定位SQL(namespace的值.id的值) // Dept d = session.selectOne("deptMapper.getById"); // System.out.println(d); //获取了指定的接口 DeptMapper mapper = session.getMapper(DeptMapper.class); //调用接口里的方法 Dept dd = mapper.getById(); System.out.println(dd); } } #### 总结 #### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 3] ## 五,练习接口开发 ## ### –1,修改 接口文件 ### package cn.tedu.dao; import cn.tedu.pojo.Dept; import java.util.List; //接口的全路径=映射文件中namespace的值 //接口的方法名=映射文件中id的值 public interface DeptMapper { Dept getById(); //根据id查 List<Dept> getByName(String dname);//根据名字查 void save(Dept dept);//新增部门记录 } ### –2,修改 映射文件 ### <?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="cn.tedu.dao.DeptMapper"> <!--新增部门记录--> <insert id="save"> insert into dept values(#{id},#{dname},#{loc}) </insert> <select id="getByName" resultType="Dept"> select * from dept where dname=#{dname}; </select> <!--id=接口里的方法名--> <select id="getById" resultType="Dept"> select * from dept where id=1 </select> </mapper> ### –3,修改 测试文件 ### package cn.tedu.test; import cn.tedu.dao.DeptMapper; import cn.tedu.pojo.Dept; 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 { //读取配置文件 InputStream in = Resources.getResourceAsStream( "mybatis-config.xml"); //创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(in); //开启会话,准备执行SQL SqlSession session = factory.openSession(); //定位SQL(namespace的值.id的值),并执行 //selectOne执行查询的SQL,并只会返回一个结果 Object o = session.selectOne("userMapper.getById",2); //User(id=1, name=hanmeimei, addr=北京, age=28) System.out.println(o); //定位SQL(namespace的值.id的值),并执行 //selectList执行查询的SQL,并返回多个结果 List<User> list = session.selectList("userMapper.getAll"); for(User u : list){ System.out.println(u); } //定位SQL(namespace的值.id的值),并执行,并给SQL传入参数 User u = session.selectOne( "userMapper.getByName","xiongda"); System.out.println(u); //定位SQL(namespace的值.id的值) // Dept d = session.selectOne("deptMapper.getById"); // System.out.println(d); //获取了指定的接口 DeptMapper mapper = session.getMapper(DeptMapper.class); //调用接口里的方法 Dept dd = mapper.getById(); System.out.println(dd); List<Dept> ds = mapper.getByName("java教研部"); for (Dept d : ds) { System.out.println(d); } Dept dept = new Dept(); dept.setId(100).setDname("ios开发部").setLoc("上海"); mapper.save(dept); //mybatis不会自动提交事务,增删改需要自己提交事务 session.commit(); } } ## 六,动态SQL ## ### –1,概述 ### 利用mybatis框架提供一些标签,完成SQL的拼接 常用标签 : sql : 提取SQL片段 include : 引入指定的SQL片段 if : 用来判断,满足条件才拼接SQL ### –2,修改映射文件,实现动态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="cn.tedu.dao.DeptMapper"> <!-- 提取SQL片段,提高SQL片段复用性 --> <sql id="cols"> id,dname,loc </sql> <!-- 引用SQL片段 --> <select id="getByName" resultType="Dept"> select <include refid="cols"></include> from dept <if test="dname != null"> where dname=#{dname} </if> </select> <!--id=接口里的方法名--> <select id="getById" resultType="Dept"> select <include refid="cols"></include> from dept where id=1 </select> <!--新增部门记录--> <insert id="save"> insert into dept values(#{id},#{dname},#{loc}) </insert> </mapper> [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70]: /images/20210911/0dcd9e39ffc646e1af1f10842f6b58cc.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 1]: /images/20210911/135c2af629614cd897bfbb423e1bf96e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 2]: /images/20210911/c454a5edb08d4b41b5f07d3f229103ab.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MzI4NzY_size_16_color_FFFFFF_t_70 3]: /images/20210911/9573f1722f054dfa8966cd2c66773e41.png
相关 cgb2106-day18 文章目录 一,Mybatis入门案例 \--0,导入mybatis的jar包 \--1,核心配置文件 港控/mmm°/ 2021年09月11日 03:28/ 0 赞/ 232 阅读
相关 cgb2106-day16 文章目录 一,Lombok \--1,概述 \--2,使用步骤 1, 在IDEA里安装插 我会带着你远行/ 2021年09月11日 03:26/ 0 赞/ 289 阅读
相关 cgb2106-day12 文章目录 一,ElementUI的表单 \--1,测试 \--2,效果 二,Maven 「爱情、让人受尽委屈。」/ 2021年09月11日 03:24/ 0 赞/ 308 阅读
相关 cgb2106-day10 文章目录 一,Vue的基础语法 \--1,运算符 \--2,定义函数 \--3,Vue解析各种 快来打我*/ 2021年09月11日 03:24/ 0 赞/ 251 阅读
相关 cgb2106-day11 文章目录 一,Vue脚手架 \--1,执行以下命令安装并检验 \--2,创建Vue项目的过程 二,自定 朱雀/ 2021年09月11日 03:24/ 0 赞/ 318 阅读
相关 cgb2106-day08 文章目录 一,模拟服务器解析数据 二,实现CSS代码和HTML代码的分离 \--1,新建css文件 \ 古城微笑少年丶/ 2021年09月11日 03:22/ 0 赞/ 317 阅读
相关 cgb2106-day01 文章目录 一,数据库 \--1,概述 \--2,Mysql数据库的安装 \--3,Mysql数 系统管理员/ 2021年09月11日 03:14/ 0 赞/ 262 阅读
还没有评论,来说两句吧...