准备工作
首先从github里【https://github.com/mybatis/mybatis-3】里下载mybatis,里面有个pdf说明文档,文档详细介绍了mybatis所涉及到的所有内容。开发的过程中,我们需要参考这个文档。
在eclipse里新创建一个maven项目,并添加响应的依赖包
(1)servlet的依赖包
(2)mybatis的依赖包
(3)mysql数据库依赖包
(4)log4j日志依赖包(slf4j和log4j)
(5)junit单元测试依赖包
pom.xml配置文件内容如下:
<dependencies>
<!-- 添加servlet的依赖包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 添加mybatis的依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 加入mysql数据库依赖包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 添加log4j依赖包(slf4j和log4j) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.20</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- junit单元测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
添加日志配置文件log4j.properties,内容如下:
log4j.rootLogger=DEBUG,Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
mybatis入门增删改查
对于mybatis开发内容来说,其实就是一个全局配置文件和N个mapper.xml映射文件以及sql查询结果所需要映射的的pojo实体类。
接下来以用户信息的增删改查功能来进行配置开发。
全局配置文件sqlMapConfig.xml
创建一个mybatis的全局配置文件sqlMapConfig.xml【内容可从mybatis的pdf说明文档里copy过来】
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>
<!-- environments指的是mybatis运行环境,目前单独使用mybatis做测试时,需要在该环境中配置数据源。
当mybatis与spring整合后,这一块内容则被废弃了。因为数据源等环境都交由了spring来管理
-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="888"/>
</dataSource>
</environment>
</environments>
</configuration>
根据id查询用户信息
映射文件(user.xml)
需要在映射文件中配置sql语句
<?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">
<!-- namespace命名空间,作用是对sql语句进行分类管理
附加说明:如果以后用到mapper代理开发,则这里的namespace内容必须与代理类的全路径一致
如果其他配置文件(namespace=yyy)也有一个id值叫findUserById,那么这个时候,就要使用命名空间来区别
java外部要使用某个findUserById查询时,就要用xxx.findUserById 或 yyy.findUserById 来获取对应的sql配置
-->
<mapper namespace="xxxx">
<!-- 通过select来执行数据库的查询
id:用于标识映射文件中的sql语句
#{}:表示占位符
#{id}:其中的id表示接收输入的参数,如果输入参数是简单类型,#{}中的参数名称可以任意
parameterType:指定输入参数类型,目前这里是字符串类型
parameterMap:早期版本,目前已废弃不用
resultType:指定sql查询输出结果所映射的java对象类型,这里是返回一个user对象
-->
<select id="findUserById" parameterType="java.lang.String" resultType="pojo.User">
select * from tab_user where id=#{id}
</select>
</mapper>
pojo类(User.java)
public class User {
private String id;
private String userName; //用户名
private String nickName; //昵称
private String password; //登录密码
private Integer sex; //性别
private Date birthday; //出生日期
private String province; //省
private String city; //市
private String county; //县
private Date createTime; //创建时间
/** get、set 方法*/
在sqlMapConfig.xml中配置加载user.xml文件
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlMap/user.xml"/>
</mappers>
项目结构
测试
根据昵称模糊查询用户信息
配置文件
使用user.xml配置文件,在配置文件里添加如下配置代码:
<!-- 根据昵称模糊查询用户信息
resultType:指定的是单条记录所映射的java对象类型,虽然这里查询出来的结果集是list
但是仍然设置resultType为对象类型
如果这里使用#{value}占位符来接收输入参数,那么java代码里就得程序员自己加上%传进来,
如:List<User> userList = sqlSession.selectList("xxxx.findUserByName", "%卡%");
平时一般都不会使用这种方式来进行传值,我们应该把%放到配置文件中,此时需要用到${}
${}:表示拼接sql串,将接收到的参数内容不加任何修饰拼接到sql语句中
使用${}拼接sql,可能会引起sql注入。
${value}:接收传入参数的内容,如果传入参数是简单类型,${}里面只能为value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="pojo.User">
select * from tab_user where nickName like '%${value}%'
</select>
代码测试
添加用户信息
配置文件
在user.xml中添加新增用户的sql配置
自增主键的返回
<!-- 新增用户
parameterType:指定输入参数类型是pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
实际情况中,插入新记录后可能需要用到主键id,此时需要使用到selectKey来配置主键返回
(1)自增主键返回:mysql自增主键,是执行insert提交之前主动生成一个自增主键,可以通过
mysql函数获取到刚刚插入的主键id
-->
<insert id="addUser" parameterType="pojo.User">
<!-- 将插入数据的主键返回,返回到user对象中
select LAST_INSERT_ID();获取到insert进去的记录主键值,只适用于自增主键
keyProperty:将查询到的主键值设置到parameterType指定的对象的某个属性
order:select LAST_INSERT_ID()的执行顺序,BEFORE表示在insert语句之前执行,AFTER则反之
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into tab_user (userName,nickName,`password`,sex)
values (#{userName},#{nickName},#{password},#{sex})
</insert>
非自增主键返回
<!-- 新增用户
parameterType:指定输入参数类型是pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
实际情况中,插入新记录后可能需要用到主键id,此时需要使用到selectKey来配置主键返回
(1)自增主键返回:mysql自增主键,是执行insert提交之前主动生成一个自增主键,可以通过
mysql函数获取到刚刚插入的主键id
-->
<insert id="addUser" parameterType="pojo.User">
<!-- 将插入数据的主键返回,返回到user对象中
使用mysql的UUID()方法获取主键值
keyProperty:将查询到的主键值设置到parameterType指定的对象的某个属性
order:select UUID()的执行顺序,BEFORE表示在insert语句之前执行,AFTER则反之
-->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
<!-- 这里可以根据项目需求设置主键的生成规则 -->
select UUID()
</selectKey>
insert into tab_user (id,userName,nickName,`password`,sex)
values (#{id},#{userName},#{nickName},#{password},#{sex})
</insert>
代码测试
当前数据库表的id是uuid生成的,故这里只对非自增主键的例子进行测试
更新用户信息和删除用户信息
配置文件
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="pojo.User" >
update tab_user set userName=#{userName},`password`=#{password} where id=#{id}
</update>
<!-- 根据id删除用户信息 -->
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete tab_user where id=#{id}
</delete>