mybatis 中的 占位符 #{},它还有一个功能,可以取值
1.如果传入的参数为 非常用类型(常用类型 8种基本数据类型 和 String类型)。 占位符中的名称就是对象类型中的属性。
${value} 是mybatis 拼接符 里面的value值是固定的 一般不用,因为mybatis 底层不会采用 预编译sql .不安全。防不住sql注入
-->
1.如果传入的参数为 非常用类型(常用类型 8种基本数据类型 和 String类型)。 占位符中的名称就是对象类型中的属性。
2.如果掺入参数是 常用类型,并且只有一个参数,#{随便写}
增删改查是没有resultname的这个属性的
- Mapper.xml映射文件中的namesapce的值要跟mapper接口全路径一致
- Mapper.xml 映射文件中的 crud标签中的id 要跟Mapper接口定义的方法名一致
- Mapper.xml 映射文件的位置要跟Mapper接口的位置一致 同包下
namespace="com.xingxue.mybatis.mapper.UserMapper"
id="addUser" public void addUser(UserModel model)
select查询标签多一个属性 <select id="getLognameAndPassword" resultType="com.xingxue.mybatis.model.UserModel"> <insert id="addUser">
INSERT INTO TB_USERINFO (LOGNAME,PASSWORD)VALUES(#{logname},#{password})
</insert>
<!--#{} 没有拼接的特点${value} 是mybatis 拼接符 里面的value值是固定的 一般不用,因为mybatis 底层不会采用 预编译sql .不安全。防不住sql注入
-->
<select id="getUsersLike" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO WHERE LOGNAME LIKE CONCAT('%',#{likename},'%') mysql的拼接符
</select>
<!--只有select 标签才有 resultType 属性,该属性用于mybatis 查询完数据后,使用的什么类型来封装一条记录-->
id>>就是跟接口里面的方法名一致 resultname>>跟类名的路径一致 <select id="getUserById" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO WHERE USERID = #{ID}
</select>
如果传入的值在两个及其以上,那么我们用注解@prarm
接口里面的方法的定义,后面绑定xml的时候,直接取V1放在
public UserModel getLognameAndPassword(@Param("v1") String logname,@Param("v2") String password);
根据 名字和密码查询 多个值查询的话要用注解 后面带入的时候直接用注解的值带入
<select id="getLognameAndPassword" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO WHERE LOGNAME = #{v1} AND PASSWORD = #{v2}
</select>
mabatis增删改查的规范
一 导入pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xingxue.mybatis</groupId>
<artifactId>mybatis-day1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 配置 mybatis 核心依赖 记住一定要导入完全才可以使用依赖,如果出现cannot resolve symbol 就是没有导包完整-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- 导入log4j 日志包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
二、配置文件做好
<?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>
<!-- 配置的SqlMapConfig.xml文件 称为 核心配置文件(mybatis 框架运行时要首先加载该配置文件)-->
<!--
1.事务管理
2.连接池
2.1 配置 连接数据库的连接信息(url user password driver)
3.引入外部的映射文件-->
<environments default="d1">
<environment id="d1">
<!--1.JDBC 事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 2.连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///xingxue27"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 3.引入外部的映射文件 映射的是select查询的UserMapper.xml-->
<mappers>
<mapper resource="com/xingxue/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
三、写好接口
package com.xingxue.mybatis.mapper;
import com.xingxue.mybatis.model.UserModel;
import com.xingxue.mybatis.util.SeesionUtil;
import org.apache.ibatis.annotations.Param;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
public interface UserMapper {
public void addUser(UserModel model) throws IOException ;
public void updateUser(UserModel model) throws IOException;
public void deleteUser(Long id) throws IOException ;
public UserModel getUserById(Long id);
public List<UserModel> getUsers();
public UserModel getLognameAndPassword(@Param("v1") String logname,@Param("v2") String password);
public List<UserModel> getUsersLike(String likeName);
//通过 logname 和 password 来查询用户 通过键值对的方式传入的,我们在测试的时候要以键值对的方式存入才行
public List<UserModel> getUsersIds(Map<String,Object> map);
//求表中有多少记录
public Long getCounts();
public int getcounts();
public Map<String,Object> getMapById(Long id);
}
这个配置文件跟UserMapper是在同一件包下面的
<?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.xingxue.mybatis.mapper.UserMapper">
<!--该配置文件称为 mapper 映射文件,文件的是 数据操作类(UserMapper)中方法 跟 sql 之间的映射关系-->
<!--映射 插入的操作
mybatis 中的 占位符 #{},它还有一个功能,可以取值
1.如果传入的参数为非常用类型 占位符中的名称就是对象类型中的属性。
2.如果掺入参数是 常用类型 (常用类型 8种基本数据类型 和 String类型),并且只有一个参数,#{随便写}
-->
<insert id="addUser">
INSERT INTO TB_USERINFO (LOGNAME,PASSWORD)VALUES(#{logname},#{password})
</insert>
<update id="updateUser">
UPDATE TB_USERINFO SET LOGNAME = #{logname},PASSWORD=#{password} WHERE USERID = #{userid}
</update>
<delete id="deleteUser">
因为前面的参数是Long id 是常用数据类型 所以这里可以随便写,但是为了规范我们尽量取有意义的名字
DELETE FROM TB_USERINFO WHERE USERID = #{IDDFJDLFJDLFDJLDJLDJ}
</delete>
<select id="getUsers" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO
</select>
<select id="getLognameAndPassword" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO WHERE LOGNAME = #{v1} AND PASSWORD = #{v2}
</select>
<!--#{} 没有拼接的特点
${value} mybatis 拼接符 一般不用,因为mybatis 底层不会采用 预编译sql .不安全。防不住sql注入
-->
<select id="getUsersLike" resultType="com.xingxue.mybatis.model.UserModel">
数据库的拼接符函数concat('%',#{},'%')
SELECT * FROM TB_USERINFO WHERE LOGNAME LIKE CONCAT('%',#{likename},'%')
</select>
<select id="getUsersIds" resultType="com.xingxue.mybatis.model.UserModel">
如果数据里面的名字是usersid,然而我们模型里面写错了写成了userid跟数据库里面的不一致,我们可以通过取别名的方式达到跟数据库的一致
SELECT userid as usersid FROM TB_USERINFO WHERE LOGNAME = #{name} AND PASSWORD = #{pass}
</select>
<select id="getCounts" resultType="long">
SELECT COUNT(*) FROM TB_USERINFO
</select>
<select id="getMapById" resultType="hashmap">
SELECT * FROM TB_USERINFO WHERE USERID = #{ID}
</select>
<!--只有select 标签才有 resultType 属性,该属性用于mybatis 查询完数据后,使用的什么类型来封装一条记录-->
<select id="getUserById" resultType="com.xingxue.mybatis.model.UserModel">
SELECT * FROM TB_USERINFO WHERE USERID = #{ID}
</select>
</mapper>
三。写model 注意和数据库的一致 如果后面发现和数据库里面的值不一致的时候,我们可以通过写别名的方式来达到效果
package com.xingxue.mybatis.model;
public class UserModel {
private Long userid;
private String logname;
private String password;
public Long getUserid() {
return userid;
}
public void setUserid(Long userid) {
this.userid = userid;
}
public String getLogname() {
return logname;
}
public void setLogname(String logname) {
this.logname = logname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserModel{" +
"userid=" + userid +
", logname='" + logname + '\'' +
", password='" + password + '\'' +
'}';
}
}
四、帮助类
package com.xingxue.mybatis.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SeesionUtil {
private static final SqlSessionFactory factory;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"));
}catch (Exception e){
throw new RuntimeException(e);
}
}
public static SqlSession getSession(){
return factory.openSession();
}
}
32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。