目录结构
maven依赖
<!-- spring jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!-- mysql启动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- mybatis jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator
Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--从本地获取 指定数据连接驱动jar包地址 -->
<classPathEntry location="F:/LETVdownload/mysql-connector-java-5.1.43.jar" />
<!-- 一个数据库一个context -->
<context id="infoGuardian">
<!-- 注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true" /><!-- 是否取消注释 -->
<property name="suppressDate" value="false" /> <!-- 是否生成注释代时间戳 -->
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"
userId="xxxx" password="xxxx" />
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成实体类地址...User.java targetProject是项目名-->
<javaModelGenerator targetPackage="com.jst.springboot.entity"
targetProject="SpringMybatis">
<!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false" />
<!-- 是否针对string类型的字段在set的时候进行trim调用 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成mapxml文件 UserMapper.xml-->
<sqlMapGenerator targetPackage="com.jst.springboot.mapper"
targetProject="SpringMybatis">
<!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成mapxml对应client,也就是接口dao UserMapper.java接口 -->
<javaClientGenerator targetPackage="com.jst.springboot.mapper"
targetProject="SpringMybatis" type="XMLMAPPER">
<!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 配置表信息 -->
<!-- schema:数据库名 tableName:表名 domainObjectName:生成文件名称 -->
<table schema="test" tableName="student" domainObjectName="Student"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<property name="useActualColumnNames" value="true" />
</table>
</context>
</generatorConfiguration>
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">
<!--通过这个配置文件,完成mybatis与数据库的连接 -->
<configuration>
<!-- 引入database.properties文件 -->
<properties resource="database.properties" />
<!-- 设置别名 -->
<typeAliases>
<!-- 使用Users代替org.lwj.mybatis.bean包下的Users类 -->
<typeAlias alias="Users" type="org.lwj.mybatis.bean.Users" />
</typeAliases>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理 ,采用JDBC管理事务 -->
<transactionManager type="JDBC" />
<!-- POOLED是mybatis的 数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- pojo的映射文件UserMapper引入到配入到配置文件中 -->
<mappers>
<!-- resource要写成路径 -->
<mapper resource="mapper/xml/UsersMapper.xml" />
<!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
<!-- <package name="com/cy/mybatis/mapper"/> -->
</mappers>
</configuration>
UsersMapper.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" >
//namaspace(命名空间):对应的mapper接口位置
<mapper namespace="org.lwj.mybatis.mapper.UsersMapper">
<select id="selectById" parameterType="int" resultType="Users">
select * from users where uID=#{id}
</select>
</mapper>
UsersMapper.java Java API
package org.lwj.mybatis.mapper;
import org.lwj.mybatis.bean.Users;
public interface UsersMapper {
Users selectById(int id);
}
Users.java
package org.lwj.mybatis.bean;
public class Users {
private Integer uID;
private String uName;
private Integer uAge;
private char uSex;
private String uGrade;
public Integer getuID() {
return uID;
}
public void setuID(Integer uID) {
this.uID = uID;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public Integer getuAge() {
return uAge;
}
public void setuAge(Integer uAge) {
this.uAge = uAge;
}
public char getuSex() {
return uSex;
}
public void setuSex(char uSex) {
this.uSex = uSex;
}
public String getuGrade() {
return uGrade;
}
public void setuGrade(String uGrade) {
this.uGrade = uGrade;
}
@Override
public String toString() {
return "Users [uID=" + uID + ", uName=" + uName + ", uAge=" + uAge + ", uSex=" + uSex + ", uGrade=" + uGrade
+ "]";
}
}
DBTool.java 读取配置文件
package org.lwj.mybatis.tools;
import java.io.Reader;
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 DBTool {
public static SqlSessionFactory sessionFactory;
static {
try {
//第一种方法
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件) InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource); //构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//第二种方法
// 使用MyBatis提供的Resources类加载mybatis的配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(reader);} catch (Exception e) {e.printStackTrace();}}// 创建能执行映射文件中sql的sqlSessionpublic static SqlSession getSession() {return sessionFactory.openSession();}}
MybatisTest2.java 测试文件
package org.lwj.test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.lwj.mybatis.bean.Users;
import org.lwj.mybatis.mapper.UsersMapper;
import org.lwj.mybatis.tools.DBTool;
/*import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;*/
//@SpringBootApplication
//@MapperScan("org.lwj.mybatis.mapper")
public class MybatisTest2 {
@Test
public void test() {
/*ApplicationContext context=SpringApplication.run(MybatisTest2.class);
UsersMapper usersMapper=context.getBean(UsersMapper.class);
Users user=usersMapper.selectById(2);
System.out.println(user.toString());*/
select();
}
public void select() {
SqlSession session=DBTool.getSession();
UsersMapper usersMapper=session.getMapper(UsersMapper.class);
try {
Users user=usersMapper.selectById(2);
System.out.println(user.toString());
session.commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
session.rollback();
}
}
}
使用generatorConfig.xml 自动生成UsersMapper.xml、Users.java、UsersMapper.java,然后用mybatis-config.xml 去读取UsersMapper.xml,最后用DBTool.java加载mybatis-config.xml
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
cache
– 给定命名空间的缓存配置。cache-ref
– 其他命名空间缓存配置的引用。resultMap
– 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。sql
– 可被其他语句引用的可重用语句块。insert
– 映射插入语句update
– 映射更新语句delete
– 映射删除语句select
– 映射查询语句
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
返回类型resultType和resultMap的区别
讲解:https://zhidao.baidu.com/question/1367837349687326659.html
--resultType
resultType是直接表示返回类型的,使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
注意:如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身
--resultMap
resultMap则是对外部ResultMap的引用,如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系
column:字段名 property:java变量名
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中key是字段名,value则是其对应的值,resultType 和 resultMap不能同时使用
动态SQL
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
choose, when, otherwise(类似switch)
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
where
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除
-------------------------------------------------------------------