Mybatis学习总结(二)---dao层开发
程序员文章站
2022-07-12 22:34:53
...
mybatis和hibernate本质区别和应用场景
hibernate:标准ORM框架(对象关系映射),不需要程序写sql,sql语句自动生成了。
应用场景:适用于需求变化不多的中小型项目,比如后台管理系统erp、orm、oa…
mybatis:专注sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis也可以实现映射(输入、输出映射)。
应用场景:适用于需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本,高回报作为技术选型的。
在dao层中创建UserMapper接口
package cn.mybatis.dao;
import cn.mybatis.model.User;
public interface UserMapper {
public User findUserById(int id)throws Exception;
public void insertUser(User user)throws Exception;
public void deleteUser(int id)throws Exception;
public void updateUser(User user)throws Exception;
}
接口中方法名和UserMapper.xml中statement id一致
接口中传入参数类型和和UserMapper.xml中statement的parameterType一致
接口中方法返回值和和UserMapper.xml中statement的resultType一致
以下是UserMapper.xml代码
其中namespace等于UserMapper接口地址
<?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="cn.mybatis.dao.UserMapper" >
<!-- 在mapper中配置很多sql语句 -->
<!-- id:标志映射文件中的sql
将sql语句封装到mappedStatement对象中,所以id称为statement的id -->
<!-- parameterType绑定输入参数类型,这里指定int型 -->
<!-- #{}表示占位符 -->
<!-- #{id}其中id表示接收输入的参数,参数名称就是id,如果输入参数为简单类型,#{}中参数名可以任意,可以是value或其他 -->
<!-- resultType指定sql的输出结果所映射的java对象类型,select指定resultType表示单条记录映射成的java对象 -->
<select id="findUserById" parameterType="int" resultType="User">
select * from user where id = #{value}
</select>
<!-- 根据用户名模糊查询用户信息,可能返回多条 -->
<!-- resultType:指定单条记录映射成的java对象类型 -->
<!-- ${}表示拼接sql串,将接收到的参数内容不加任何修饰,拼接在sql中 -->
<!-- 使用${}拼接sql,容易引起sql注入,不安全 -->
<!-- ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.mybatis.model.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加用户
parameterType:指定输入参数类型是pojo
#{}中指定pojo属性名,接收到pojo的属性值,mybatis通过OGNL获得对象的属性值 -->
<insert id="insertUser" parameterType="cn.mybatis.model.User">
<!-- 将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID:得到刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到的主键值设置到parameterType指定对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(id,username,password,age) value(#{id},#{username},#{password},#{age})
</insert>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
<!-- 更新用户
需要传入用户的id
需要传入用户的更新信息
parameterType指定对象必须包含id否则更新全表
#{id}:从输入的user对象中获得id属性
-->
<update id="updateUser" parameterType="cn.mybatis.model.User">
update user set username = #{username},password = #{password},age = #{age}
where id = #{id}
</update>
</mapper>
创建数据库链接属性文件db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useSSL=false
jdbc.username=root
jdbc.password=888888
在SqlMapConfig.xml中引入db.properties,并读取其中的属性值
<?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">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties">
<!-- 在properties标签中还可以配置一些属性名和属性值 -->
</properties>
<!-- 定义别名 -->
<typeAliases>
<!-- 批量定义别名,指定报名,mybatis自动扫描该包,别名就是类名(首字母大写或小写均可) -->
<package name="cn.mybatis.model"/>
</typeAliases>
<!-- 和spring整合后enviroment配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 ,由mybatis管理-->
<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>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
下一篇一对一映射:https://blog.csdn.net/aKuang_JH/article/details/82765030
上一篇: CF Round 87
下一篇: mybatis注解——CRUD