mybatis_CRUD的细节操作详解
mybatis基本环节的搭建https://blog.csdn.net/weixin_44954070/article/details/105618760观看这个mybatis_UserDao(没有实现类)包结构图实现SQL的CRUD代码mybatis_UserDao(有Impl)包类结构图UserDaoImpl实现类代码其中注意事项:如果是sqlSession.inse...
mybatis基本环节的搭建
https://blog.csdn.net/weixin_44954070/article/details/105618760
观看这个
mybatis_UserDao(没有实现类)
包结构图
实现SQL的CRUD代码
mybatis_UserDao(有Impl)
包类结构图
UserDaoImpl实现类代码
其中注意事项:
- 如果是
sqlSession.insert()、sqlSession.delete()、需要使用sqlSession来提交事务sqlSession.commit();否则这些事件会回滚,不会完成真正的业务逻辑。 - 这些语句传入的参数是:
com.xiao.dao.UserDao.saveUser=方法所在的接口位置+方法的名称
package com.xiao.dao.impl;
import com.xiao.dao.UserDao;
import com.xiao.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
/**
* @_PackageName:com.xiao.dao.impl
* @_ClassName:UserDaoImpl
* @_Description:
* @_Author:笑老二
* @_data 2020/4/19 13:14
*/
public class UserDaoImpl implements UserDao {
private SqlSessionFactory factory ;
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
}
public List<User> findAll() {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//传入类型
List<User> users = sqlSession.selectList("com.xiao.dao.UserDao.findAll");
sqlSession.close();
return users;
}
public void saveUser(User user) {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//传入类型
sqlSession.insert("com.xiao.dao.UserDao.saveUser",user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
public void delUser(Integer id) {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//调用方法执行
sqlSession.delete("com.xiao.dao.UserDao.delUser",id);
//提交事务
sqlSession.commit();
sqlSession.close();
}
public void updateUser(User user) {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//调用方法执行
sqlSession.update("com.xiao.dao.UserDao.updateUser",user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
public User findById(Integer id) {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//调用方法执行
User user = sqlSession.selectOne("com.xiao.dao.UserDao.findById", id);
//提交事务
sqlSession.commit();
sqlSession.close();
return user;
}
public List<User> findByLikeName(String name) {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//调用方法执行
List<User> users = sqlSession.selectList("com.xiao.dao.UserDao.findByLikeName",name);
//提交事务
sqlSession.commit();
sqlSession.close();
return users;
}
public int findByTotalCount() {
//创建sqlSession
SqlSession sqlSession = factory.openSession();
//调用方法执行
int total = sqlSession.selectOne("com.xiao.dao.UserDao.findByTotalCount");
//提交事务
sqlSession.commit();
sqlSession.close();
return total;
}
}
UserDao.xml配置
注意:
- #{} 与${}区别
#{}表示一个占位符号
通过#{}可以实现preparedStatement向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值,#{}括号中可以是 value 或其它名称。
${} 表示拼接 sql 串
通过 ${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。
<?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.xiao.dao.UserDao">
<!--查询所有-->
<select id="findAll" resultType="User">
select * from USER
</select>
<!--保存用户-->
<!--如何保存了用户后可以让user获取到mysql赋予的id -->
<insert id="saveUser" parameterType="com.xiao.domain.User">
<selectKey keyColumn="id" resultType="int" keyProperty="id" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert>
<!--删除用户-->
<select id="delUser" parameterType="Integer">
delete from user where id = #{id}
</select>
<!--更新用户-->
<select id="updateUser" parameterType="com.xiao.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</select>
<!--查询某个用户-->
<select id="findById" parameterType="int" resultType="com.xiao.domain.User">
select * from USER where id = #{id}
</select>
<!--模糊查询用户信息-->
<select id="findByLikeName" parameterType="String" resultType="com.xiao.domain.User">
<!--第一种方式-->
select * from user where username like #{username}
<!--第二种方式(不常用)-->
<!-- select * from user where username like '%${value}%' -->
</select>
<!--查询所有用户数-->
<select id="findByTotalCount" resultType="int">
select count(*) from USER
</select>
</mapper>
SqlMapperConfig.xml配置
- 所以
#{}是放在sql语句中充当传参的${}是放在加载配置文件充当传参数的 - 标签 <
typeAliases>(类型别名),<package name="com.xiao.domain"/>
properties标签配置
- 使用外置配置文件
这时dataSource就变成了
注意此时的:dataSource中的${****}要和配置文件名字一样
<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>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=1234
- mappers (映射器)
A.< mapper resource=" " />
使用相对于类路径的资源(URI)
如:< mapper resource="com/itheima/dao/IUserDao.xml" />
B.< mapper class=" " />
使用 mapper 接口类路径
如:< mapper class="com.itheima.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录下面
C.< package name=""/>
注册指定包下的所有 mapper 接口
如:< package name="cn.itcast.mybatis.mapper"/>
注意:此种方法要求 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">
<configuration>
<properties resource="database.properties">
</properties>
<!--typeAliases配置别名,它只能配置domain中的别名-->
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="hehe" type="com.xiao.domain.User"/>
<!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)-->
<package name="com.xiao.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<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 url="file:///E:/CodeSeniorJava/mybatis_04_CRUD_demo02/src/main/resources/com/xiao/dao/UserDao.xml"/>-->
<!--package标签能够用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource以及class了-->
<package name="com.xiao.dao"/>
</mappers>
</configuration>
当完成了以上的配置信息后
parameterType 配置参数
基 本类 型和 String 我 们可 以直接 写类型 名称 ,也 可以 使用包 名 . 类名的 方式 ,例如 :
java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,
而我们的是实体类并没有注册别名,所以必须写全限定类名。
resultType属性
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
我们在前面的 CRUD 案例中已经对此属性进行过应用了。
需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名(注册过指的是:你自己定义了或者像int、String这种类型)
同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
<!--查询某个用户-->
<select id="findById" parameterType="int" resultType="com.xiao.domain.User">
select * from USER where id = #{id}
</select>
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)