在进行MyBatis开发时,咱们的大部分精力都放在了SQL映射配置文件上了。MyBatis虽然须要开发人员本身配置SQL语句,MyBatis来实现映射关系,可是这样的项目能够适应常常变化的项目需求。因此,使用MyBatis的场景是,对SQL优化要求比较高,或是项目需求或业务常常变更。java
数据源配置在SqlMapConfig.xml(文件名可更改)配置文件中的,其中包括数据库链接地址、数据库用户名和密码等参数。mysql
即SQL配置在独立的配置文件Mapper.xml(文件名可更改)中。spring
会话工厂便是SqlSessionFactory类。SqlSessionFactory能够根据数据库配置信息和SQL语句的配置信息产生出能够链接数据库并与其交互的SqlSession会话实例类。sql
建立一个log4j.properties空白属性文件:数据库
log4j.rootLogger = debug, stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %5p \[%t\] - %m%n
编写一个入门级SqlMapConfig配置文件,此配置文件是整个MyBatis的全局配置文件:apache
<?xml version="1.0" encoding="UTF-8"?><!--指定xml版本信息和编码格式--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--使用DTD文档定义类型--> <configuration> <settings> <setting name="logImpl" value="LOG4J" /> <!--配置日志输出模式logImpl为LOG4J--> </settings> <!-- 和spring整合后 environments配置将废除,能够将MyBatis中的数据源配置交由Spring管理--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库链接池--> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis\_test?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--解析Mapper文件,必须放在configuration标签的最后 --> <!--解析Mapper文件--> <mappers> <mapper resource="sqlmap/UserMapper.xml"/> </mappers> </configuration>
全部的配置都包裹在mapper
标签对中,mapper
标签的namespace
属性的做用就是对SQL进行分类化管理,实现不一样业务的SQL隔离。api
SQL语句分为增、删、改、查这几大类型,所对应的标签对有insert
、delete
、update
、及select
。session
每个SQL配置标签都有parameterType、parameterMap、resultType、resultClass及resultMap属性,分别表明输入参数类型、输入参数集合、结果类型、结果类、结果集合。mybatis
新建一个UserMapper.xml文件,这里配置一个查询语句:架构
<?xml version="1.0" encoding="UTF-8"?> <!--指定xml版本信息和编码格式--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--使用DTD文档定义类型--> <mapper namespace="test"> <select id="findUserById" parameterType="int" resultType="cn.com.mybatis.po.User"> select * from user where id=#{id} </select> </mapper>
id
属性select标签的惟一标识。#{}
标示一个占位符,当接受简单类型时,#{}
中只能写 "value",若是接受的是javabean,#{}
中要填入javabean的属性名。
编写完SQL映射文件后,为了能让MyBatis资源文件加载类解析Mapper文件,必须配置在SqlMapConfig.xml中的configuration标签的最后,配置信息以下:
<mappers> <mapper resource="sqlmap/UserMapper.xml" /> </mappers>
持久化实体类是一个类中的成员变量与数据库表中字段一一相对应的java类。
package cn.com.mybatis.po; import java.io.Serializable; import java.util.Date; public class User implements Serializable{ private int id; private String username; private String password; private String gender; private String email; private String province; private String city; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //余下的get与set方法省略 }
建立一个能够获取SqlSession(即数据库交互对象)的类:
package cn.com.mybatis.datasource; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class DataConnection { //MuBatis配置文件 private String resource="SqlMapConfig.xml"; private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; public SqlSession getSqlSession() throws IOException { InputStream inputStream = Resources.getResourceAsStream(resource); //建立会话工厂,传入MyBatis配置文件信息 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); return sqlSession; } }
编写一个从数据库中取出id为1的用户的数据:
package cn.com.mybatis.test; import cn.com.mybatis.datasource.DataConnection; import cn.com.mybatis.po.User; import org.apache.ibatis.session.SqlSession; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; import java.io.IOException; import java.util.List; public class MyBatisTest { public DataConnection dataConnection = new DataConnection(); @Test public void TestSelect() throws IOException{ SqlSession sqlSession = dataConnection.getSqlSession(); User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user.getUsername()); sqlSession.close(); }
在UserMapper.xml配置文件中配置SQL映射:
<select id="findUserByUsername" parameterType="String" resultType="cn.com.mybatis.po.User"> select * from user where username like '%${value}%' </select>
select
标签对中SQL语句的${}
符号,表示拼接SQL串,将接收到的参数内容不加任何修饰地拼接在SQL中,存在SQL注入的风险,在${}
中只能使用value表明其中的参数。
编写一个新的测试方法:
@Test public void TestFuzzySearch() throws IOException{ SqlSession sqlSession = dataConnection.getSqlSession(); List<User> userList = sqlSession.selectList("test.findUserByUsername","丽"); for (var user:userList) { System.out.println( user.getUsername()); } }
添加一个新用户:
<insert id="insertUser" parameterType="cn.com.mybatis.po.User"> insert into user(username,password,gender,birthday,email,province,city) value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE}, #{email},#{province},#{city}) </insert>
新增测试方法:
@Test public void TestInsert() throws Exception{ SqlSession sqlSession = dataConnection.getSqlSession(); User user = new User(); user.setUsername("xiaoxiao"); sqlSession.insert("test.insertUser", user); sqlSession.commit(); sqlSession.close(); }
添加一个新用户并返回该条目所对应的主键信息:
<insert id="insertUser" parameterType="cn.com.mybatis.po.User" useGeneratedKeys="true" keyProperty="id"> insert into user(username,password,gender,birthday,email,province,city) value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE}, #{email},#{province},#{city}) </insert>
useGeneratedKeys
表示使用自增主键,而keyProperty是Java对象的属性名。执行完insert语句后,会自动将自增加id值赋给对象User的属性id。
还有一种获取自增主键的方式:
<insert id="insertUser" parameterType="cn.com.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into user(username,password,gender,birthday,email,province,city) value(#{username},#{password},#{gender},#{birthday,jdbcType=DATE}, #{email},#{province},#{city}) </insert>
SELECT LAST_INSERT_ID()
用于查询MySQL的最后一个自增主键,order
参数表示该SQL函数相对于insert语句的执行时间,是在其以前(before)仍是以后(after)。执行完insert语句后,会自动将自增加id值赋给对象User的属性id。
SQL配置:
<!-- 删除用户 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 修改用户 --> <update id="updateUserName" parameterType="cn.com.mybatis.po.User"> update user set username=#{username} where id=#{id} </update>
新增2个测试方法:
@Test public void TestDelete() throws Exception{ SqlSession sqlSession = dataConnection.getSqlSession(); sqlSession.delete("test.deleteUser", 7); sqlSession.commit(); sqlSession.close(); } @Test public void Testupdate() throws Exception{ SqlSession sqlSession = dataConnection.getSqlSession(); User user = new User(); user.setId(4); user.setUsername("孙xiao"); sqlSession.update("test.updateUserName", user); sqlSession.commit(); sqlSession.close(); }
至此,入门程序的全部编写及开发工做所有完成。