MyBatis入门
目录
maven依赖
- junit 4.11 测试用
- mysql-connector-java 5.1.17 连接mysql
- mybatis 3.2.7 框架
- log4j 1.2.17 日志记录
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
依赖相关的配置
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis 核心配置
<?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 resource="jdbc.properties">
<property name="jdbc.username" value="root1"/>
<property name="jdbc.password" value="root"/>
</properties>
<typeAliases>
<!-- 单个别名定义,别名的使用,不区分大小写 -->
<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->
<!-- 别名包扫描器:别名是类的全称,不区分大小写,推荐方式 -->
<package name="com.itheima.mybatis.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<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>
<!-- 映射文件包扫描,推荐方式:
1、接口文件必须与映射文件同一目录下
2、接口文件名称必须与映射文件的名称一致 -->
<package name="com.itheima.mybatis.mapper"/>
</mappers>
</configuration>
user.xml映射查询xml
首先创建好User的pojo类(domain/bean)
<?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="user">
<!--
id是之后java中唯一标识
parameterType:之后调用要传回的参数类型
resultType:返回的结果类型(如果是list也是用list中每个单一的元素
变量的使用: #{id} 如果参数类型是普通值,大括号中的变量名可以任意命名
'${value}' 如果参数是String,则一定要用${value},用单引号'',前后可自由增加字符串如'%${value}%'
关于在插入数据中,将自动生成的主键返回给对象的用法
1. <insert (省略id/parameterType) useGeneratedKeys="true" keyProperty="id">
2. 增加以下语块,赋值是调用mysql中的函数LAST_INSERT_ID(),order表示执行顺序,after为在插入执行完之后再操作,如果是主动设置UUID,则要改为before
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
-->
<select id="getUserById" parameterType="int" resultType="cn.edu.zju.mybaits.pojo.User">
SELECT `id`,
`username`,
`birthday`,
`sex`,
`address`
FROM
`user`
WHERE id = #{id}
</select>
<select id="getUserByUserName" parameterType="string" resultType="cn.edu.zju.mybaits.pojo.User">
SELECT `id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
WHERE username LIKE '%${value}%'
</select>
<!--插入用户-->
<insert id="insertUser" parameterType="cn.edu.zju.mybaits.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!--<selectKey keyProperty="id" resultType="int" order="AFTER">-->
<!--SELECT LAST_INSERT_ID()-->
<!--</selectKey>-->
INSERT INTO `user`
(`username`,
`birthday`,
`sex`,
`address`
)
VALUES
(#{username},
#{birthday},
#{sex},
#{address}
);
</insert>
<update id="updateUser" parameterType="cn.edu.zju.mybaits.pojo.User">
UPDATE
`user`
SET
`username` = #{username}
WHERE `id` = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM `user`
WHERE
`id` = #{Id} ;
</delete>
</mapper>
java类
工具类 SqlSessionFactoryUtils
//不把SqlSession放进来是因为官方推荐SqlSession单独线程
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//创建核心配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
//sqlSessionFactory单例
return sqlSessionFactory;
}
}
增删改查代码
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = sqlSession.selectOne("user.getUserById", id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String userName) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> list = sqlSession.selectList("user.getUserByUserName", userName);
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
/*
* SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession()
* openSession()里面没写true,则最后要提交事件 sqlSession.commit()
*/
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
sqlSession.insert("user.insertUser", user);
sqlSession.close();
}
}