简单的mybatis+maven实现IDEA控制台增删改查
程序员文章站
2022-07-12 22:38:05
...
- 什么是mybatis?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 - “MyBatis是半自动化ORM”
- 这里的“半自动化”,是相对 Hibernate 等提供了全面的数据库封装机制的“全自动化”ORM 实现而言,“全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。而 MyBatis 的着力点,则在于 POJO 与 SQL 之间的映射关系。也就是说,MyBatis 并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映
- 射配置文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO。使用 ibatis 提供的 ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的 Java 对象,这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成 SQL 语句,而 MyBatis 则要求开发者编写具体的 SQL 语句。相对 Hibernate 等“全自动”ORM 机制而言,ibatis 以 SQL 开发的工作量和数据库移植性上的让步,为系统设计提供了更大的*空间。作为“全自动”ORM 实现的一种有益补充,MyBatis 的出现显得别具意义。
- ————注:上方理论部分摘抄字【https://www.w3cschool.cn/mybatis/】w3cschool 与书籍 ibatis开发指南 想了解的朋友可以翻阅
-
MyBatis的优势:
-
1.消除大量的JDBC冗余代码
- 2.低学习线路,学习相对简单
- 3.友好的Spring集成支持
- 3.友好的第三方缓存类集成支持
- 4.良好的性能
- MyBatis:缺点
- 1. 数据库移植性不好,不同的数据库需要写不同SQL
- 2.缓存机制不佳
- MyBatis:核心概念
- 核心对象 核心配置文件 sql映射文件
- 本人初学者:如某些写的不对请见谅,学习中
- 让自己一眼看懂记得清,每段代码都分部写的,代码一下打完很容易出错,而且出错后挑错也是一大功
- 首先我们创建一个数据库名字可以自己改变
- CREATE DATABASE `water_margin`
- 需要创建一个数据表
CREATE TABLE `hero`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`sex` CHAR(2),
`designation` VARCHAR(64),
reaking INT(10),
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
- 人物信息个方面自己添加
- 接下来我们要创建一个maven项目了
-
-
- 需要创建这些包和文件
- 配置pom.xml文件
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.jdbc</groupId> <artifactId>mybatis10</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.28</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> </project>
- 创建一个database.properties文件,名字可更改
- 创建log4j.properties日志文件异常的时候日志会存在log4j日志文件中
-
log4j.rootLogger=DEBUG,CONSOLE,file log4j.logger.cn.smbms.dao=debug log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug log4j.logger.java.sql.ResultSet=debug log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=error log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.DatePattern=yyyy-MM-dd log4j.appender.file.File=log.log log4j.appender.file.Append=true log4j.appender.file.Threshold=error log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n log4j.logger.com.opensymphony.xwork2=error
- 这个日志在网上很好找↑↑
- 创建Name.java实体类
package cn.jdbc.entity;
public class Name {
private Integer id;//id
private Integer reaking;//排名
private String name;//姓名
private String sex;//性别
private String desigNation;//称号
@Override
public String toString() {
return "Name{" +
"id=" + id +
", reaking=" + reaking +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", desigNation='" + desigNation + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getReaking() {
return reaking;
}
public void setReaking(Integer reaking) {
this.reaking = reaking;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getDesigNation() {
return desigNation;
}
public void setDesigNation(String desigNation) {
this.desigNation = desigNation;
}
}
配置TuserMapper.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="cn.jdbc.dao.TuserMapper">
<resultMap id="userMap" type="cn.jdbc.entity.Name">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="reaking" column="reaking"></result>
<result property="desigNation" column="designation"></result>
</resultMap>
<!--显示总人数-->
<select id="queryCount" resultType="int">
SELECT COUNT(*) from `hero`
</select>
</mapper>
配置 mybatis-config.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>
<properties resource="database.properties"></properties>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="cn.jdbc.entity.Name"></package>
</typeAliases>
<environments default="dvr">
<environment id="dvr">
<!--transationManater是事务管理器 选择jdbc获取事务-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源有POOLED 和UNPOLED也可自定义数据源-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<mappers>
<!--mappers是映射器,把mapper文件加入到配置文件中-->
<mapper resource="cn/jdbc/dao/TuserMapper.xml"></mapper>
</mappers>
</configuration>
创建测试类,用老方法掉用看效果TuserTest.java
这种方法代码没有经过优化,看起来比较杂乱,为了让像我一样的初学者能看懂,我后边会慢慢贴出优化后的代码
public class TuserTest {
@Test
//查询用户总数
//第一种老方法输出,未优化前
public void queryCountTest() {
SqlSession sqlSession = null;
try {
//获取mybatis-config.xml的输入流
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//sqlSessionFactory读取配置文件
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
//开启sqlSession,执行mapper中的操作
sqlSession = sqlSessionFactory.openSession();
//把mapper文件引入到mybatis-config.xml中
int n = sqlSession.selectOne("cn.jdbc.dao.TuserMapper.queryCount");
System.out.println(n);
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
sqlSession.close();
}
}
}
优化代码创建MybatisUtil.java类,把上边重复的代码放进去
package cn.jdbc.util;
import jdk.internal.util.xml.impl.Input;
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.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//公用的代码
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//开启sqlSession,执行mapper中的操作
public static SqlSession createSqlSession(){
return sqlSessionFactory.openSession();
}
//关闭资源
public static void closeSqlSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
创建接口TuserMapper
注:TuserMapper接口必须和TuserMapper.xml文件名一样
package cn.jdbc.dao;
import cn.jdbc.entity.Name;
import java.util.List;
public interface TuserMapper {
//查询全部用户信息
List<Name> queryAll();
//模糊查询,查询通过用户名查询用户信息
List<Name> getUserListByUserName(String name);
//模糊查询,多参数查询用实体类进行入参
List<Name> getUserListByUserNameAndNickName(Name name);
//修改数据
public Integer updateTuser(Name name);
//删除用户数据
Integer deleteTuserByid(Integer id);
//插入数据
Integer addTuser(Name name);
}
在TuserMapper.xml写一个查询sql语句
注:写在mapper标签内
<!--显示全部人员信息-->
<select id="queryAll" resultMap="userMap">
SELECT * FROM `hero`
</select>
测试的两种方法1.直接类里调用 2.直接调用接口中的方法 测试类 @Test
//获取全部用户信息
//简化版
public void queryALLTest(){
SqlSession sqlSession=null;
sqlSession=MybatisUtil.createSqlSession();
//第一种方法 通过路径获取信息
// List<Tuser> n=sqlSession.selectList("cn.jdbc.dao.TuserTest.queryAll");
//第二种方法 通过接口返回信息引入映射文件中
List<Name> n=sqlSession.getMapper(TuserMapper.class).queryAll();
if(n!=null){
for (Name tuser : n) {
System.out.println(tuser);
}
}
}
添加
<!--插入一条数据-->
<insert id="addTuser" parameterType="cn.jdbc.entity.Name" useGeneratedKeys="true" keyProperty="id">
insert into hero (name, reaking, designation)
values (#{name}, #{reaking}, #{desigNation})
</insert>
测试
@Test
//添加
public void addTuser(){
SqlSession sqlSession=null;
Name name =new Name();
name.setReaking(11);
name.setDesigNation("扑天雕");
name.setName("李应");
int rows=0;
sqlSession = MybatisUtil.createSqlSession();
rows=sqlSession.getMapper(TuserMapper.class).addTuser(name);
sqlSession.commit();
if(rows>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
MybatisUtil.closeSqlSession(sqlSession);
}
修改
<!--修改数据-->
<update id="updateTuser" parameterType="cn.jdbc.entity.Name">
UPDATE hero SET
name=#{name},
designation=#{desigNation},
reaking=#{reaking}
WHERE
id=#{id}
</update>
测试 //修改
public void testUpdateTuser(){
SqlSession sqlSession=null;
Name name =new Name();
name.setReaking(10);
name.setName("柴进");
name.setDesigNation("排行第十");
name.setId(10);
int rows=0;
sqlSession = MybatisUtil.createSqlSession();
rows=sqlSession.getMapper(TuserMapper.class).updateTuser(name);
sqlSession.commit();
if(rows>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
MybatisUtil.closeSqlSession(sqlSession);
}
删除
<!--通过id删除用户信息-->
<delete id="deleteTuserByid" parameterType="Integer">
delete from hero where id=#{id}
</delete>
测试 @Test
//删除
public void testDeletTuserByid(){
SqlSession sqlSession=null;
int delete=0;
sqlSession = MybatisUtil.createSqlSession();
delete=sqlSession.getMapper(TuserMapper.class).deleteTuserByid(11);
sqlSession.commit();
if(delete>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
MybatisUtil.closeSqlSession(sqlSession);
}
几种查询方式,列了两种
<!--根据用户名称查询用户列表 模糊查询(单参数查询)-->
<select id="getUserListByUserName" parameterType="String" resultMap="userMap">
SELECT * FROM hero WHERE name LIKE CONCAT('%',#{name},'%')
</select>
<!--根据用户名称查询用户列表 模糊查询(多参数查询用实体类进行入参)-->
<select id="getUserListByUserNameAndNickName" resultMap="userMap">
SELECT * FROM hero
WHERE name LIKE CONCAT('%',#{name},'%')
AND designation LIKE CONCAT('%',#{desigNation},'%')
</select>
测试代码
@Test
//模糊查询,查询通过用户名查询用户信息
public void testGetUserListByuserNameTest() {
SqlSession sqlSession = null;
sqlSession = MybatisUtil.createSqlSession();
List<Name> list = sqlSession.getMapper(TuserMapper.class).getUserListByUserName("宋江");
if (null != list) {
for (Name name : list) {
System.out.println(name);
}
}
MybatisUtil.closeSqlSession(sqlSession);
}
@Test
//模糊查询,多参数查询用实体类进行入参
public void testGetUserByUserListByUserNameAndNickName(){
SqlSession sqlSession=null;
List<Name> list=null;
Name tuser =new Name();
tuser.setName("林冲");
tuser.setDesigNation("豹子头");
sqlSession = MybatisUtil.createSqlSession();
list=sqlSession.getMapper(TuserMapper.class).getUserListByUserNameAndNickName(tuser);
if(null!=list){
for (Name tuser1 : list) {
System.out.println(tuser1);
}
}
MybatisUtil.closeSqlSession(sqlSession);
}
代码到此结束
mybatis图:
typeAliases映射类型:
resultType和resultMap
typeHandlers应用
自定义typeHandlers
结语:第一次写博客,尽然写了一夜,至努力的自己