MyBatis3.x整理:(二)MyBatis拓展

本文详细介绍了MyBatis框架的高级应用技巧,包括别名配置、属性配置处理、结果集映射、Mapper组件使用、参数处理、注解开发等核心功能。深入探讨了如何优化SQL元素查找方式,实现参数类型检查,以及使用动态代理实现Mapper接口的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.别名配置

1.修改mybatis-config.xml文件

   方法一:直接给某一个类起别名:

<typeAlias type="com.bigfong.mybatis.hello.User" alias="User"/>

  方法二:给一个包(包含子包)中所有类起别名

<package name="com.bigfong.mybatis.hello" />

方法三:使用@Alias注解设置类的别名

 

2.mapper的xml文件

<select id="get"  resultType="User">
   select id,name,salary from t_user where id = #{id}
</select>

resultType不需全限名

系统自带别名

以下是常见的Java类型内建的相应的类型别名,它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理 

 

二.属性配置处理

添加db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=2

全局配置文件

<!-- 从classpath的根路径加载属性 -->
<properties resource="db.properties"/>

<!-- 1.配置数据库环境 -->
	<environments default="dev">
		<!-- 开发环境:在以后事务管理器和连接池都是交给spring框架来管理的 -->
		<environment id="dev">
			<!-- [1]事务管理器 -->
			<transactionManager type="JDBC" />
			<!-- [2]数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>

 

三.结果集映射

解决“当数据表列名和对象的属性名不对应时的问题

<resultMap id="BaseResultMap" type="User" >
		<!-- 功能和result一样,如果是主键建议使用id元素,提升性能 -->
		<id column="u_id" property="id"/>
		<!-- 匹配 对象中的哪一个属性对应表中的哪一个列-->
		<result column="u_name" property="name"/>
		<result column="u_salary" property="salary"/>
</resultMap>



<select id="listAll" resultMap="BaseResultMap">
	select id,name,salary from t_user
</select>

resultMap元素定义了一个ORM的具体映射规则

type属性:最终返回的对象类型

id:该结果映射名称,这个名称就是在get或listAll中使用的resultMap对应的ID

子元素result:把结果集中的哪一个列设置到对象中的哪一个属性上,处理变通列

子元素id:和result功能相同,处理主键时使用id元素提升性能,处理主键列

 

四.Mapper组件

使用namespace.id的方式去找到SQL元素的方式有几个问题:

1.namespace.id使用的是String类型,一旦编写错误,只有等到运行代码才能报错

2.传入的实际参数类型不能被检查

3.每个操作的代码模板类似

 

Mapper接口

使用Mapper组件

1.创建一个Mapper接口(类似DAO接口),接口要求

1)这个接口的全限定名称---对应的Mapper文件的namespace;

2)这个接口中的方法和Mapper文件中的Sql元素一一对应

    [1].方法名字对应SQL元素的id;

    [2]方法的参数类型对应SQL元素中定义的paramterType类型(一般不写) 

    [3]方法的返回类型对应SQL元素中定义的resultType/resultMap类型;

2.创建SqlSession

3.通过SqlSession.getMapper(XxxMapper.class)方法得到一个Mapper对象

4.调用Mapper对象上的方法完成对象的CRUD;

 

UserMapper接口

public interface UserMapper {
    void save(User u);

    void update(User u);

    void delete(Long id);

    User get(Long id);

    List<User> listAll();
}

 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">
  
<mapper namespace="com.bigfong.mybatis.mapintf.domain.mapper.UserMapper">
	
	<!-- 添加  -->
	<insert id="save" useGeneratedKeys="true" keyProperty="id" >
		insert into  t_user (name,salary) values (#{name},#{salary})
	</insert>
	<!-- 更新 -->
	<update id="update" >
		update t_user set name = #{name},salary = #{salary} where id = #{id}
	</update>
	<!-- 删除 -->
	<delete id="delete">
		delete from t_user where id = #{id}
	</delete>
	
	<select id="get"  resultType="User">
		select id,name,salary from t_user where id = #{id}
	</select>
	
	<select id="listAll" resultType="User">
		select id,name,salary from t_user
	</select>
	
</mapper>

测试代码

// 查询单个
    //Mapper接口的原理:动态代理,代理对像为com.sun.proxy.$Proxy9
    @Test
    void testGet() throws Exception {
        SqlSession session = MybatisUtil.getSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        System.out.println(userMapper.getClass());
        User user = userMapper.get(1L);
        session.close();
        System.out.println(user);
    }
    
 // 查询所有
    @Test
    void testListAll() throws Exception {
        SqlSession session = MybatisUtil.getSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        List<User> list = userMapper.listAll();
        session.close();
        System.out.println(list);
    }

 

Mapper接口的原理:动态代理

 

五.参数处理

 1.封装POJO和Map

如果在Mybatis中传入多个参数,此时可以把参数封装到POJO对象或Map中,在Mapper文件的SQL中#{}里面引用的就是对象属性或Map里面的key.

MyBatis在#{}中参数流程:

1)会去POJO对象中,按照属性名或者Map的Key去查询

