>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21339 个阅读者 刷新本主题
 * 贴子主题:  Mybatis用法详解:事务控制和多表查询 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-28 21:34:05     消息  查看  搜索  好友  邮件  复制  引用

                  
                            
mybatis的连接池
mybatis的事务控制及设计的方法
mybatis的多表查询
  一对多(多对一)
  多对多

      1、mybatis中的连接池以及事务控制   原理部分了解,应用部分会用
mybatis中连接池使用及分析
mybatis事务控制的分析
2、mybatis基于XML配置的动态SQL语句使用  会用即可
mappers配置文件中的几个标签:
  <if>
  <where>
  <foreach>
  <sql>
3、mybatis中的多表操作    掌握应用
一对多
一对一
多对多
--------------------------------------------------------------------------------
一.知识概要
1、连接池:
我们在实际开发中都会使用连接池。
因为它可以减少我们获取连接所消耗的时间。

2、mybatis中的连接池
mybatis连接池提供了3种方式的配置:
  配置的位置:
   主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
  type属性的取值:
   POOLED  采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
   UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
   JNDI  采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
     注意:如果不是web或者maven的war工程,是不能使用的。
     我们课程中使用的是tomcat服务器,采用连接池就是dbcp连接池。

3、mybatis中的事务
什么是事务
事务的四大特性ACID
不考虑隔离性会产生的3个问题
解决办法:四种隔离级别
  它是通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚
4、mybatis中的多表查询
表之间的关系有几种:
  一对多
  多对一
  一对一
  多对多
举例:
  用户和订单就是一对多
  订单和用户就是多对一
   一个用户可以下多个订单
   多个订单属于同一个用户
   人和身份证号就是一对一
   一个人只能有一个身份证号
   一个身份证号只能属于一个人
   老师和学生之间就是多对多
   一个学生可以被多个老师教过
   一个老师可以交多个学生
特例:
  如果拿出每一个订单,他都只能属于一个用户。
  所以Mybatis就把多对一看成了一对一。

mybatis中的多表查询:
  示例:用户和账户
   一个用户可以有多个账户
   一个账户只能属于一个用户(多个账户也可以属于同一个用户)
  步骤:
   1、建立两张表:用户表,账户表
    让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
   2、建立两个实体类:用户实体类和账户实体类
    让用户和账户的实体类能体现出来一对多的关系
   3、建立两个配置文件
    用户的配置文件
    账户的配置文件
   4、实现配置:
    当我们查询用户时,可以同时得到用户下所包含的账户信息
    当我们查询账户时,可以同时得到账户的所属用户信息
  
       二.mybatis中使用pooled配置连接池的原理分析
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
  
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
  
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
  
                                                                        三.mybatis的动态Sql语句

     动态抽取sql语句片段
    <!-- 了解的内容:抽取重复的sql语句-->
    <sql id="defaultUser">
        select *  from user
    </sql>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">
        <include refid="defaultUser"></include>
    </select>

                   动态SQL之if标签

      <select id="findUserByCondition" resultMap="userMap" parameterType="user">
        select * from user where 1=1
        < if test="userName != null">
          and username =  #{userName}
        </ if>
        < if test="userSex != null">
            and sex =  #{userSex}
        </ if>
    </select>

     动态sql之where标签

      <select id="findUserByCondition" resultMap="userMap" parameterType="user">
        select *  from user
        <where>
            < if test="userName != null">
                and username =  #{userName}
            </ if>
            < if test="userSex != null">
                and sex =  #{userSex}
            </ if>
        </where>
    </select>

     动态sql之foreach标签

    <!-- 根据queryvo中的Id集合实现查询用户列表 -->
    <select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
        <include refid="defaultUser"></include>
        <where>
            < if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </ if>
        </where>
    </select>

其中#{}中填入的变量必须与item中定义的变量一致

/* @Company http: [color=#009933]// www.ithiema.com
*/[/color]
public  class  QueryVo {

     private  User user;

     private List<Integer>  ids;

     public  User getUser() {
         return  user;
    }

     public  void  setUser(User user) {
         this.user =  user;
    }

     public List<Integer>  getIds() {
         return  ids;
    }

     public  void setIds(List<Integer>  ids) {
         this.ids =  ids;
    }
}

                        四.一对多

