mybatis的crud、参数、结果集
mybatis的crud、参数、结果集
mybatis的基本增删改查
查询操作(切记要有返回值)
UserDao
public interface UserDao {
/**
* 查询所有用户
* @return
*/
public List<User> findAll();
}
UserDao.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="cn.lingnan.dao.UserDao">
<select id="findAll" resultType="cn.lingnan.domain.User">
SELECT * FROM USER;
</select>
</mapper>
添加操作(切记要提交事务)
UserDao
/**
* 添加用户信息
* @param user
*/
public void saveUser(User user);
UserDao.xml
<!--添加用户-->
<insert id="saveUser" parameterType="cn.lingnan.domain.User">
INSERT INTO USER
(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address});
</insert>
删除操作(切记要提交事务)
UserDao
/**
* 添加用户信息
* @param user
*/
public void saveUser(User user);
UserDao.xml
<!--删除用户信息-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM USER WHERE ID = #{id};
</delete>
查询单个用户信息操作(返回+传参)
UserDao
/**
* 添加用户信息
* @param user
*/
public void saveUser(User user);
UserDao.xml
<!--删除用户信息-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM USER WHERE ID = #{id};
</delete>
模糊查询操作
使用模糊查询的方式有两种
第一种:#{username},在使用的时候对字符串进行拼接
第二种:’%${value}%’ 无需拼接字符串
UserDao
/**
* 添加用户信息
* @param user
*/
public void saveUser(User user);
UserDao.xml
<!--姓名模糊查询用户信息-->
<select id="findByName" parameterType="java.lang.String" resultType="cn.lingnan.domain.User">
(常用)方式一:SELECT * FROM USER WHERE username LIKE #{username}
方式二:SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
为何更常用的是#{}而不是${}后面会说明
Test(测试类)
@Test
public void testFindByName(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("%");
stringBuilder.append("林");
stringBuilder.append("%");
List<User> byName = userDao.findByName(stringBuilder.toString());
for (User user : byName) {
System.out.println(user);
}
查询总记录数
UserDao
/**
* 查询用户总记录数
* @return
*/
public Integer findTotal();
UserDao.xml
<!--姓名模糊查询用户信息-->
<!--查询总记录数-->
<select id="findTotal" resultType="java.lang.Integer">
SELECT COUNT(ID) FROM USER;
</select>
Test(测试)
@Test
public void testFindTotal(){
UserDao userDao = sqlSession.getMapper(UserDao.class);
Integer total = userDao.findTotal();
System.out.println(total);
}
#{xxx}和’${xxx}’的区别
使用’${xxx}'的日志分析
使用#{xxx}的日志分析
查询日志+网上翻阅资料发现两者区别
使用#{xxx}的方式可以防止SQL注入,而使用’${}'不可以防止SQL的注入
(尽量使用#{}的方式进行开发)
OGNL表达式
Object | Graphic | Navigation | Language |
---|---|---|---|
对象 | 图 | 导航 | 语言 |
什么是OGNL表达式?
它是通过对象的取值来获取数据。在写法上把get给忽略了
比如:我们获取用户的名称
类中的写法:user.getUsername();
ONGL表达式写法:user.username
mybatis中为什么能直接写username,而不用user.呢
因为在parameterType中已经提供了属性所属的类,所有此时不需要写对象名
OGNL模糊查询
QueryVo
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
UserDao
/**
* 根据queryVo
*/
public List<User> findUserByVo(QueryVo queryVo);
UserDao.xml
<!--根据QueryVo查询用户对象-->
<select id="findUserByVo" parameterType="cn.lingnan.domain.QueryVo" resultType="cn.lingnan.domain.User">
select * from user where username like #{user.username};
</select>
Test(测试类)
@Test
public void testFindUserByVo(){
User user = new User();
user.setUsername("%林%");
QueryVo queryVo = new QueryVo();
queryVo.setUser(user);
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userByVo = userDao.findUserByVo(queryVo);
for (User user1 : userByVo) {
System.out.println(user1);
}
解决实体类属性和数据库列名不对应两种方式
方式一(执行效率高、开发慢)
解决方法:在userDao.xml中查询给指定的列查别名
方式二(使用mybatis方式:执行效率慢、开发快)
解决方法:
1.在userDao.xml中配置字段对应信息
2.修改resultType为resultMap= 配置字段信息的id
<!--配置 查询结果的列名和实体类的属性名的对应关系-->
<resultMap id="user" type="cn.lingnan.domain.User">
<!--主键字段的对应-->
<id property="userId" column="id"></id>
<!--非主键字段对应-->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
在mybatis中实现dao的实现类(了解)
查询所有用户
UserDaoImpl
/**
* 查询所有测试
* @throws IOException
*/
@Test
public void testFindAll() throws IOException {
UserDao userDao = new UserDaoImpl(sqlSession);
List<User> all = userDao.findAll();
for (User user : all) {
System.out.println(user);
}
Test(测试)
/**
* 查询所有测试
* @throws IOException
*/
@Test
public void testFindAll() throws IOException {
UserDao userDao = new UserDaoImpl(sqlSession);
List<User> all = userDao.findAll();
for (User user : all) {
System.out.println(user);
}
Properties标签的使用以及细节
jdbcConfig.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
username=用户名
password=密码
SqlMapConfig.xml
<!--配置properties
可以在标签内部配置连接数据库信息。也可以通过属性引用外部配置文件信息
resource属性:
用于指定配置文件的位置,是按照类路径的写法来写,并且存放于该类路径下。
-->
<properties resource="jdbcConfig.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<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>
properties配置注意事项
Resource属性(常用)
用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下。
Url属性:
是要求按照url的写法来写地址
URL:Uniform Resource Locator 同一资源定位符。它是可以唯一标识一个资源的位置。
它的写法:
http://localhost:8080/mabatis/Demo1
协议 主机 端口 URI
URI:Uniform Resource Identifier 同一资源标识符。它是在应用唯一定位一个资源的
TypeAliases标签和package标签(节省代码)
封装实体类
<typeAliases>
<!--typeAlias-->
<!--使用typeAliases配置别名,它只能配置domain中类的别名-->
<!--<typeAlias type="cn.lingnan.domain.User" alias="user"></typeAlias>-->
<!--用于指定要配置别名的包,当指定后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="cn.lingnan.domain"/>
</typeAliases>
在mappers中配置,自动识别dao
<mappers>
<!--package标签用于指定dao接口所在的包,当执行完成后就不需要再写mapper以及resource或者class了-->
<package name="cn.lingnan.dao"/>
</mappers>