一、Mybatis
1、#{}和${}的区别是什么?
2.当实体类中的属性名和表中的字段名不一样 ,怎么办?
二、第一个Mybatis工程
1、搭建环境
- 创建数据库和表
CREATE DATABASE mybatis1;
USE mybatis1;
CREATE TABLE users(
uid INT PRIMARY KEY,
uname VARCHAR(32),
uaccount VARCHAR(32),
upwd VARCHAR(32)
)
- 导入依赖
<!--导入依赖-->
<dependencies>
<!--msql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
- 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {
private long uid;
private String uname;
private String uaccount;
private String upwd;
}
- 创建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">
<configuration>
<!--加载外部配置文件-->
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="com.codewen.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<mappers>
<mapper resource="com/codewen/mapper/UsersMapper.xml"/>
</mappers>
</configuration>
- 创建获取SQLSession的工具类
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
InputStream is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
- 创建mapper
public interface UsersMapper {
List<Users> queryAllUsers();
}
- 创建mapper对应的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="com.codewen.mapper.UsersMapper">
<select id="UsersMapper" resultType="com.codewen.entity.Users">
SELECT * FROM users
</select>
</mapper>
- 创建测试类
public class Test01 {
public static void main(String[] args) {
SqlSession session = SqlSessionUtil.getSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
List<Users> users = mapper.queryAllUsers();
for(Users user : users) {
System.out.println(user);
}
}
}
注册mapper(有三种resource、class、url)
<mappers>
<mapper resource="com/codewen/mapper/UsersMapper.xml"/>
<!--<mapper class="com.codewen.mapper.UsersMapper"/>-->
</mappers>
属性名和字段名不匹配
第一种:修改sql语句,将sql中列的字段名取别名为属性名
第二种:使用resultMap,只需要映射不同的
三、Mybatis基础CURD
select语句回顾
选择,查询语句
<mapper namespace="zsj.dao.UserDao">
<select id="getUserList" resultType="zsj.pojo.User">
select * from user
</select>
</mapper>
- id: 就是对应接口类中的方法名
- resultType: Sql语句执行的返回值!
- paramaterType:函数传递参数的类型
使用paramaterType的例子(查询一个用户)
UserDao添加语句:
// 根据id查询用户
User getUserById(int id);
UserDao.xml添加语句:
<!--根据id查询用户-->
<select id="getUserById" resultType="zsj.pojo.User" parameterType="zsj.pojo.User">
select * from user where id = #{
id}
</select>
测试程序添加语句:
//根据id查询用户
User user = userDao.getUserById(2);
System.out.println(user);
insert
1.UserDao中添加相应的方法
// 插入一个用户
int addUser(User user);
2.UserDao.xml中添加相应的语句
<insert id="addUser" parameterType="zsj.pojo.User">
insert into user(id,uname,pwd)values(#{
id},#{
uname},#{
pwd})
</insert>
3.测试
@Test
public void add(){
SqlSession session = MybatisUtils.getSession();
UserDao userDao = session.getMapper(UserDao.class);
/*
* 插入一个用户
* */
User add = new User(3,"srman","18277407480");
userDao.addUser(add);
//一定要提交事务
session.commit();
List<User> users01 = userDao.getUserList();
for (User ur: users01){
System.out.println(ur.toString());
}
session.close();
}
update
1.UserDao中添加相应的方法
// 修改一个用户
int updateUser(User user);
2.UserDao.xml中添加相应的语句
<update id="updateUser" parameterType="zsj.pojo.User">
update user set uname=#{
uname}, pwd=#{
pwd} where id = #{
id} ;
</update>
3.测试
@Test
public void update(){
SqlSession session = MybatisUtils.getSession();
UserDao userDao = session.getMapper(UserDao.class);
/*
* 插入一个用户
* */
User update = new User(3,"srman","19976253559");
userDao.updateUser(update);
//一定要提交事务
session.commit();
List<User> users01 = userDao.getUserList();
for (User ur: users01){
System.out.println(ur.toString());
}
session.close();
}
四、动态sql及标签
1、sql标签与include标签
使用sql标签可以实现复用sql,id为该sql语句的名称
<sql id="queryAllBooks">
select * from book;
</sql>
sql标签跟include标签进行sql复用
<include refid="queryAllBooks"/>
2、if标签
if标签用法和java中的if很相似,test属性中是判断的内容
<if test="btime != null">
btime=#{
btime}
</if>
<if test="author_array != null and author_array[0] != null">
and bauthor=#{
author_array[0]}
</if>
3、where 标签:where标签用来替代sql中传统的where,一般配合if标签使用。
where标签的作用:
如果where后面没有语句,那么最后的sql不会把where加上
如果where后面有语句,那么会把第一个语句的and去掉
SELECT * FROM book
<where>
<if test="btime != null">
btime=#{
btime}
</if>
<if test="author_array != null and author_array[0] != null">
and bauthor=#{
author_array[0]}
</if>
</where>
4、set标签
set标签用来替代sql中传统的set,一般配合if标签使用
set标签的作用:用于update的sql中,会把末尾多余的逗号去掉
update book
<set>
<if test="bname!=null and bname!=''">
bname=#{
bname},
</if>
<if test="bauthor!=null and bauthor!=''">
bauthor=#{
bauthor},
</if>
<if test="bintroduction!=null and bintroduction!=''">
bintroduction=#{
bintroduction}
</if>
</set>
...
5、bind标签
bind标签就相当于在value值中,把需要的字符拼接好,然后用name中的值去代替拼接好的参数。(一般用于与#{}取值拼接)
使用 bind 拼接字符串不仅可以避免因更换数据库而修改 SQL,也能预防 SQL 注入。
<bind name="bindfparam" value=" '%'+ parameterMap.fparam +'%' "/>
concat(bname,bauthor,bcategory) like #{
bindfparam}
6、foreach标签: 可以迭代对象的属性、数组、集合、对象数组、对象集合,构建in条件语句或者批量操作语句
collection:表示要迭代的对象的属性、数组、集合、对象数组、对象集合
- item:collection中要迭代的单个元素
- open:表示该段语句以什么开头
- close:表示该语句以什么结尾
- separator:表示该语句以什么划分
- index:在list、Set和数组中,index表示当前迭代的位置,在map中,index代指是元素的key,一般不用