【02】创建MyBatis项目 -- 非 mapper

这篇博客详细介绍了如何创建一个MyBatis项目,包括创建Maven工程、添加jar包、配置log4j.properties、编写SqlMapConfig.xml、设计POJO类以及编写程序。重点讲解了映射文件的配置,如namespace、parameterType、resultType,以及#{}和${}的区别。同时,文章还涉及了MyBatis的selectOne和selectList用法,以及添加、删除、修改操作的映射文件和测试程序,涵盖了Mysql和Oracle的主键生成策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 第一步:创建 Maven 工程

在这里插入图片描述

2. 第二步:加入jar包

	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.46</version>
		</dependency>
	</dependencies>

3. 第三步:log4j.properties

  • 在 resource下创建log4j.properties如下:
	### \u8BBE\u7F6E###
	log4j.rootLogger = debug,stdout,D,E
	
	### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
	log4j.appender.stdout = org.apache.log4j.ConsoleAppender
	log4j.appender.stdout.Target = System.out
	log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
	log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
	
	### \u8F93\u51FADEBUG \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
	log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
	log4j.appender.D.File = E://logs/log.log
	log4j.appender.D.Append = true
	log4j.appender.D.Threshold = DEBUG 
	log4j.appender.D.layout = org.apache.log4j.PatternLayout
	log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
	
	### \u8F93\u51FAERROR \u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7\u5230=E://logs/error.log ###
	log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
	log4j.appender.E.File =E://logs/error.log 
	log4j.appender.E.Append = true
	log4j.appender.E.Threshold = ERROR 
	log4j.appender.E.layout = org.apache.log4j.PatternLayout
	log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
  • mybatis默认使用log4j作为输出日志信息。

4. 第四步:SqlMapConfig.xml

  • 在 resource下创建 SqlMapConfig.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文件 -->
		<properties resource="db.properties"></properties>
		
		<!-- 全局参数配置 -->
		<settings>
			<!-- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 -->
			<setting name="logImpl" value="LOG4J"/>
		</settings>
		
		<!-- 类型别名 -->
		<typeAliases>
			<!-- 自定义别名 type:类的路径 , alias :别名 -->
			<typeAlias type="com.hxzy.pojo.User" alias="user"/>
			<typeAlias type="com.hxzy.pojo.OrderExt" alias="orderExt"/>
			<typeAlias type="com.hxzy.pojo.Order" alias="order"/>
		</typeAliases>
		
		<!-- 环境 -->
		<environments default="development">
			<environment id="development">
				<!-- 使用JDBC事务管理 -->
				<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="com/hxzy/mapper/UserMapper.xml"/> -->
			<!-- 使用映射器接口实现类的完全限定类名 -->
			<!-- <mapper class="com.hxzy.mapper.UserMapper"/> -->
			<!-- 将包内的映射器接口实现全部注册为映射器 -->
			<package name="com.hxzy.mapper"/>
		</mappers>
	
	</configuration>

5. 第五步:pojo类

	import java.util.Date;
	
	public class User {
	
		private Integer id;
		private String username;
		private Date birthday;
		private String sex;
		private String address;
		
		public User() {
			// TODO Auto-generated constructor stub
		}
		
	
		public User(Integer id, String username, Date birthday, String sex, String address) {
			super();
			this.id = id;
			this.username = username;
			this.birthday = birthday;
			this.sex = sex;
			this.address = address;
		}
	
		@Override
		public String toString() {
			return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
					+ address + "]";
		}
	
		public Integer getId() {
			return id;
		}
	
		public void setId(Integer id) {
			this.id = id;
		}
	
		public String getUsername() {
			return username;
		}
	
		public void setUsername(String username) {
			this.username = username;
		}
	
		public Date getBirthday() {
			return birthday;
		}
	
		public void setBirthday(Date birthday) {
			this.birthday = birthday;
		}
	
		public String getSex() {
			return sex;
		}
	
		public void setSex(String sex) {
			this.sex = sex;
		}
	
		public String getAddress() {
			return address;
		}
	
		public void setAddress(String address) {
			this.address = address;
		}
		
	}

6. 第六步:程序编写

6.1 映射文件

  • 在classpath下的sqlmap目录下创建sql映射文件Users.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="test">
      </mapper>
    
  • namespace :命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。

  • 在SqlMapConfig.xml中添加:

      <select id="findUserById" parameterType="int" resultType="cn.atwyl.mybatis.po.User">
      	select * from user where id = #{id}
      </select>
      <!-- 自定义条件查询用户列表 -->
      <select id="findUserByUsername" parameterType="java.lang.String" 
      		resultType="cn.atwyl.mybatis.po.User">
         select * from user where username like '%${value}%' 
      </select>
    
  • parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。

  • resultType:定义结果映射类型。

6.2 加载映射文件

  • mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:

      <mappers>
      		<mapper resource="sqlmap/User.xml"/>
      </mappers>
    

