• MyBatis——xml的优化及动态代理的实现


    目录

    一,MyBatis框架常见类和接口

    1,Resources类

    2,SqlSessionFactory接口:创建工厂

    3,SqlSession接口:获取sqlSession

    二,为实体类注册别名(优化SqlMapConfig.xml)

    使用 typeAliases 标签,进行对pojo实体类的注册别名

    1,单个注册

    2,批量注册

    三,设置日志输出

    四,动态代理存在意义:

    MyBatis动态代理的7个行为规范 

    五,动态代理的实现

    1,创建数据库

    2,完善maven工程目录,刷新可视化

    3,修改pom.xml文件,添加依赖

    4,添加jdbc.properties数据库配置文件到resources目录文件

    5,新建并配置SqlMapConfig.xml文件

    6,添加实体类pojo

    7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下

    8,新建UserMapper.xml文件,完成增删改查功能

    9,添加测试功能。

    六,mapper注册优化

    单个注册

    批量注册:

    七,#{} 和 ${}的区别

    一),#{}:

    二), ${}:


    一,MyBatis框架常见类和接口

    1,Resources类

    解析SqlMapConfig.xml核心文件,将解析的文件保存在IO输入流中;

    1. //1,使用文件流,读取核心配置文件SqlMapConfig.xml
    2. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

    2,SqlSessionFactory接口:创建工厂

    1. //2,创建sqlSessionFactory,bean工厂
    2. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

    3,SqlSession接口:获取sqlSession

    1. //3,获取sqlSession
    2. SqlSession sqlSession = factory.openSession();

    二,为实体类注册别名(优化SqlMapConfig.xml)

    使用 typeAliases 标签,进行对pojo实体类的注册别名

    1,单个注册

    1. <typeAliases>
    2. <typeAlias type="com.pojo.Stu" alias="stu">typeAlias>
    3. typeAliases>

    2,批量注册

    1. <typeAliases>
    2. <package name="com.pojo"/>
    3. typeAliases>

    三,设置日志输出

    1. <settings>
    2. <setting name="logImpl" value="STDOUT_LOGGING"/>
    3. settings>

    设置完底层代码输出的后的打印的日志

    四,动态代理存在意义:

    在三层架构中,业务逻辑层要通过接口来实现数据库的访问,动态代理可以实现

    MyBatis动态代理的7个行为规范 

    1,UsersMapper.xml与UsersMapper.java的接口必须同一个目录下。

    2,UsersMapper.xml与UsersMapper.java的文件名一致,后缀不管。

    3,UsersMapper.xml文件中的标签的id值 与 UsersMapper.java的接口中的方法名称保持一致。(接口中的方法与id一致,就可以通过接口的名称找到对应的id)

    4,UsersMapper.xml文件中的parameterType()标签中的参数类型 与 UserMapper.java接口中的参数类型完全一致

    5,UsersMapper.xml文件中的resultType()标签中的值类型 与 UserMapper.java接口中的返回值的类型完全一致

    6,UsersMapper.xml文件中的 nameSpace 标签中的值类型 与 UserMapper.java接口的完全限定名(即从当前java.main路劲触发的全路径名)。如:com.yyk.UserMapper.java

    7,在SqlMapConfig.xml文件中注册mapper文件时,使用class= UserMapper.java接口的完全限定名。

    五,动态代理的实现

    1,创建数据库

    1. use ssm;
    2. create table if not EXISTS USER(
    3. id int(11) not null auto_increment,
    4. username VARCHAR(32) COMMENT '用户名',
    5. birthday date DEFAULT null COMMENT '生日',
    6. sex char(2) DEFAULT null COMMENT '性别',
    7. address VARCHAR(256) DEFAULT NULL COMMENT '地址',
    8. PRIMARY KEY (id)
    9. );
    10. INSERT into USER(username,birthday,sex,address) VALUES('张三','2000-01-08','1','陕西');
    11. INSERT into USER(username,birthday,sex,address) VALUES('李飒','2001-02-02','2','北京');
    12. INSERT into USER(username,birthday,sex,address) VALUES('王五','2000-4-06','1','南京');
    13. INSERT into USER(username,birthday,sex,address) VALUES('老六','2000-08-09','1','上海');
    14. INSERT into USER(username,birthday,sex,address) VALUES('钱七','1999-03-01','2','广州');
    15. INSERT into USER(username,birthday,sex,address) VALUES('王三','1990-12-12','1','深圳');
    16. INSERT into USER(username,birthday,sex,address) VALUES('李八','1999-12-02','1','深圳');
    17. INSERT into USER(username,birthday,sex,address) VALUES('王七','1999-02-12','1','深圳');
    18. SELECT * FROM User;

    2,完善maven工程目录,刷新可视化

     

    3,修改pom.xml文件,添加依赖

    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>3.5.6version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <version>5.1.32version>
    10. dependency>
    1. <build>
    2. <resources>
    3. <resource>
    4. <directory>src/main/javadirectory>
    5. <includes>
    6. <include>**/*.xmlinclude>
    7. <include>**/*.propertiesinclude>
    8. includes>
    9. resource>
    10. <resource>
    11. <directory>src/main/resourcesdirectory>
    12. <includes>
    13. <include>**/*.xmlinclude>
    14. <include>**/*.propertiesinclude>
    15. includes>
    16. resource>
    17. resources>
    18. build>

    4,添加jdbc.properties数据库配置文件到resources目录文件

    1. jdbc.driverClassName=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/ssm
    3. jdbc.username=root
    4. jdbc.password=123456

    5,新建并配置SqlMapConfig.xml文件

    1. configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    3. <configuration>
    4. <properties resource="jdbc.properties">properties>
    5. <settings>
    6. <setting name="logImpl" value="STDOUT_LOGGING"/>
    7. settings>
    8. <typeAliases>
    9. <package name="com.mybatis.pojo"/>
    10. typeAliases>
    11. <environments default="development">
    12. <environment id="development">
    13. <transactionManager type="JDBC">transactionManager>
    14. <dataSource type="POOLED">
    15. <property name="driver" value="${jdbc.driverClassName}"/>
    16. <property name="url" value="${jdbc.url}"/>
    17. <property name="username" value="${jdbc.username}"/>
    18. <property name="password" value="${jdbc.password}"/>
    19. dataSource>
    20. environment>
    21. environments>
    22. <mappers>
    23. <mapper class="com.mybatis.mapper.UserMapper">mapper>
    24. mappers>
    25. configuration>

    6,添加实体类pojo

    1. public class User {
    2. private Integer id;
    3. private String userName;
    4. private Date birthday;
    5. private String sex;
    6. private String address;

    7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下

    <mapper namespace="com.mybatis.mapper.UserMapper">

     

    遵循动态代理的规范

    8,新建UserMapper.xml文件,完成增删改查功能

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.mybatis.mapper.UserMapper">
    5. <select id="getAll" resultType="user">
    6. select id,username,birthday,sex,address
    7. from user;
    8. select>
    9. <select id="getID" parameterType="int" resultType="user">
    10. select id,username,birthday,sex,address
    11. from user
    12. where id = #{id};
    13. select>
    14. <select id="getByName" parameterType="string" resultType="user">
    15. select id,username,birthday,sex,address
    16. from user
    17. where username like '%${name}%';
    18. select>
    19. <update id="update" parameterType="user">
    20. update user set username = #{userName},birthday = #{birthday},
    21. sex = #{sex},address = #{address} where id = #{id};
    22. update>
    23. <insert id="insert" parameterType="user" >
    24. insert into user (username,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address});
    25. insert>
    26. <delete id="delete" parameterType="int">
    27. delete from user where id = #{id};
    28. delete>
    29. mapper>

    9,添加测试功能。

    1. package com.mybatis;
    2. import com.mybatis.mapper.UserMapper;
    3. import com.mybatis.pojo.User;
    4. import org.apache.ibatis.io.Resources;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    8. import org.junit.After;
    9. import org.junit.Before;
    10. import org.junit.Test;
    11. import java.io.IOException;
    12. import java.io.InputStream;
    13. import java.text.ParseException;
    14. import java.text.SimpleDateFormat;
    15. import java.util.Date;
    16. import java.util.List;
    17. public class MyTest {
    18. //数据连接对象
    19. SqlSession sqlSession;
    20. //接口代理对象
    21. UserMapper userMapper;
    22. //设置日期转换
    23. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    24. @Before
    25. public void before() throws IOException {
    26. //1,加载SQlMapConfig核心配置文件
    27. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    28. //2,创建SQlSessionFactory()
    29. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    30. //3,获取sqlSession
    31. sqlSession = factory.openSession();
    32. //4,取出动态代理的对象,
    33. // 完成接口中方法的调用,实则是调用xml文件中向对应的标签的功能
    34. //标签的id对应的是接口中的方法名,这是mybatis的动态代理规范。
    35. userMapper = sqlSession.getMapper(UserMapper.class);
    36. System.out.println("代理对象的类型"+userMapper.getClass());
    37. }
    38. @After
    39. public void close(){
    40. //5,释放资源
    41. sqlSession.close();
    42. }
    43. @Test
    44. public void testGetAll(){
    45. //5,执行sql
    46. List users = userMapper.getAll();
    47. users.forEach(user -> System.out.println(user));
    48. }
    49. @Test
    50. public void testGetID(){
    51. User user = userMapper.getID(2);
    52. System.out.println(user);
    53. }
    54. //有问题
    55. @Test
    56. public void testGetByName(){
    57. List users = userMapper.getByName("j");
    58. users.forEach(user -> System.out.println(user));
    59. }
    60. @Test
    61. public void testInsert() throws ParseException {
    62. int insert = userMapper.insert(new User("jj", format.parse("2000-01-03"), "1", "安徽"));
    63. sqlSession.commit();
    64. System.out.println("************" + insert + "***********");
    65. }
    66. @Test
    67. public void testUpdate() throws ParseException {
    68. User user = new User(1,"一二",format.parse("2012-03-08"),"1","BJ");
    69. userMapper.update(user);
    70. sqlSession.commit();
    71. }
    72. @Test
    73. public void testDelete(){
    74. userMapper.delete(1);
    75. sqlSession.commit();
    76. }
    77. }

    六,mapper注册优化

    单个注册

    1. <mappers>
    2. <mapper class="com.mybatis.mapper.UserMapper">mapper>
    3. mappers>

    批量注册:

    1. <mappers>
    2. <package name="com.mybatis.mapper"/>
    3. mappers>

    七,#{} 和 ${}的区别

    一),#{}:

    是对非字符串拼接的占位符,{}中可以任意写,但是如果占位符是对象类型,则{}内必须是对象的属性名称,使用#{}是安全的,可以防止sql注入

    #{}底层使用的PrepareStatement,防止安全注入

    1,#{}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则#{}内随便写。

    因为:

     

     

    2,#{}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写

     

    二), ${}:

    90%进行的字符串拼接或字符串替换。如果传入的基本数据类型,${}里面必须是value,如果是对象类型,则传入对象名称。${}可以替换列名或列表,存在sql注入问题

    ${}类型看  parameterType() 的内容

    1,${}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则${}内随便写。

    2,${}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写

    优化模糊查询,以后都采用这种方式,解决sql注入

    1. <select id="getByName" parameterType="string" resultType="user">
    2. select id,username,birthday,sex,address
    3. from user
    4. -- where username like '%${name}%';
    5. where username like concat('%',#{name},'%');
    6. select>

    3,字串替换

    使用${}来替换查询的列名

    1. //按指定参数模糊查询
    2. List getByPara(@Param("columnName") String columnName, @Param("columnValue") String columnValue);

     如果方法在参数个数  大于1个  mapper.xml文件中的parameterType参数类型不写

    1. <select id="getByPara" resultType="user">
    2. select id,username,birthday,sex,address
    3. from user
    4. where ${columnName} like concat('%',#{columnValue},'%');
    5. select>
    1. public void testGetByPara(){
    2. List users = userMapper.getByPara("id", "2");
    3. users.forEach((user -> System.out.println(user)));
    4. }

     

  • 相关阅读:
    【IVI】15.1.7 系统稳定性优化篇(LMKD 八)通过填充内存触发lmkd查杀
    nginx基础使用二————动静分离、UR Rewrite和防盗链
    无人机动力系统详解
    基于ZYNQ-7000的AI加速器设计之Python网络编程(TCP协议)
    现代化个人博客系统 ModStartBlog v5.5.0 附件归档优化,管理角色备注
    TSDB - VictoriaMetrics 技术原理浅析
    Kubernetes 文档 / 概念 / 服务、负载均衡和联网 / 网络策略
    《算法系列》之 数组
    RHCE之路iptables,firewalld,富规则
    WordPress关联S3后图片未指定alt属性无法上传
  • 原文地址:https://blog.csdn.net/qq_52655865/article/details/126329709