当前位置: 首页 > ai >正文

[ Mybatis ] 框架搭建与数据访问

目录

1.定义:

2.Mybatis搭建

(1)MySQL创建表,创建项目

(2)导入MyBatis jar包和mysql数据库驱动包​编辑

(3)创建mybatis核心配置文件(数据库连接 全局配置...)

(4)在model包,创建数据表对应的模型类(与数据库中的表对应,用来封装admin信息)

 (5)在dao包中,创建一个接口(admin),定义操作方法

(6)在mappers中,创建一个SQL映射文件(AdminMapper.xml),写所需的SQL操作语句

(7)在test中,读取配置文件,创建连接会话对象,获得接口代理对象,调整方法执行SQL

 3. 单表查询

     (1). 单个参数

     (2). 多个参数

  方法一: 用@Param(" ")绑定

  方法二: 传对象,相当于把包含所有属性的对象传进去

4. 添加 删除 修改


1.定义:

        MyBatis是一款优秀的持久层(数据访问层)框架 . 原本是Apache软件基金会(非盈利组织)的一个开源项目iBatis,2010年移到Google,iBatis从3.0正式更名为MyBatis. MyBatis封装了JDBC中基本的接口, 避免了JDBC代码手动设置参数和手动获取结果集操作,同时还可以使用XML或注解方式,将数据库中的记录映射Java对象 ,是一种ORM实现(ORM ObjectRelational Mapping 对象关系映射

2.Mybatis搭建

(1)MySQL创建表,创建项目

-- 创建数据库
create database mybatisdb charset utf8
-- 创建数据表
create table admin(
id int primary key auto_increment ,
account int ,
password int,
gender char(1),
reg_time datetime 
)

(2)入MyBatis jar包和mysql数据库驱动包

(3)创建mybatis核心配置文件(数据库连接 全局配置...)

     a. 在项目名下创建resource目录. 选中,右键设置为资源目录

     b. 在resource目录创建File文件,文件名 mybatis.xml

     c. 将下列代码复制到mybatis.xml中,并进行修改

<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="自己补全...?
serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="自己密码"/>
</dataSource>
</environment>
</environments>
</configuration>

     d. 注册SQL映射文件

 <mapper resource="mappers/AdminMapper.xml"/>   

设置全局配置:

 <settings>
       <!--在控制台打印日志的功能-->
       <setting name="logImpl" value="STDOUT_LOGGING"/>

       <!--将标准数据库列名与java标准属性名自动映射,不一样时使用as起别名-->

       <setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>

(4)在model,创建数据表对应的模型(与数据库中的表对应,用来封装admin信息)

package mybatispro.model;import java.util.Date;//模型类,与数据库中的表是对应的,用来封装用户admin信息
public class Admin {private int id ;private String account;private String password;private String gender;private Date regtime;private int adminAge;public int getAdminAge() {return adminAge;}public void setAdminAge(int adminAge) {this.adminAge = adminAge;}public  Admin(){System.out.println("Admin 无参构造方法");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getRegtime() {return regtime;}public void setRegtime(Date regtime) {this.regtime = regtime;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", account='" + account + '\'' +", password='" + password + '\'' +", gender='" + gender + '\'' +", regtime=" + regtime +", adminAge=" + adminAge +'}';}
}

   (5)在dao包中,创建一个接口(admin),定义操作方法

    注意: dao(dao accsess object)数据访问对象 数据持久(访问)层    

package mybatispro.dao;import mybatispro.model.Admin;import java.util.ArrayList;//定义功能--接口
public interface AdminDao {//在接口中定义一个通过ID查询admin的抽象方法(不可以重载)Admin findAdminById(int id);//Admin login(@Param("acc") String account ,@Param("pwd") String password);ArrayList<Admin> findAdmins();int findAdminCount();Admin login(Admin admin);//相当于把整个参数传进去int insertAdmin(Admin admin);int updateAdmin(Admin admin);int deleteAdmin(int id);
}

(6)在mappers中,创建一个SQL映射文件(AdminMapper.xml),写所需的SQL操作语句

<?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">
<!-- 专门写SQL语句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><!--    接口中方法的名字         参数类型             返回值类型      --><select id="findAdminById" parameterType="int" resultType="mybatispro.model.Admin">select id,account,password,gender,reg_time from admin where id = #{id}</select>
</mapper>

(7)在test中,读取配置文件,创建连接会话对象,获得接口代理对象,调整方法执行SQL

package mybatispro.test;import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
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 java.io.IOException;
import java.io.Reader;public class Test1 {public static void main(String[] args) throws IOException {//1.读取配置文件Reader reader = Resources.getResourceAsReader("mybatis.xml");//2创建SqlSessionFactory,用来创建SqlSession,SqlSession类似jdbc中的ConnectionSqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);// sqlSessionFactory在项目中只需要创建一个对象即可,里面读取到配置文件的信息//3.创建SqlSession 与数据库会话对象,美誉数据库交互一次,我们就创建一个SQLsession对象,就是一个链接通道,用完关闭SqlSession sqlSession = sessionFactory.openSession();//4.获得接口的代理对象AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);//代理对象会调用与接口对应的SQL映射文件中的方法System.out.println(admin);sqlSession.close();}
}

     SqlSessionFactory接口 : 用创建SqlSession,类似jdbc中的Connection,会存在于整个过程中

     SqlSession接口 : 创建与数据库连接会话,封装了对数据库操作的方法,用完需要关闭

注意: 1. mybatis查询时,可以做到自动结果映射

         2. 可以创建一个MybatisUtil类, 封装读取配置文件,创建连接会话对象等处理

         3. 查询个参数(id)和个参数(account,password) 写法上有差异

 3. 单表查询

     (1). 单个参数

package mybatispro.util;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 java.io.IOException;
import java.io.Reader;public class MybatisUtil {/*将读取配置文件,创建连接会话对象等处理封装成一个工具类,在使用的时候调用即可*/static SqlSessionFactory  sessionFactory=null;//静态代码块在类第一次加载时,自动执行一次static{Reader reader = null;//读取配置文件try {reader = Resources.getResourceAsReader("mybatis.xml");//2创建SqlSessionFactory,用来创建SqlSession,SqlSession类似jdbc中的Connection//sqlSessionFactory在项目中只需要创建一个对象即可,里面读取到配置文件的信息sessionFactory= new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {e.printStackTrace();System.out.println("文件读取失败");}}public static SqlSession getSqlSession() throws IOException {//3.创建SqlSession 与数据库会话对象,美誉数据库交互一次,我们就创建一个SQLsession对象,就是一个链接通道,用完关闭SqlSession sqlSession = sessionFactory.openSession();return sqlSession;}
}
<?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">
<!-- 专门写SQL语句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><!--    接口中方法的名字         参数类型             返回值类型      --><select id="findAdminById" parameterType="int" resultType="mybatispro.model.Admin">select id,account,password,gender,reg_time from admin where id = #{id}</select>
</mapper>
package mybatispro.test;
import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;public class Test2 {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);System.out.println(admin);sqlSession.close();}
}

   (2). 多个参数

  方法一: 用@Param(" ")绑定
package mybatispro.dao;
import mybatispro.model.Admin;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
//定义功能--接口
public interface AdminDao {//通过多个参数查询admin的抽象方法Admin login(@Param("acc") String account , @Param("pwd") String password);}
<?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">
<!-- 专门写SQL语句的文件-->
<mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><select id="login" resultType="Admin">-->select id,account,password from admin where account =#{acc} and password =#{pas}</select></mapper>
package mybatispro.test;import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;public class Test2 {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//查询两个参数时Admin admin1 =adminDao.login("admin","111");System.out.println(admin1);sqlSession.close();}
}
  方法二: 传对象,相当于把包含所有属性的对象传进去
package mybatispro.dao;
import mybatispro.model.Admin;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
//定义功能--接口
public interface AdminDao {//通过多个参数查询admin的抽象方法Admin login(Admin admin);//可以传对象,相当于把包含所有属性的对象传进去
}
<?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">
<!-- 专门写SQL语句的文件-->
<mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址-->
<!-- 不能方法的重载--><select id="login" parameterType="Admin"  resultType="Admin">select  id,account, password,gender from admin where account=#{account} and password =#{password}</select></mapper>
package mybatispro.test;
import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
public class Test2 {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//封装向SQL中传递参数Admin admin =new Admin();admin.setAccount("admin");admin.setPassword("111");Admin admin1 =adminDao.login(admin);//相当于传封装了属性的对象System.out.println(admin1);sqlSession.close();}
}

4. 添加 删除 修改

     注意:  与查询操作基本类似,但是增删改执行完成后,需要向数据库提交事务commit(),提交后数据库才会真正保存数据到数据库,而查询不需要

package mybatispro.test;
import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.ArrayList;public class Test3 {public static void main(String[] args) throws IOException {Test3.inset();Test3.update();Test3.delete();}//新增public static  void inset() throws IOException {//模拟组装要保留的管理员数据Admin admin = new Admin();admin.setAccount("222");admin.setPassword("222");admin.setPassword("女");SqlSession sqlSession= MybatisUtil.getSqlSession(); //获得会话对象AdminDao adminDao =sqlSession.getMapper(AdminDao.class);//获得接口的处理代码对象int row = adminDao.insertAdmin(admin);System.out.println(row);//增删改执行完成后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库,而查询不需要sqlSession.commit();//提交事物sqlSession.close();}//修改public static  void update() throws IOException {Admin admin = new Admin();admin.setId(3);admin.setAccount("333");admin.setPassword("333");admin.setPassword("女");SqlSession sqlSession= MybatisUtil.getSqlSession();AdminDao adminDao =sqlSession.getMapper(AdminDao.class);int row = adminDao.updateAdmin(admin);System.out.println(row);sqlSession.commit();//提交事物sqlSession.close();}//删除public static  void delete() throws IOException {//因为是删除,就不需要组装数据了,直接传id就可以删除SqlSession sqlSession= MybatisUtil.getSqlSession();AdminDao adminDao =sqlSession.getMapper(AdminDao.class);int row =adminDao.deleteAdmin(3);System.out.println(row);sqlSession.commit();//提交事物sqlSession.close();}
}
<?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">
<!-- 专门写SQL语句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><insert id="insertAdmin" parameterType="Admin">insert  into admin(account, password,gender,reg_time)value( #{account},#{password},#{gender},now())</insert><update id="updateAdmin" parameterType="Admin">update  admin set account = #{account},password= #{password},gender=#{gender} where id =#{id}</update><delete id="deleteAdmin" parameterType="int">delete from admin where id =#{id}</delete>
</mapper>
package mybatispro.dao;
import mybatispro.model.Admin;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;//定义功能--接口
public interface AdminDao {int insertAdmin(Admin admin);int updateAdmin(Admin admin);int deleteAdmin(int id);
}

添加全局配置:

<setting name="mapUnderscoreToCamelCase" value="true"/>

注意: 可以将标准数据库列名与java标准属性名自动映射  例如reg_time(列名)与regTime(属性名),两者不一样时,可以使用as起别名,将两者统一

package mybatispro.dao;import mybatispro.model.Admin;
import org.apache.ibatis.annotations.Param;import java.util.ArrayList;//定义功能--接口
public interface AdminDao {//在接口中定义一个通过ID查询admin的抽象方法(不可以重载)Admin findAdminById(int id);//查询,传单个参数//通过多个参数查询admin的抽象方法//Admin login(@Param("acc") String account , @Param("pwd") String password);//查询,多个参数.Admin login(Admin admin);//查询,多个参数. 可以传对象,相当于把包含所有属性的对象传进去ArrayList<Admin> findAdmins();//查询多个对象int findAdminCount();//查询总人数int insertAdmin(Admin admin);//插入int updateAdmin(Admin admin);//修改int deleteAdmin(int id);//删除
}
<?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">
<!-- 专门写SQL语句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><!--    接口中方法的名字         方法中参数类型             方法中返回值类型      --><select id="findAdminById" parameterType="int" resultType="mybatispro.model.Admin">select id,account,password,gender,reg_time from admin where id = #{id}</select><!--    <select id="login" resultType="Admin">-->
<!--       select id,account,password from admin where account =#{acc} and password =#{pas}-->
<!--    </select>--><!--不能方法重载,且表中的列名需要与模型类中的属性名一致,才能自动映射--><select id="login" parameterType="Admin"  resultType="Admin">select  id,account, password,gender from admin where account=#{account} and password =#{password}</select><insert id="insertAdmin" parameterType="Admin">insert  into admin(account, password,gender,reg_time)value( #{account},#{password},#{gender},now())</insert><update id="updateAdmin" parameterType="Admin">update  admin set account = #{account},password= #{password},gender=#{gender} where id =#{id}</update><delete id="deleteAdmin" parameterType="int">delete from admin where id =#{id}</delete><select id="findAdminCount"  resultType="int">select  count(*) from admin</select><!--查询多个数据时也是一样的--><select id="findAdmins"  resultType="Admin">select  * from admin</select></mapper>
package mybatispro.test;
import mybatispro.dao.AdminDao;
import mybatispro.model.Admin;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;
public class Test3 {public static void main(String[] args) throws IOException {//Test3.inset();//Test3.update();//Test3.delete();Test3.find();}public static void find() throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession(); //获得会话对象AdminDao adminDao = sqlSession.getMapper(AdminDao.class); //获得接口的代理对象/* 查询总人数int count = adminDao.findAdminCount();System.out.println(count);*//*查询时可能会出现数据库的列名与java模型类中属性名不一致,无法匹配需要添加配置Admin admin = adminDao.findAdminById(1);System.out.println(admin);*/ArrayList<Admin> admins = adminDao.findAdmins();System.out.println(admins);sqlSession.close();}//新增public static void inset() throws IOException {//模拟组装要保留的管理员数据Admin admin = new Admin();admin.setAccount("222");admin.setPassword("222");admin.setPassword("女");SqlSession sqlSession= MybatisUtil.getSqlSession(); //获得会话对象AdminDao adminDao =sqlSession.getMapper(AdminDao.class);//获得接口的处理代码对象int row = adminDao.insertAdmin(admin);System.out.println(row);//增删改执行完成后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库,而查询不需要sqlSession.commit();//提交事物sqlSession.close();}//修改public static  void update() throws IOException {Admin admin = new Admin();admin.setId(3);admin.setAccount("333");admin.setPassword("333");admin.setPassword("女");SqlSession sqlSession= MybatisUtil.getSqlSession();AdminDao adminDao =sqlSession.getMapper(AdminDao.class);int row = adminDao.updateAdmin(admin);System.out.println(row);sqlSession.commit();//提交事物sqlSession.close();}//删除public static  void delete() throws IOException {//因为是删除,就不需要组装数据了,直接传id就可以删除SqlSession sqlSession= MybatisUtil.getSqlSession();AdminDao adminDao =sqlSession.getMapper(AdminDao.class);int row =adminDao.deleteAdmin(3);System.out.println(row);sqlSession.commit();//提交事物sqlSession.close();}
}

http://www.xdnf.cn/news/17632.html

相关文章:

  • 【Android】【bug】Json解析错误Expected BEGIN_OBJECT but was STRING...
  • Qt——信号和槽
  • 移动端网页调试实战,键盘弹出与视口错位问题的定位与优化
  • iOS 签名证书实践日记,我的一次从申请到上架的亲历
  • vue项目封装axios请求,支持判断当前环境及判断token是否过期等等(详细教程,可复制粘贴代码)
  • UE官方文档学习 C++ TAarry 查询(三)Contain,Find函数的使用
  • Java面试题储备11: mysql优化全面讲一下,及你遇到的对应业务场景
  • 第六十三章:AI模型的“跨界之旅”:不同硬件架构下的兼容性方案
  • RK3568 Linux驱动学习——Linux LED驱动开发
  • 数据分析与可视化
  • Java的异常机制
  • Supabase快速入门与实战指南
  • Effective C++ 条款37:绝不重新定义继承而来的缺省参数值
  • 存储过程作为系统逻辑核心的架构思考 —— 以 SaaS 系统为例
  • 计算机视觉(8)-纯视觉方案实现端到端轨迹规划(模型训练+代码)
  • 数据库规范化:消除冗余与异常的核心法则
  • 经济基础知识第一节:物质资料生产和基本经济规律(一)
  • SQL 与 NoSQL 的核心区别
  • 为什么灰度图用G(绿色)通道?
  • Docker 101:面向初学者的综合教程
  • 【报错处理】mount: /boot/efi: unknown filesystem type ‘LVM2_member‘.
  • 记录一次react渲染优化
  • 实现文字在块元素中水平/垂直居中详解
  • 教程 | 用Parasoft SOAtest实现高效CI回归测试
  • AWS EKS 常用命令大全:从基础管理到高级运维
  • [激光原理与应用-257]:理论 - 几何光学 - 光束整形
  • Springboot注册过滤器的三种方式(Order 排序)
  • Spring Cloud系列—Config配置中心
  • 【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示
  • VS4210芯片技术资料(IT6604+VS4210+MDIN380连接原理图)