SSM---MyBatis
文章目录
- Mybatis
- 一、MyBatis入门
- 1、MyBatis介绍
- 2、入门案例
- (1)准备数据库
- (2)创建maven项目
- (3)定义User类
- (4)创建mapper文件
- (5)创建mybatis配置文件
- (6)加载主配置文件进行测试
- 3、增删改查
- (1)增
- ① 自增主键
- ② uuid做主键
- (2)删
- (3)改
- (4)查
- 4、MyBatis架构介绍
- 5、引入Mapper
- 二、全局配置
- 1、properties
- 2、settings
- 3、typeAliases
- (1)MyBatis自带的别名
- (2)自定义别名
- 4、Mapper
- 三、Mapper映射文件
- 1、parameterType
- (1)'$'和'#'
- (2)简单类型
- (3)对象参数
- 2、resultType
- 3、resultMap
- 四、动态SQL
- 1、if
- 2、where
- 3、foreach
- 4、sql片段
- 5、set
- 五、查询进阶
- 1、一对一查询
- (1)懒加载
- 2、一对多查询
- 3、查询缓存
- 4、逆向工程
说明:MyBatis的学习是参考江南一点雨的教程(安利这个公众号),教程原文。
Mybatis
一、MyBatis入门
1、MyBatis介绍
MyBatis是一个持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,而不需要花费精力去处理例如注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索等jdbc复杂的过程代码。MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。
2、入门案例
(1)准备数据库
CREATE DATABASE test01;USE `test01`;/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) DEFAULT NULL,`address` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;/*Data for the table `user` */insert into `user`(`id`,`username`,`address`) values (1,'javaboy123','www.javaboy.org'),(3,'javaboy','spring.javaboy.org'),(4,'张三','深圳'),(5,'李四','广州'),(6,'王五','北京');
(2)创建maven项目
并在pom.xml中引入mybatis依赖和数据库连接驱动。
<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version></dependency>
</dependencies>
(3)定义User类
package org.luyangsyi.test01.bean;/*** Created by luyangsiyi on 2020/2/11*/
public class User {private Integer id;private String username;private String address;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", 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 String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}
(4)创建mapper文件
在main—resources中定义UserMapper.xml:
编写一个简单的select语句,其中id表示查询方法的唯一标识符,resultType定义了返回值的类型,#{id}表示这个位置用来接收外部传进来的参数。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.luyangsiyi.mymapper"><select id="getUserById" resultType="org.luyangsiyi.test01.bean.User">select * from user where id = #{id};</select>
</mapper>
(5)创建mybatis配置文件
在main—resources下添加myatis-config.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test01"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="UserMapper.xml"/></mappers>
</configuration>
(6)加载主配置文件进行测试
可以写在test–java中。
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 org.luyangsiyi.test01.bean.User;import java.io.IOException;/*** Created by luyangsiyi on 2020/2/11*/
public class test {public static void main(String[] args) throws IOException {//通过SqlSessionFactoryBuilder创建SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));//导入配置文件SqlSession sqlSession = factory.openSession();//sqlSession中封装了对数据库的操作User user = (User) sqlSession.selectOne("org.luyangsiyi.mymapper.getUserById", 3);//进行查询并传入参数idSystem.out.println(user);sqlSession.close();}
}
3、增删改查
(1)增
① 自增主键
在mapper中插入sql语句:
<insert id="addUser" parameterType="org.luyangsiyi.test01.bean.User">insert into user (username,address) values(#{username},#{address});
</insert>
编写测试方法:
//2.增
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setUsername("赵六");
user.setAddress("北京");
int insert = sqlSession.insert("org.luyangsiyi.mymapper.addUser",user);
System.out.println(insert);
sqlSession.commit();//sql插入提交后一定要commit
sqlSession.close();
② uuid做主键
使用mysql自带的uuid函数生成uuid。
首先调用mysql中的uuid函数,获取到一个uuid,然后将这个uuid赋值给User对象的id属性,然后再去进行SQL插入操作,在插入时使用这个uuid。
需要实现将数据的id类型改为varchar
<insert id="addUser2" parameterType="org.luyangsiyi.test01.bean.User"><selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE"><!--selectKey表示查询key,keyProperty表示查询的结果赋值为传递进来的User对象的id属性,order表示这个查询操作的执行时机,BEFORE表示在insert之前执行-->select uuid();</selectKey>insert into user (id,username,address) values (#{id},#{username},#{address});</insert>
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setUsername("赵六");
user.setAddress("北京");
int insert = sqlSession.insert("org.luyangsiyi.mymapper.addUser2",user);
System.out.println(insert);
sqlSession.commit();//sql插入提交后一定要commit
sqlSession.close();
(2)删
<delete id="deleteById">delete from user where id=#{id};
</delete>
//3.删
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
int delete = sqlSession.delete("org.luyangsiyi.mymapper.deleteById",8);
System.out.println(delete);
sqlSession.commit();//sql插入提交后一定要commit
sqlSession.close();
(3)改
<update id="updateUser" parameterType="org.luyangsiyi.test01.bean.User">update user set username=#{username} where id=#{id};
</update>
//4.改
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
User user = new User();
user.setId(1);
user.setUsername("javaboy");
int update = sqlSession.update("org.luyangsiyi.mymapper.updateUser",user);
System.out.println(update);
sqlSession.commit();//sql插入提交后一定要commit
sqlSession.close();
(4)查
<select id="selectAll" resultType="org.luyangsiyi.test01.bean.User">select * from user;
</select>
//5.查
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("org.luyangsiyi.mymapper.selectAll");
System.out.println(list);
sqlSession.close();
4、MyBatis架构介绍
- mybatis 配置:mybatis-config.xml,此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。另一个 mapper.xml 文件即 sql 映射文件,文件中配置了操作数据库的 sql 语句。此文件需要在 mybatis-config.xml 中加载。
- 通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂
- 由会话工厂创建 sqlSession 即会话,操作数据库需要通过 sqlSession 进行。
- mybatis 底层自定义了 Executor 执行器接口操作数据库,Executor 接口有两个实现,一个是基本执行器、一个是缓存执行器。
- Mapped Statement 也是 mybatis 一个底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象,sql 的 id 即是Mapped statement 的 id。
- Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数。
- Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中,输出结果映射过程相当于 jdbc 编程中对结果的解析处理过程。
5、引入Mapper
UserDao.java:
package org.luyangsiyi.test01.dao;import org.luyangsiyi.test01.bean.User;import java.util.List;/*** Created by luyangsiyi on 2020/2/11*/
public interface UserDao {User getUserById(Integer id);Integer addUser(User user);Integer addUser2(User user);Integer deleteUserById(Integer id);Integer updateUser(User user);List<User> getAllUser();
}
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.luyangsiyi.test01.dao.UserDao"><select id="getUserById" resultType="org.luyangsiyi.test01.bean.User">select * from user where id = #{id};</select><insert id="addUser" parameterType="org.luyangsiyi.test01.bean.User">insert into user (username,address) values(#{username},#{address});</insert><delete id="deleteById">delete from user where id=#{id};</delete><update id="updateUser" parameterType="org.luyangsiyi.test01.bean.User">update user set username=#{username} where id=#{id};</update><select id="selectAll" resultType="org.luyangsiyi.test01.bean.User">select * from user;</select>
</mapper>
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test01"/><property name="username" value="root"/><property name="password" value="wawj6241"/></dataSource></environment></environments><mappers><package name="mapper"/></mappers>
</configuration>
二、全局配置
1、properties
引入数据库的配置文件,在resources目录下添加一个jdbc.properties文件作为数据库的配置文件:
db.username=root
db.password=123456
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test01
然后在mybatis-config.xml中做修改,而不是直接写死数据库相关信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入jdbc.properties--><properties resource="jdbc.properties"></properties><environments default="development"><!--可以配置多个环境--><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></dataSource></environment></environments><mappers><package name="mapper"/></mappers>
</configuration>
2、settings
常用设置:mapUnderscoreToCamelCase(驼峰命名法)
3、typeAliases
(1)MyBatis自带的别名
本来,在Mapper中定义数据类型时,需要写全路径,如下:
<select id="getUserCount" resultType="java.lang.Integer">select count(*) from user;
</select>
此时可以使用类型别名来替代(有对应的映射表)
<select id="getUserCount" resultType="java.lang.int">select count(*) from user;
</select>
(2)自定义别名
自己的对象,在Mapper定义的时候,也需要写全路径:
<select id="getAllUser" resultType="org.luyangsiyi.test01.bean.User">select * from user;
</select>
为了避免写全路径,我们可以给User对象取一个别名,在mybatis-config.xml中添加typeAliases节点:
<typeAliases><typeAlias type="org.luyangsiyi.test01.bean.User" alias="User"/>
</typeAliases>
则此时的mapper可以为:
<select id="getAllUser" resultType="User">select * from user;
</select>
由于一个个去修改别名很麻烦,所以我们可以批量操作(建议这种方式):
<typeAliases><package name="org.luyangsiyi.test01.bean"/>
</typeAliases>
默认别名为类名但是首字母小写:
<select id="getAllUser" resultType="user">select * from user;
</select>
4、Mapper
Mapper配置的几种方式:
<mapper resource=" "/>
使用相对于类路径的资源,即xml定位,从classpath开始写。
<mapper class=" "/>
使用mapper接口类路径,要求mapper接口名称和mapper映射文件名称相同,且在同一个目录下。
<package name=" "/>
注册指定包下的所有mapper接口。要求mapper接口名称和mapper映射文件名称相同,且在同一个目录下。实际项目中多采用这种方式。
<mappers><package name="mapper"/>
</mappers>
三、Mapper映射文件
1、parameterType
表示输入的参数类型。
(1)’$‘和’#’
在mapper引用变量时,默认使用的是’#’,如:
<select id="getUserById" resultType="user">select * from user where id = #{id};
</select>
除了’#‘之外,也可以用’$'来引用,即:
<select id="getUserById" resultType="user">select * from user where id = ${id};
</select>
在最新的mybatis中,无论是’KaTeX parse error: Expected 'EOF', got '#' at position 5: '还是'#̲'只有一个参数可以不用别名@P…‘相当于参数拼接的方式,而’#'相当于占位符的方式。
‘#’ 对应PreparedStatement预编译的情况,’$'对应Statement的情况。
(2)简单类型
多个参数添加@Param来指定参数名,可以在mapper文件中直接使用。
Integer updateUsernameById(@Param("username") String username, @Param("id") Integer id);
<update id="updateUsernameById"> update user set username = #{username} where id=#{id};
</update>
(3)对象参数
如果存在多个对象,那么我们也需要对对象添加@Param注解,此时再mapper中引用对象的属性会有所改变,如从username变为user.username(@Param(“user”))
2、resultType
resultType 是返回类型,在实际开发中,如果返回的数据类型比较复杂,一般我们使用 resultMap,但是,对于一些简单的返回,使用 resultType 就够用了。
resultType 返回的类型可以是简单类型,可以是对象,可以是集合,也可以是一个 hashmap,如果是 hashmap,map 中的 key 就是字段名,value 就是字段的值。
3、resultMap
在实际开发中,resultMap 是使用较多的返回数据类型配置。因为实际项目中,一般的返回数据类型比较丰富,要么字段和属性对不上,要么是一对一、一对多的查询,等等,这些需求,单纯的使用 resultType 是无法满足的,因此我们还需要使用 resultMap,也就是自己定义映射的结果集。
可以在mapper.xml中定义一个resultMap:
<resultMap id="MyResultMap" type="org.javaboy.mybatis.model.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="address" property="address"/>
</resultMap>
id用来描述主键,column是数据库查询出来的列名,property是对象中的属性名。
在查询结果中,可以直接使用这个ResultMap:
<select id="getUserById" resultMap="MyResultMap"> select * from user where id=#{id};
</select>
四、动态SQL
可以解决类似查询条件不确定、批量插入等需求。
1、if
if是一个判断节点,如果满足某个条件,节点中的SQL就会生效。例如分页查询,要传递两个参数,页码和查询的记录数,如果这两个参数都为null,那么查询所有。
接口方法:
List<User> getUserByPage(@Param("start") Integer start, @Param("count") Integer count);
xml中定义sql:
<select id="getUserByPage" resultType="org.luyangsiyi.test01.bean.User">select * from user<if test="start != null and count != null"></if>
</select>
if节点中,test表示判断条件,如果结果为true,则if节点中的sql会生效,否则不会生效。
2、where
用where节点将所有的查询条件包起来,如果有满足的条件,where节点会自动加上,如果没有,where节点将不存在,在有满足条件的情况下,where还会自动处理and关键字。
接口:
List<User> getUserByUsernameAndId(@Param("id") Integer id, @Param("name") String name);
xml中定义sql:
<select id="getUserByUsernameAndId" resultType="org.luyangsiyi.test01.bean.User"> select * from user <where> <if test="id!=null"> and id>#{id} </if> <if test="name!=null"> and username like concat('%',#{name},'%') </if> </where>
</select>
3、foreach
foreach用来处理数组/集合参数。
List<User> getUserByIds(@Param("ids")Integer[] ids);
<select id="getUserByIds" resultType="org.luyangsiyi.test01.bean.User">select * from user where id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach><!--foreach的结果为(id1,id2,...,idn)-->
</select>
在mapper中,通过foreach节点来遍历数组,collection表示数组变量,open表示循环结束后左边的符号,close表示循环结束后右边的符号,item表示循环时候的单个变量,separator表示循环的元素之间的分隔符。
4、sql片段
每次查询都需要把字段名列出来,可以使用SQL片段来解决这问题。
<sql id="Base_Column">id,username,address
</sql>
则可以在其它SQL中,引用该变量;
<select id="getUserByIds" resultType="org.luyangsiyi.test01.bean.User">select <include refid="Base_Column"/> from user where id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach>
</select>
5、set
set关键词一般用在更新中。大部分情况下,更新的字段可能不确定,如果对象中存在该字段的值,就更新该字段,否则不更新。
Integer updateUser(User user);
现在,这个方法的需求,是根据用户id来更新用户的其他属性,所以,user对象中一定存在id,其他属性则不确定,如果其他属性有值,就更新,没值就不处理该字段。
<update id"updateUser" parameterType="org.luyangsiyi.test01.bean.User">update user<set><if test="username!=null">username = #{username},</if> <if test="address!=null">address = #{address},</if></set>where id=#{id};
</update>
五、查询进阶
1、一对一查询
定义一个书本类,包含作者类。
public class Book{private Integer id;private String name;private Author author;//省略getter、setter、toString方法......
}
public class Auther{private Integer id;private String name;private Integer age;//省略getter、setter、toString方法......
}
对应添加两张表,书的属性为id、name、aid,作者的属性为id、name、age。
定义一个接口方法,实现根据id查询书,同时需要范围Auther的信息:
public interface BookMapper{Book getBookById(Integer id);
}
相应的BookMapper.xml为:
<resultMap id="BookWithAuthor" type="....bean.Book"><id column="id" property="id"/><result column="name" property="name"/><association property="author" javaType="...bean.Auther"><id column="aid" property="id"/><result column="name" property="name"/><result column="age" property="age"/> </association>
</resultMap><select id="getBookById" resultMap="BookWithAuther">select book.*, author.age, auther.id, author.name, author.age from book, author where book.aid=author.id and book.id = #{id};
</select>
在实际项目中,每次返回的数据类型可能有部分是相同的,所以可以抽取相同的部分做成公共的模板,然后被其他resultMap继承:
<resultMap id="BaseResultMap" type="...bean.Book"><id column="id" property="id"/><result column="name" property="name"/>
</resusltMap>
<resultMap id="BookWithAuthor" type="....bean.Book" extends="BaseResultMap"><association property="author" javaType="...bean.Auther"><id column="aid" property="id"/><result column="name" property="name"/><result column="age" property="age"/> </association>
</resultMap>
(1)懒加载
如果一对一的属性使用不是很频繁,可能偶尔用一下,则可以启用懒加载。
懒加载,就是先查询book,在查询的过程中不去查询author,当用户第一次调用了book中的author属性后,再去查询author。
需在配置中开启:
<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>
定义一个Book的查询方法:
Book getBookById(Integer id);
Author getAuthorById(Integer id);
在mapper中定义相应的SQL:
<resultMap id="BaseResultMap" type="...bean.Book"><id column="id" property="id"/><result column="name" property="name"/>
</resusltMap>
<resultMap id="BookWithAuthor" type="....bean.Book" extends="BaseResultMap"><association property="author" javaType="...bean.Auther">select="...BookMapper.getAuthorById" column="aid" fetchType="lazy"/></association>
</resultMap>
<select id="getBookById" resultMap="BookWithAuther">select * from book where id = #{id};
</select>
<select id="getAuthorById" resultMap="...bean.Author">select * from author where id=#{aid};
</select>
这里定义association的时候,不直接指定映射的字段,而是指定要执行的方法,通过select字段来指定,column表示执行方法时传递的参数字段,最后的fetchType表示开启懒加载。
2、一对多查询
用户和角色的关系表:
role表:id、name、nameZh;user表:id、username、password、enabled、locked;user_role表:id、uid、rid。
新建两个实体类:
public class User{private Integer id;private String username;private String password;private List<Role> roles;
.....
}
public class Role{private Integer id;private String name;private String nameZh;
.....
}
定义接口方法:
User getUserById(Integer id);
定义该方法的实现:
<resultMap id="UserWithRole" type="...bean.User"?<id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><collection property="roles" ofType="...bean.Role"><id property="id" column="rid"/><result column="name" property="name"/><result column="nameZh" property="nameZh"/></collection>
</resultMap>
<select id="getUserById" resultMap="UserWithRole">select user.*, role.id, role.name, role.nameZh from user, role,user_role where user.id=user_role.uid and role.id=user_role.rid and user.id=#{id};
</select>
3、查询缓存
MyBatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕后会将数据库中查询的数据写到缓存,第二次会从缓存中获取数据,从而提高效率。当一个sqlSession结束后一次缓存也不存在了。MyBatis默认开启一级缓存。
MyBatis二级缓存是多个sqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同 namespace下的sql语句且向sql语句中传递参数也相同,第一次执行完毕后会将结果写入到缓存,第二次直接读取缓存中的结果,需要在settings中配置开启二级缓存。
4、逆向工程
在pom.xml中添加依赖:
<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</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><context id="DB2Tables" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释 --><property name="suppressAllComments" value="true"/></commentGenerator><!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/e3mall"userId="root"password="111"></jdbcConnection><!-- Oracle数据库<jdbcConnection driverClass="oracle.jdbc.OracleDriver"connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"userId="yycg"password="yycg"></jdbcConnection> --><!-- 默认为false,把JDBC DECIMAL 和NUMERIC类型解析为Integer,为true时把JDBC DECIMAL 和NUMERIC类型解析为java.math.BigDecimal --><javaTypeResolver ><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- targetProject:生成POJO类的位置 --><javaModelGenerator targetPackage="cn.e3mall.pojo" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true" /></javaModelGenerator><!-- targetProject:mapper映射文件生成的位置 --><sqlMapGenerator targetPackage="cn.e3mall.mapper" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- targetProject:mapper接口生成的的位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="cn.e3mall.mapper" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- 指定数据表 --><table schema="" tableName="tb_content"></table><table schema="" tableName="tb_content_category"></table><table schema="" tableName="tb_item"></table><table schema="" tableName="tb_item_cat"></table><table schema="" tableName="tb_item_desc"></table><table schema="" tableName="tb_item_param"></table><table schema="" tableName="tb_item_param_item"></table><table schema="" tableName="tb_order"></table><table schema="" tableName="tb_order_item"></table><table schema="" tableName="tb_order_shipping"></table><table schema="" tableName="tb_user"></table><!-- 有些表的字段需要指定java类型 <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" ><property name="useActualColumnNames" value="true"/><generatedKey column="ID" sqlStatement="DB2" identity="true" /><columnOverride column="DATE_FIELD" property="startDate" /><ignoreColumn column="FRED" /><columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /></table> --></context>
</generatorConfiguration>
使用java代码生成:
import java.io.File;
import java.util.*;import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;public class GeneratorSqlmap {public void generator() throws Exception {List<String> warnings = new ArrayList<String>();boolean overwrite = true;// 指定配置文件File configFile = new File("generatorConfig.xml的路径");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);}// 执行main方法以生成代码public static void main(String[] args) {try {GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();generatorSqlmap.generator();} catch (Exception e) {e.printStackTrace();}}
}
SSM---MyBatis相关推荐
- SSM+mybatis单元测试
初学SSM+mybatis单元测试遇到的问题,dao注入后为null Dao层注入失败,查看后,发现注解都写的无误,经朋友的指点, 在测试类上加了一句"@RunWith(SpringJUni ...
- ssm+mybatis+mp
文章目录 Spring 7 Q1:Spring的IOC和DI是什么? Q2:简述Spring中bean对象的生命周期 Q3:简述bean的作用范围 Q4:BeanFactory和FactoryBean ...
- SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能...
关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...
- SSM—mybatis框架-结果处理-resultMap定义-association-collection
文章目录 1.结果处理 1.1.简单类型输出映射! 1.2.pojo对象输出映射! 1.3.定义resultMap 1.4.resultMap使用(association,collection)注意! ...
- SSM—mybatis框架-注解开发-动态sql(where,set,trim,choose,when,foreach)-模糊查询写法-特殊符号处理-缓存
文章目录 2.0.注解 2.1.动态sql 2.1.1.where 2.1.2.set 2.1.3.trim 2.1.3.1.trim的where 2.1.3.2.trim的set 2.1.4.1.c ...
- Java项目:家教管理系统(java+SSM+MyBatis+MySQL+Maven+Jsp)
源码获取:博客首页 "资源" 里下载! 该系统分为前台和后台 前台功能有:登录.注册.查看学员.查看教师.个人中心等. 后台功能有:用户管理.学员管理.教师管理.审核管理.公告管理 ...
- 基于JavaWeb SSM mybatis 学生信息管理系统设计和实现以及文档报告
- 基于JavaWeb SSM mybatis 私人健身房系统管理平台设计和实现以及文档报告
- 基于jsp+Spring+mybatis的SSM企业门户网站设计和实现
本项目演示链接地址 > 前言 人类社会已经迈入了21世纪,信息技术的浪潮也冲击着社会的方方面面.以计算机互联网为核心的科学技术为社会各行各业提供了前所未有的机会和发展潜力.生产业也不例外.互联网 ...
- ssm毕设项目焦虑自测与交流平台k43cf(java+VUE+Mybatis+Maven+Mysql+sprnig)
ssm毕设项目焦虑自测与交流平台k43cf(java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + H ...
最新文章
- 活久见!技术面试官竟然给我出了一个脑筋急转弯,还问我王者荣耀什么段位?...
- python pandas写入数据后保存_python读取MySQL数据使用pandas写入到csv,并保存列名
- [转]Blue Prism Architecture
- [转载] 华中科技大学期刊分类办法
- PostgreSQL 12系统表(5)pg_index
- 【 马哥教育内部文档】-RPM制作指南
- python学习手册-python学习手册第5版pdf
- axure网页预览_解决Axure发布分享预览的3个方法
- 微信翻译生日快乐的代码_微信表情翻译表白代码彩蛋大全 微信表情加符号翻译意思全解...
- 基于mpvue创建微信小程序项目
- 44、Search contract
- w10运行游戏计算机中丢失xinput1-3.dll,WIN10启动游戏由于找不到xinput13dll无法运行如何修复...
- PIPI OJ 1203: PIPI发工资(拓扑排序)
- Unable to start activity com.unionpay.uppay.PayActivity
- Android手机尺寸相关概念
- 打造成功电子商务网站的六大设计准则
- 学习机器人无从下手?带你体会当下机器人热门研究方向有哪些
- 马云的“平头哥”芯片公司,会比董明珠的格力芯片厉害吗?
- Einstein's Riddle 爱因斯坦出的智力题?
- 盲源分离技术 matlab,基于ICA盲源分离的研究及matlab实现(毕业学术论文设计).doc...