2)如果找不到,尝试直接把方法的实际参数作为查询参数值

 2.Param注解

如果要在Mapper接口上的一个方法中添加多个参数,此时一定要在每个参数前使用@Param标签。

原理:MyBatis底层自动把这些参数包装成一个Map对象,@Param中的value就会作为这个Map的key,对应的参数值,就会作为这个Key的value

Mapper接口

User login(@Param("username") String username,@Param("password") String password);

Mapper文件

<select id="login">
    select id,username,password from t_user 
    where username=#{username} and password=#{password}
</select>

3.集合/数组

当传递一个List对象或数组对象参数给MyBatis时,MyBatis会自动把它包装到一个Map中,此时List对象会以list作为key,数组对象会以array作为key,也可以使用Param注解设置key名

 

六.使用注解开发

public interface UserMapper {
    /*
    <insert id="save" useGeneratedKeys="true" keyProperty="id" >
                insert into  t_user (name,salary) values (#{name},#{salary})
        </insert>
     */
    @Insert("insert into  t_user (name,salary) values (#{name},#{salary})")
    @Options(useGeneratedKeys=true,keyProperty="id")
    void save(User u);

    /*
     <update id="update" >
            update t_user set name = #{name},salary = #{salary} where id = #{id}
    </update>
     */
    @Update("update t_user set name = #{name},salary = #{salary} where id = #{id}")
    void update(User u);

    /*
     <delete id="delete">
                delete from t_user where id = #{id}
        </delete>
     */
    @Delete("delete from t_user where id = #{id}")
    void delete(Long id);

    /*
     <select id="get"  resultType="User">
            select id,name,salary from t_user where id = #{id}
    </select> 
     */
    @Select("select id as u_id,name as u_name,salary as u_salary from t_user where id = #{id}")
    @Results(id="BaseResultMap",value= {
            @Result(column="u_id",property="id"),
            @Result(column="u_name",property="name"),
            @Result(column="u_salary",property="salary"),
    })
    User get(Long id);

    /*
     <select id="listAll" resultType="User">
                select id,name,salary from t_user
        </select>
     */
    @Select("select id,name,salary from t_user")
    @ResultType(User.class)
    List<User> listAll();
}

 

七.其他

1.#和$

 1).通过#和$都可以获取对象中的属性

2).区别:

     [1].使用#传递的参数会先转换为占位符,无论传递是什么类型数据都会带一个单引号

     [2]使用$传递的参数,直接把值作为SQL语句的一部分

使用$容易导致SQL注入问题----->使用#更安全

但是在做排序的时候,不能使用带引号的数据 

结论 

如果需要设置占位符参数全部使用#,也就是SQL中可以使用?的地方

如果需要拼接成SQL的一部分使用$,比如排序 

 

源码下载

上一篇: MyBatis3.x整理:(一)MyBatis基础

下一篇: MyBatis3.x整理:(三)动态SQL​​​​​​​

 