1. 让用户和账户的实体类能体现出来一对多的关系

   public  class Account  implements  Serializable {

     private  Integer id;
     private  Integer uid;
     private  Double money;

     // 从表实体应该包含一个主表实体的对象引用
     private  User user;

     public  User getUser() {
         return  user;
    }

     public  void  setUser(User user) {
         this.user =  user;
    }
   }

  public  class User  implements  Serializable {

     private  Integer id;
     private  String username;
     private  String address;
     private  String sex;
     private  Date birthday;

     // 一对多关系映射:主表实体应该包含从表实体的集合引用
     private List<Account>  accounts;

     public List<Account>  getAccounts() {
         return  accounts;
    }

     public  void setAccounts(List<Account>  accounts) {
         this.accounts =  accounts;
    }

2.修改映射配置文件的resultMap

     IAccountDao.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.itheima.dao.IAccountDao">

    <!-- 定义封装account和user的resultMap -->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!-- 一对一的关系映射:配置封装user的内容-->
        < association property="user" column="uid" javaType="user">
            <id property="id" column="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select u.*,a.id as aid,a.uid,a.money from account a , user u where u.id =  a.uid;
    </select>

    <!--查询所有账户同时包含用户名和地址信息-->
    <select id="findAllAccount" resultType="accountuser">
        select a.*,u.username,u.address from account a , user u where u.id =  a.uid;
    </select>

</mapper>

     IAccountDao

public  interface  IAccountDao {

     /**
     * 查询所有账户,同时还要获取到当前账户的所属用户信息
     *  @return
      */

    List<Account>  findAll();

     /**
     * 查询所有账户,并且带有用户名称和地址信息
     *  @return
      */

    List<AccountUser>  findAllAccount();
}

                                 IUserDao.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.itheima.dao.IUserDao">

    <!-- 定义User的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user对象中accounts集合的映射 -->
         <collection property="accounts" ofType="account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userAccountMap">
        select * from user u left outer join account a on u.id =  a.uid
    </select>

    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultType="user">
        select * from user where id =  #{uid}
    </select>

</mapper>

     IUserDao

public  interface  IUserDao {

     /**
     * 查询所有用户,同时获取到用户下所有账户的信息
     *  @return
      */

    List<User>  findAll();

         /**
     * 根据id查询用户信息
     *  @param  userId
     *  @return
      */

    User findById(Integer userId);

    }

      测试类

     测试 多对一

package  com.itheima.test;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  com.itheima.domain.AccountUser;
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.After;
import  org.junit.Before;
import  org.junit.Test;

import  java.io.InputStream;
import  java.util.List;

     public  class  AccountTest {

     private  InputStream in;
     private  SqlSession sqlSession;
     private  IAccountDao accountDao;

    @Before // 用于在测试方法执行之前执行
     public  void init() throws  Exception{
         // 1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml" );
         // 2.获取SqlSessionFactory
        SqlSessionFactory factory =  new  SqlSessionFactoryBuilder().build(in);
         // 3.获取SqlSession对象
        sqlSession = factory.openSession( true );
         // 4.获取dao的代理对象
        accountDao = sqlSession.getMapper(IAccountDao. class );
    }

    @After // 用于在测试方法执行之后执行
     public  void destroy() throws  Exception{
         // 提交事务
         //  sqlSession.commit();
         // 6.释放资源
         sqlSession.close();
        in.close();
    }

     /**
     * 测试查询所有
      */

    @Test
     public  void  testFindAll(){
        List<Account> accounts =  accountDao.findAll();
         for (Account account : accounts){
            System.out.println("--------每个account的信息------------" );
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }

         /**
     * 测试查询所有账户,同时包含用户名称和地址
      */

    @Test
     public  void  testFindAllAccountUser(){
        List<AccountUser> aus =  accountDao.findAllAccount();
         for (AccountUser au : aus){
            System.out.println(au);
        }
    }
}

     测试一对多

               @Test
     public  void  testFindAll(){
        List<User> users =  userDao.findAll();
         for (User user : users){
            System.out.println("-----每个用户的信息------" );
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
    }

          五、多对多

   示例:用户和角色
   一个用户可以有多个角色
   一个角色可以赋予多个用户
  步骤:
   4.1、建立两张表:用户表,角色表
    让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
   4.2、建立两个实体类:用户实体类和角色实体类
    让用户和角色的实体类能体现出来多对多的关系
     各自包含对方一个集合引用
   4.3、建立两个配置文件
    用户的配置文件
    角色的配置文件
   4.4、实现配置:
    当我们查询用户时,可以同时得到用户所包含的角色信息
    当我们查询角色时,可以同时得到角色的所赋予的用户信息

     实体类

package  com.itheima.domain;

import  java.io.Serializable;
import  java.util.List;

public  class Role  implements  Serializable {

     private  Integer roleId;
     private  String roleName;
     private  String roleDesc;

     // 多对多的关系映射:一个角色可以赋予多个用户
     private List<User>  users;

     public List<User>  getUsers() {
         return  users;
    }

     public  void setUsers(List<User>  users) {
         this.users =  users;
    }

     public  Integer getRoleId() {
         return  roleId;
    }

     public  void  setRoleId(Integer roleId) {
         this.roleId =  roleId;
    }

     public  String getRoleName() {
         return  roleName;
    }

     public  void  setRoleName(String roleName) {
         this.roleName =  roleName;
    }

     public  String getRoleDesc() {
         return  roleDesc;
    }

     public  void  setRoleDesc(String roleDesc) {
         this.roleDesc =  roleDesc;
    }

    @Override
     public  String toString() {
         return "Role{" +
                "roleId=" + roleId +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}' ;
    }
}

package  com.itheima.domain;

import  java.io.Serializable;
import  java.util.Date;
import  java.util.List;

     public  class User  implements  Serializable {

     private  Integer id;
     private  String username;
     private  String address;
     private  String sex;
     private  Date birthday;

     // 多对多的关系映射:一个用户可以具备多个角色
     private List<Role>  roles;

     public List<Role>  getRoles() {
         return  roles;
    }

     public  void setRoles(List<Role>  roles) {
         this.roles =  roles;
    }

     public  Integer getId() {
         return  id;
    }

     public  void  setId(Integer id) {
         this.id =  id;
    }

     public  String getUsername() {
         return  username;
    }

     public  void  setUsername(String username) {
         this.username =  username;
    }

     public  String getAddress() {
         return  address;
    }

     public  void  setAddress(String address) {
         this.address =  address;
    }

     public  String getSex() {
         return  sex;
    }

     public  void  setSex(String sex) {
         this.sex =  sex;
    }

     public  Date getBirthday() {
         return  birthday;
    }

     public  void  setBirthday(Date birthday) {
         this.birthday =  birthday;
    }

    @Override
     public  String toString() {
         return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}' ;
    }
}

     接口

     IRoleDao

public  interface  IRoleDao {

     /**
     * 查询所有角色
     *  @return
      */
    List<Role>  findAll();
}

     IUserDao

package  com.itheima.dao;

import  com.itheima.domain.User;

import  java.util.List;

     public  interface  IUserDao {

     /**
     * 查询所有用户,同时获取到用户下所有账户的信息
     *  @return
      */
    List<User>  findAll();

         /**
     * 根据id查询用户信息
     *  @param  userId
     *  @return
      */
    User findById(Integer userId);

    }

                                 映射文件(IRoleDao.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.itheima.dao.IRoleDao">

    <!--定义role表的ResultMap-->
    <resultMap id="roleMap" type="role">
        <id property="roleId" column="rid"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="users" ofType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </collection>
    </resultMap>

    <!--查询所有-->
    <select id="findAll" resultMap="roleMap">
       select u.*,r.id as rid,r.role_name,r.role_desc from role r
        left outer join user_role ur  on r.id = ur.rid
        left outer join user u on u.id = ur.uid
    </select>
</mapper>

                    IUserDao.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.itheima.dao.IUserDao">

    <!-- 定义User的resultMap-->
    <resultMap id="userMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置角色集合的映射 -->
        <collection property="roles" ofType="role">
            <id property="roleId" column=" rid"></id>
            <result property="roleName" column="role_name"></result>
            <result property="roleDesc" column="role_desc"></result>
        </collection>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">  
        select u.* ,r.id as rid,r.role_name,r.role_desc from user u
         left outer join user_role ur  on u.id =  ur.uid
         left outer join role r on r.id =  ur.rid
    
</select>

    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultType="user">
        select * from user where id =  #{uid}
    </select>

</mapper>

                    测试方法

     RoleTest

package  com.itheima.test;

import  com.itheima.dao.IRoleDao;
import  com.itheima.domain.Role;
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.After;
import  org.junit.Before;
import  org.junit.Test;

import  java.io.InputStream;
import  java.util.List;

     public  class  RoleTest {

     private  InputStream in;
     private  SqlSession sqlSession;
     private  IRoleDao roleDao;

    @Before // 用于在测试方法执行之前执行
     public  void init() throws  Exception{
         // 1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml" );
         // 2.获取SqlSessionFactory
        SqlSessionFactory factory =  new  SqlSessionFactoryBuilder().build(in);
         // 3.获取SqlSession对象
        sqlSession = factory.openSession( true );
         // 4.获取dao的代理对象
        roleDao = sqlSession.getMapper(IRoleDao. class );
    }

    @After // 用于在测试方法执行之后执行
     public  void destroy() throws  Exception{
         // 提交事务
         //  sqlSession.commit();
         // 6.释放资源
         sqlSession.close();
        in.close();
    }

     /**
     * 测试查询所有
      */

    @Test
     public  void  testFindAll(){
        List<Role> roles =  roleDao.findAll();
         for (Role role : roles){
            System.out.println("---每个角色的信息----" );
            System.out.println(role);
            System.out.println(role.getUsers());
        }
    }

}

[code]     UserTest

[code]package  com.itheima.test;

import  com.itheima.dao.IUserDao;
import  com.itheima.domain.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.After;
import  org.junit.Before;
import  org.junit.Test;

import  java.io.InputStream;
import  java.util.List;

     public  class  UserTest {

     private  InputStream in;
     private  SqlSession sqlSession;
     private  IUserDao userDao;

    @Before // 用于在测试方法执行之前执行
     public  void init() throws  Exception{
         // 1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml" );
         // 2.获取SqlSessionFactory
        SqlSessionFactory factory =  new  SqlSessionFactoryBuilder().build(in);
         // 3.获取SqlSession对象
        sqlSession = factory.openSession( true );
         // 4.获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao. class );
    }

    @After // 用于在测试方法执行之后执行
     public  void destroy() throws  Exception{
         // 提交事务
         //  sqlSession.commit();
         // 6.释放资源
         sqlSession.close();
        in.close();
    }

     /**
     * 测试查询所有
      */

    @Test
     public  void  testFindAll(){
        List<User> users =  userDao.findAll();
         for (User user : users){
            System.out.println("-----每个用户的信息------" );
            System.out.println(user);
            System.out.println(user.getRoles());
        }
    }

}

           六、JNDI

     点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小              

JNDI数据源

JNDI:Java Naming and Directory Interface。是SUN公司推出的一套规范,属于JavaEE技术之一。目的是模仿windows系统中的注册表。

             在服务器中注册数据源:

1.1 创建Maven的war工程并导入坐标          

<dependencies>

    <dependency>

      <groupId>org.mybatis</groupId>

      <artifactId>mybatis</artifactId>

      <version>3.4.5</version>

    </dependency>

    <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId>

      <version>5.1.6</version>

    </dependency>

            <dependency>

      <groupId>log4j</groupId>

      <artifactId>log4j</artifactId>

      <version>1.2.12</version>

    </dependency>

            <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.10</version>

    </dependency>

          <dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>servlet-api</artifactId>

    <version>2.5</version>

  </dependency>

  <dependency>

    <groupId>javax.servlet.jsp</groupId>

    <artifactId>jsp-api</artifactId>

    <version>2.0</version>

  </dependency>

</dependencies>

1.2 在webapp文件下创建META-INF目录

1.3 在META-INF目录中建立一个名为context.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>

<Context>

<!--

<Resource

name="jdbc/eesy_mybatis"                  数据源的名称

type="javax.sql.DataSource"                   数据源类型

auth="Container"                        数据源提供者

maxActive="20"                        
最大活动数

maxWait="10000"                            最大等待时间

maxIdle="5"                               最大空闲数

username="root"                            用户名

password="1234"                            密码

driverClassName="com.mysql.jdbc.Driver"          驱动类

url="jdbc:mysql://localhost:3306/eesy_mybatis" 连接url字符串

/>

-->

<Resource

name="jdbc/eesy_mybatis"

type="javax.sql.DataSource"

auth="Container"

maxActive="20"

maxWait="10000"

maxIdle="5"

username="root"

password="1234"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/eesy_mybatis"

/>

</Context>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ----------------------------
原文链接:https://www.cnblogs.com/lsk-130602/p/12193124.html

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-29 10:58:48 重新编辑]
  Java面向对象编程-->输入与输出(下)
  JavaWeb开发-->JSP中使用JavaBean(Ⅰ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->CSS过渡和动画
  Vue3开发-->Vue CLI脚手架工具
  超全Redis命令总结,墙裂建议收藏,说不定就用上了呢
  MyBatis+Spring 事务管理
  Mybatis-plus大数据量流式查询
  微服务的拆分方式
  @Service注解的使用
  重新理解响应式编程
  @SessionAttribute和@SessionAttributes的区别
  深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客...
  什么是Redis?Redis的各项功能解决了哪些问题?
  解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制
  国内 Java 开发者必备的两个神器:Maven国内镜像和Spring国内...
  Java软件架构设计七大原则
  浓缩精华的架构演进过程,经验总结,值得收藏!
  Spring入门基础知识
  什么是CXF
  更多...
 IPIP: 已设置保密
树形列表:   
[url=http://www.zhent.com]... nihaota 2022-10-28 20:10:48
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。