[ 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();}
}