<think>好的,我现在需要帮用户制定一个从零开始学习Python和Java的详细计划,并提供资源推荐。首先,用户之前已经询问过关于选择编程语言的问题,我给了他们对比分析,现在他们明确要同时学Python和Java,所以需要更具体的指导。 用户的需求是从零开始,所以必须从基础讲起,分阶段安排。用户可能没有编程经验,所以计划要循序渐进,避免让他们感到压力过大。同时,用户需要详细的资源推荐和学习路径,这可能包括书籍、在线课程、练习平台等。 首先,我应该考虑如何合理安排学习顺序。Python和Java虽然都是编程语言,但语法和用途不同。Python更易上手,适合初学者建立编程思维,而Java的面向对象和严谨性对打基础也有帮助。可能需要建议先学Python基础,再转Java,或者交替学习,但需要避免混淆。 接下来,分阶段设计。比如,第一阶段打好Python基础,第阶段学习Java基础,然后逐步深入各自的进阶内容。同时要强调项目实践,因为实习需要动手能力。每个阶段都需要明确的学习目标、时间安排和资源推荐。 资源方面,需要选择适合初学者的资源。Python推荐官方文档、《Python Crash Course》和Codecademy的课程。Java方面,推荐《Head First Java》和MOOC课程。同时,练习平台如LeetCode和Codewars对巩固基础很重要。 还需要考虑项目实践。用户之前提到过实习需要项目经验,所以每个阶段结束时都应该有小项目,比如Python的爬虫、数据分析,Java的Web应用等。GitHub的使用也很重要,指导用户如何展示项目。 另外,用户可能需要学习工具和环境配置,比如安装Python、Java JDK、IDE(PyCharm、IntelliJ IDEA),以及版本控制工具Git。这些也应该包含在计划中,可能作为预备阶段的内容。 还要注意时间安排,用户可能需要一个大概的时间线,比如每周投入多少小时,每个阶段持续多久。例如,Python基础4周,Java基础6周,这样用户能有清晰的进度概念。 最后,复合技能和持续学习的建议也很重要,比如学习数据结构与算法、数据库、框架等。同时,推荐参与开源项目和社区,帮助用户拓展网络和获取最新资讯。 需要确保回答结构清晰,分点列出,资源部分给出链接或具体名称,计划要详细但不过于复杂,让用户容易跟随。同时提醒用户避免同时学两门语言可能带来的混淆,建议打好一门基础后再学另一门,但用户明确要同时学,所以需要合理安排避免冲突。</think>我将为你设计一个从零开始同时学习Python+Java的 **6个月详细学习计划**,包含 **每日学习路径**、**必学知识点清单** 和 **精选资源导航**。以下是分阶段实施方案: --- ### **一、预备阶段(1周)** **目标**:搭建开发环境 + 理解基础概念 1. **工具准备**: - Python环境:安装Anaconda(含Jupyter Notebook) - Java环境:安装JDK17 + IntelliJ IDEA(社区版) - 通用工具:Git + GitHub账号 + VS Code 2. **基础认知**: - 理解`变量/数据类型/运算符`的通用概念 - 掌握`命令行操作`(Windows: PowerShell,Mac/Linux: Terminal) - 学习使用[菜鸟教程](https://www.runoob.com/)的代码在线编辑器 --- ### **、Python基础阶段(第2-5周)** **学习路径**: ```python # Python核心语法结构 条件判断 → 循环结构 → 函数定义 → 面向对象 → 异常处理 ``` 1. **必学内容**: - 数据结构:列表推导式(如 `[x**2 for x in range(10)]`) - 文件操作:`with open() as f`上下文管理 - 模块使用:`datetime`, `json`, `os`标准库 2. **实践项目**: - 豆瓣电影TOP250数据爬取(使用`requests`+`BeautifulSoup`) - 学生成绩管理系统(控制台版本) 3. **推荐资源**: - 书籍:《Python Crash Course》([电子版](https://ehmatthes.github.io/pcc/)) - 视频:[廖雪峰Python教程](https://www.liaoxuefeng.com/wiki/1016959663602400) - 练习平台:[Codecademy Python](https://www.codecademy.com/learn/learn-python-3) --- ### **三、Java基础阶段(第6-10周)** **学习路径**: ```java // Java核心语法结构 类与对象 → 继承与多态 → 接口与抽象类 → 集合框架 → 泛型 ``` 1. **必学内容**: - JVM内存模型:栈/堆/方法区的关系 - 异常处理:`try-with-resources`语法 - 集合框架:`ArrayList` vs `LinkedList`性能对比 2. **实践项目**: - 银行账户管理系统(使用`Scanner`+`File`) - 多线程下载器(`ExecutorService`实现) 3. **推荐资源**: - 书籍:《Head First Java(第三版)》 - 视频:[浙江大学Java MOOC](https://www.icourse163.org/course/ZJU-1001541001) - 练习平台:[CodingBat Java](https://codingbat.com/java) --- ### **四、双语言进阶阶段(第11-16周)** **Python与Java并行学习框架**: ```                 Python                     Java                ───────                   ─────── 数据库       SQLAlchemy             JDBC + MyBatis Web开发      Flask/Django          Spring Boot 并发编程      asyncio               CompletableFuture ``` 1. **重点突破**: - Python: - 掌握装饰器(如`@staticmethod`) - 理解GIL锁对多线程的影响 - Java: - 掌握Lambda表达式 - 理解JVM垃圾回收机制 2. **实战项目**: - Python:Django搭建博客系统(含REST API) - Java:Spring Boot实现电商后台 3. **资源整合**: - [Python官方文档](https://docs.python.org/3/) - [Java官方教程](https://docs.oracle.com/javase/tutorial/) --- ### **五、项目冲刺阶段(第17-24周)** **复合型项目开发**: 1. **全栈项目**: - 前端:HTML/CSS + Vue.js - 后端:Python Flask + Java Spring Boot混合架构 - 部署:Docker容器化 + Nginx负载均衡 2. **开源贡献**: - 参与Apache开源项目(如[Apache Commons](https://commons.apache.org/)) - 在GitHub发布个人工具库(至少200星标) 3. **简历准备**: - 技术栈描述模板: $$ \text{技术栈} = \begin{cases} \text{Python: Flask/Django/Scrapy} \\ \text{Java: Spring Cloud/MyBatis} \end{cases} $$ --- ### **六、学习效率工具包** 1. **知识管理**: - 笔记工具:Obsidian(使用双向链接整理知识点) - 代码片段:Gist保存常用代码模板 2. **社区支持**: - 问答平台:[Stack Overflow](https://stackoverflow.com/) - 中文论坛:[V2EX](https://www.v2ex.com/)技术节点 3. **求职辅助**: - 算法刷题:[LeetCode](https://leetcode.cn/)(按企业高频题排序) - 模拟面试:[Pramp](https://www.pramp.com/)(免费技术面试练习) --- **关键提示**:建议采用 **3:2时间分配法**(Python学习3天,Java学习2天循环),每周保证20小时有效编码时间。遇到难点时,优先在[知乎专题](https://www.zhihu.com/search?type=content&q=python%20java)查找深度解析。坚持6个月后,可达到 **中级开发实习生** 的竞争力水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值