6、CRUD
1、namespace
namespace中的包名与接口名一致
2、select
- id:就是对应的namespace中的对应的方法
- resultType:sql语句的返回值
- parameterType:参数类型
增删改必须提交事务!!!!!
a、接口
//查询全部用户 List<User> getUserList(); //根据id查询用户 List<User> getUserById(int id); //insert一个用户 int addUser(User user); //修改用户 int Update(User user); //删除用户 int delete(int id); }
b、在mapper里面写好sql
<select id="getUserList" resultType="com.hls.pojo.User"> select * from name.info; </select> <select id="getUserById" parameterType="int" resultType="com.hls.pojo.User"> select * from name.info where id = #{id}; </select> <insert id="addUser" parameterType="com.hls.pojo.User"> insert into name.info (name,address,ago,birthday) values(#{name},#{address},#{ago},#{birthday}); </insert> <update id="Update" parameterType="com.hls.pojo.User"> update name.info set birthday = #{birthday} where id = #{id}; </update> <delete id="delete" parameterType="int"> delete from name.info where id = #{id}; </delete>
c、测试
@Test public void test(){ //第一步,获得SqlSession对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); try{ //执行SQl 方式一:getMapper UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } }finally { //关闭SqlSession对象 sqlSession.close(); } } @Test public void test1(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); } @Test public void AddUser(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Date date = new Date(); User user = new User("hls123","13","gds",date.toString()); mapper.addUser(user); //提交事物 sqlSession.commit(); //关闭连接 sqlSession.close(); } @Test public void Update(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Date date = new Date(); User user = new User(1,"kakejekjrl","12222","\zonghsnashi",date.toString()); mapper.Update(user); sqlSession.commit(); sqlSession.close(); } @Test public void delete(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.delete(2); sqlSession.commit(); sqlSession.close(); }
3、update
提交事务 3 4 5 !!!!
4、insert
5、delete
6、Map
- 接口:
User getUserByIdAndname(Map<String,Object> map);
- xml
<select id="getUserByIdAndname" resultType="com.hls.pojo.User"> select *from name.info where id =#{id} and name = #{name} </select>
- 测试类
@Test public void selectMember(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> objectObjectHashMap = new HashMap<>(); //通过mapper找到map的key然后匹配value objectObjectHashMap.put("id",1); objectObjectHashMap.put("name","huangl"); User userByIdAndname = mapper.getUserByIdAndname(objectObjectHashMap); System.out.println(userByIdAndname); sqlSession.close(); }
- Map传参在sql中传参即可
在mapper中,会根据sql里面的字段选取对应的key来获取值,来进行判断
- 多参数用Map或者注解连接
7、别名
在MyBatis-config.xml里面配置
<!--别名-->
<typeAliases >
<!--单独设置某个别名-->
<!-- <typeAlias type="com.hls.pojo.User" alias="User"/>-->
<!--对包进行扫描,批量设置,规则:首字母变为小写-->
<package name="com.hls.pojo"/>
</typeAliases>
但是好像有点乱,后来在mapper.xml使用的时候混乱了,清空了缓存后重启编译器解决问题
- 注意:在mapper.xml里面使用的时候要注意,第二种定义别名的方法,扫描后,默认首字母小写
@Alias("user") //注解别名
public void test(){
...
}
8、resultMap(属性名和字段名不一样的问题)
<!--
resultMap 结果集
左边是实体类的属性名称
右边是表里面的列名称
-->
<resultMap id="huang" type="com.hls.pojo.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="ago" column="ago"/>
<result property="address" column="address"/>
<result property="birthday" column="birthday"/>
</resultMap>
<!-- 不使用resultMap
<select id="getUserList" resultType="com.hls.pojo.User">-->
<!-- select * from name.info;-->
<!-- </select>-->
<select id="getUserList" resultMap="huang">
select * from name.info;
</select>
结果集:字段较多的时候可以使用结果集,方便管理无需与pojo对应属性名
9、模糊查询
- sql
<select id="getUserLike" resultType="com.hls.pojo.User"> select * from info where name like "%"#{value}"%"; user_name like concat('%',#{str},'%') </select>
- 接口
List<User> getUserLike(String value);
- 测试类
@Test public void testLike(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userLike = mapper.getUserLike("黄");//("%黄%") 也可以 for (User temp : userLike) { System.out.println(temp.toString()); } }
**防止sql注入,直接在xml里面加上通配符,虽然在测试类里面也可以,但是会有sql注入的风险 or 1=1 **
10、配置解析
1、核心配置文件
-
MyBatis-config.xml
标签有顺序,不能够随意乱放,报错之后可以去看看是不是顺序问题
2、环境配置(environments)
+ MyBatis可以配置成适应多种环境
<!--核心配置-->
<configuration>
<environments default="development"> <!--defalu-->
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml文件都需要在MyBatis核心配置文件中注册-->
<mappers>
<mapper resource="com/hls/dao/UserMapper.xml"/>
</mappers>
</configuration>
-
defalut:默认环境
当环境里面有多个环境时,默认处填写哪一个环境配置,就使用该环境
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
-
transactionManager:事务管理器
有两个,一个是JDBC(常用),另一个是MANAGED**(若是Spring+MyBatis就没有必要配置事务管理器)**
-
dataSource:数据源
有三个,一个是UNPOOLED,第二个是POOLED(默认),第三个是JNDI
3、属性(properties)
-
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递{db.properties}
-
优化配置环境时候的配置
<!--引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<environments default="development">
<environment id="development">
<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>
- db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true
username=root
password=123456
- 外部文件优先级更高
11、映射器(mappers)
- MapperRegistry:注册绑定我们的Mapper文件
resource、url、class
1、使用resource注册绑定
<mappers>
<mapper resource="com/hls/dao/UserMapper.xml"/>
</mappers>
2、使用class注册绑定
<mappers>
<mapper class="com.hls.dao.UserMapper"/>
</mappers>
- 使用class的注意点:
- 接口和他的Mapper必须同名
- 接口和他的Mapper必须在同一包下
3、使用package注册绑定
扫描包进行注入绑定
<mappers>
<package name="com.hls.dao.UserMapper"/>
</mappers>
- 和2的注意点相同
12、生命周期和作用域
1、执行过程:
- 错误的使用会导致很严重的并发问题
2、SqlSessionFactoryBuilder:
- 一旦创建了SQLSessionFactory对象,就不再需要它了
- 局部变量
3、SqlSessionFactory:
- 可以想象为:数据库连接池
- 需要一直存在,没有理由丢弃或者重建,多次重建会被视为代码的坏味道(bad smell)
- 全局变量
- 最简单的就是使用单例模式或者静态单例模式
4、SqlSession:
- 连接连接池的请求
- 关闭请求
- 最佳作用域是放在方法中
- 用完之后赶紧关闭,否则资源被占用
5、连接模式
- 一个Mapper代表一个业务
13、日志
1、日志工厂
出现错误,排错,可用日志
- log4j
- Stdout_logging
- 标准日志输出
<!-- <settings>-->
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!-- </settings>-->
MyBatis-config核心配置文件里面配置
2、log4j
1、导包(maven)
2、控制日志的输出格式、输出位置、等级
3、可以根据配置文件修改,不需要修改代码
4、写log4j.properties
- 可以在主配置文件中设置(setting)在测试类里面导包,就可以用logger对象来记录日志
14、分页
1、Limit
select *
from info
limit 0,14;
limit startIndex , 每页显示的行数
limit 每页显示的行数 —> limit 0 , 每页显示的行数
2、MyBatis分页(SQL)
-
接口
List<User> getUserByLimit(Map<String,Integer> map);
-
Mapper.xml
<select id="getUserByLimit" resultType="com.hls.pojo.User" parameterType="map"> select * from info limit #{startIndex},#{pageSize}; </select>
-
测试
@Test public void testLimit(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String,Integer> objectObjectHashMap = new HashMap<>(); objectObjectHashMap.put("startIndex",0); objectObjectHashMap.put("pageSize",3); List<User> userByLimit = mapper.getUserByLimit(objectObjectHashMap); System.out.println(userByLimit); sqlSession.close(); }
3、RowBound分页
new RowBound().var
在测试类里面sqlsession.selectList(“com.hls.dao.UserMapper.get…”,null,rowbound);
再用for循环增强型遍历输出
4、分页插件
MyBatis PageHelper