首页 > 代码库 > Mybatis入门案例
Mybatis入门案例
Mybatis入门程序
1. 创建java工程, 导入jar包
其中:mybatis-3.2.7.jar为mybatis的主要jar包, 剩下的为一些依赖的jar包、日志记录的jar包和数据库驱动jar包
2.配置log4j日志记录文件
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:/hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ###
log4j.rootLogger=info, stdout
3. 配置Mybatis核心配置文件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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="http://www.mamicode.com/com.mysql.jdbc.Driver" />
<property name="url" value="http://www.mamicode.com/jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="http://www.mamicode.com/root" />
<property name="password" value="http://www.mamicode.com/123" />
</dataSource>
</environment>
</environments>
<!-- 配置mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
4.配置pojo数据java类
package cn.rodge.entity;
import java.util.Date;
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
5.配置实体类的映射文件
在根目录下,某个包内创建sql映射文件User.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">
<mapper namespace="demo">
<!-- 根据id获取用户信息
parameterType:定义输入到sql中的映射类型,
#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
-->
<select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
SELECT * from `user` where id = #{id}
</select>
</mapper>
6.加载映射文件
在Mybatis核心配置文件sqlMapConfig.xml中添加映射文件的引用
<!-- 配置mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
7.在User.xml中添加查询信息
<!-- 根据id获取用户信息
parameterType:定义输入到sql中的映射类型,
#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
-->
<select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
SELECT * from `user` where id = #{id}
</select>
注:如果parameterMap中的值是基本数据类型, 那么#{}中的变量名可以为任意值;
如果parameterMap中的值是POJO,那么#{}中的变量名必须为POJO的属性名
8.创建java测试类
package cn.rodge.mybatis.firstDemo;
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;
import org.junit.Test;
import cn.rodge.entity.User;
public class MybatisFirstDemo {
@Test
public void demo1 () throws IOException {
//1创建sessionfactorybuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//2获取核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//3加载核心配置文件,创建sessionfactory
SqlSessionFactory sessionFactory = factoryBuilder.build(inputStream);
//4创建sqlsession
SqlSession sqlSession = sessionFactory.openSession();
//5执行查询
User user = sqlSession.selectOne("findUserById", 1);
//6释放资源
System.out.println(user);
sqlSession.close();
}
}
9. 代码抽取
package cn.rodge.mybatis.firstDemo;
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;
import org.junit.Before;
import org.junit.Test;
import cn.rodge.entity.User;
public class MybatisFirstDemo {
private SqlSessionFactory sessionFactory = null;
@Before
public void init () throws IOException {
//1创建sessionfactorybuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//2获取核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//3加载核心配置文件,创建sessionfactory
sessionFactory = factoryBuilder.build(inputStream);
}
@Test
public void findUserById () {
//4创建sqlsession
SqlSession sqlSession = sessionFactory.openSession();
//5执行查询
User user = sqlSession.selectOne("findUserById", 1);
//6释放资源
System.out.println(user);
sqlSession.close();
}
}
10.模糊查询
<!-- 模糊查询
${}是用作字符串的拼接的
如果parameterType的值为简单数据类型,那么${} 变量名必须为value
如果parameterType的值为自定义POJO,那么${}的变量名必须为pojo的属性名
-->
<select id="findUserByName" parameterType="string" resultType="cn.rodge.entity.User">
SELECT * FROM `user` where username LIKE ‘%${value}%‘
</select>
注:${}存在sql注入的风险,而#{}不存在这种问题
@Test
public void findUserByName () {
//获取sqlsession
SqlSession sqlSession = sessionFactory.openSession();
//调用sqlsession中的方法进行查询
List<User> list = sqlSession.selectList("findUserByName", "张");
//打印结果
System.out.println(list);
//释放资源
sqlSession.close();
}
11. #{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
12. parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
13. 添加用户
user.xml中的配置
<!-- 插入数据 -->
<insert id="insertUser" parameterType="cn.rodge.entity.User">
INSERT INTO user (username, birthday, sex, address) VALUES (#{username}, #{birthday}, #{sex}, #{address})
</insert>
java代码
@Test
public void insertUser () {
//获取sqlsession
SqlSession sqlSession = sessionFactory.openSession();
User user = new User();
user.setUsername("小乔");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("动物");
//执行插入操作
sqlSession.insert("insertUser", user );
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
14. 主键返回
User.xml中配置参数
<!-- 插入数据 -->
<insert id="insertUser" parameterType="cn.rodge.entity.User">
<!--
主键返回
keyProperty:返回的主键存储在pojo中的哪个属性
resultType:返回的主键类型;
order:BEFORE表示在插入之前查询主键(UUID)
AFTER表示在插入之后查询主键(主键自增长)
-->
<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>
Java代码
@Test
public void insertUser () {
//获取sqlsession
SqlSession sqlSession = sessionFactory.openSession();
User user = new User();
user.setUsername("王昭君");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("西安");
//执行插入操作
sqlSession.insert("insertUser", user );
//打印插入的主键
System.out.println(user.getId());
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
15.删除操作
<!-- 删除数据 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
@Test
public void deleteUser () {
//获取sqlsession
SqlSession sqlSession = sessionFactory.openSession();
//执行删除
sqlSession.delete("deleteUser", 40);
//提交事物
sqlSession.commit();
//释放资源
sqlSession.close();
}
16. 更新操作
<!-- 更新操作 -->
<update id="updateUser" parameterType="cn.rodge.entity.User">
UPDATE user SET username = #{username} WHERE id = #{id}
</update>
@Test
public void updateUser () {
//获取sqlsession
SqlSession sqlSession = sessionFactory.openSession();
//创建待跟新的数据
User user = new User();
user.setId(27);
user.setUsername("张角");
//更新操作
sqlSession.update("updateUser", user );
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
Mybatis入门案例