6.3 测试程序:

    public class Mybatis_first {
    	
    	//会话工厂
    	private SqlSessionFactory sqlSessionFactory;
    
    	@Before
    	public void createSqlSessionFactory() throws IOException {
    		// 配置文件
    		String resource = "SqlMapConfig.xml";
    		InputStream inputStream = Resources.getResourceAsStream(resource);
    
    		// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
    		sqlSessionFactory = new SqlSessionFactoryBuilder()
    				.build(inputStream);
    	}
    
    	// 根据 id查询用户信息
    	@Test
    	public void testFindUserById() {
    		// 数据库会话实例
    		SqlSession sqlSession = null;
    		try {
    			// 创建数据库会话实例sqlSession
    			sqlSession = sqlSessionFactory.openSession();
    			// 查询单个记录,根据用户id查询用户信息
    			User user = sqlSession.selectOne("test.findUserById", 10);
    			// 输出用户信息
    			System.out.println(user);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (sqlSession != null) {
    				sqlSession.close();
    			}
    		}
    	}
    
    	// 根据用户名称模糊查询用户信息
    	@Test
    	public void testFindUserByUsername() {
    		// 数据库会话实例
    		SqlSession sqlSession = null;
    		try {
    			// 创建数据库会话实例sqlSession
    			sqlSession = sqlSessionFactory.openSession();
    			// 查询单个记录,根据用户id查询用户信息
    			List<User> list = sqlSession.selectList("test.findUserByUsername", "张");
    			System.out.println(list.size());
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (sqlSession != null) {
    				sqlSession.close();
    			}
    		}
    	}
    }

6.4 #{}和${}

#{}

  • #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
  • #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}

  • ${}表示拼接sql串,通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,
  • ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,
  • ${}括号中只能是value。

6.5 parameterType和resultType

  • parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
  • resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

6.6 selectOne和selectList

  • selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:

    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

  • selectList可以查询一条或多条记录。

6.7 添加

6.7.1 映射文件:

  • 在SqlMapConfig.xml中添加:

      	<!-- 添加用户 -->
      	<insert id="insertUser" parameterType="cn.atwyl.mybatis.po.User">
      	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      		select LAST_INSERT_ID() 
      	</selectKey>
      	  insert into user(username,birthday,sex,address) 
      	  values(#{username},#{birthday},#{sex},#{address})
      	</insert>
    

6.7.2 测试程序:

		// 添加用户信息
		@Test
		public void testInsert() {
			// 数据库会话实例
			SqlSession sqlSession = null;
			try {
				// 创建数据库会话实例sqlSession
				sqlSession = sqlSessionFactory.openSession();
				// 添加用户信息
				User user = new User();
				user.setUsername("张小明");
				user.setAddress("河南郑州");
				user.setSex("1");
				user.setPrice(1999.9f);
				sqlSession.insert("test.insertUser", user);
				//提交事务
				sqlSession.commit();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (sqlSession != null) {
					sqlSession.close();
				}
			}
		}

6.7.3 Mysql 自增主键返回

  • 通过修改sql映射文件,可以将mysql自增主键返回:

     	<insert id="insertUser" parameterType="cn.atwyl.mybatis.po.User">
      		<!-- selectKey将主键返回,需要再返回 -->
      		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      			select LAST_INSERT_ID()
      		</selectKey>
      	   insert into user(username,birthday,sex,address)
      	    	values(#{username},#{birthday},#{sex},#{address});
      	</insert>
    
  • 添加selectKey实现将主键返回

  • keyProperty:返回的主键存储在pojo中的哪个属性

  • order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after

  • resultType:返回的主键是什么类型

  • LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。

6.7.4 Mysql 使用 uuid实现主键

  • 需要增加通过select uuid()得到uuid值

      <insert  id="insertUser" parameterType="cn.atwyl.mybatis.po.User">
      <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
      		select uuid()
      </selectKey>
      insert into user(id,username,birthday,sex,address) 
      		 values(#{id},#{username},#{birthday},#{sex},#{address})
      </insert>
    
  • 注意这里使用的order是“BEFORE”

6.7.5 Oracle 使用序列生成主键

  • 首先自定义一个序列且用于生成主键,selectKey使用如下:

      <insert  id="insertUser" parameterType="cn.atwyl.mybatis.po.User">
      	<selectKey resultType="java.lang.Integer" order="BEFORE"  keyProperty="id">
     		 SELECT 自定义序列.NEXTVAL FROM DUAL 
      	</selectKey>
        insert into user(id,username,birthday,sex,address) 
      		 values(#{id},#{username},#{birthday},#{sex},#{address})
      </insert>
    
  • 注意这里使用的order是“BEFORE”

6.8 删除

6.8.1 映射文件:

	<delete id="deleteUserById" parameterType="int">
		delete from user where id=#{id}
	</delete>

6.8.2 测试程序:

    // 根据id删除用户
	@Test
	public void testDelete() {
		// 数据库会话实例
		SqlSession sqlSession = null;
		try {
			// 创建数据库会话实例sqlSession
			sqlSession = sqlSessionFactory.openSession();
			// 删除用户
			sqlSession.delete("test.deleteUserById",18);
			// 提交事务
			sqlSession.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}

6.9 修改

6.9.1 映射文件

    <!-- 更新用户 -->
	<update id="updateUser" parameterType="cn.atwyl.mybatis.po.User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
		where id=#{id}
	</update>

6.9.2 测试程序

    // 更新用户信息
	@Test
	public void testUpdate() {
		// 数据库会话实例
		SqlSession sqlSession = null;
		try {
			// 创建数据库会话实例sqlSession
			sqlSession = sqlSessionFactory.openSession();
			// 添加用户信息
			User user = new User();
			user.setId(16);
			user.setUsername("张小明");
			user.setAddress("河南郑州");
			user.setSex("1");
			user.setPrice(1999.9f);
			sqlSession.update("test.updateUser", user);
			// 提交事务
			sqlSession.commit();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值